2011-04-08 5 views
0

Я пытаюсь выяснить, как использовать несколько шаблонов на основе атрибутов на более низких уровнях XML-документа. Пример:Соответствие переменной xslt по XML

<World> 
<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron"/> 
     <City value="Lexington"/> 
     <City value="Owensboro"/> 
     <City value="Jonesville"/> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati"/> 
     <City value="Columbus"/> 
     <City value="Cleveland"/> 
     <City value="Jonesville"/> 
    </State> 
    <State value="IN"> 
     <City value="Indianapolis"/> 
    </State> 
</Country> 
</World> 
<World> 
<Country value="Russia"> 
    <State value="Estonia"> 
     <City value="Tallinn"/> 
     <City value="Dorpat"/> 
     <City value="Owensboro"/> 
    </State> 
    <State value="Ukraine"> 
     <City value="Kiev"/> 
     <City value="Sevastopol"/> 
     <City value="Slavutych"/> 
     <City value="Jonesville"/> 
    </State> 
</Country> 
</World> 

Я собираюсь получить экземпляры XML документов, как будут либо Страна = США или Россия, но я не знаю. Я хочу применить единый XSLT, который позволит любой стране и копировать различные города в результате.

, если его США, например, вывод будет выглядеть так:

<World> 
<Country value="USA"> 
<State value="KY"> 
    <City value="Hebron" /> 
</State> 
<State value="OH"> 
     <City value="Cincinnati" /> 
     <City value="Jonesville" /> 
</State> 
</Country> 
</World> 

, если его Россия:

<World> 
<Country value="Russia"> 
<State value="Estonia"> 
    <City value="Dorpat" /> 
    <City value="Owensboro" /> 
</State> 
<State value="Ukraine"> 
     <City value="Keiv" /> 
     <City value="Sevastopol" /> 
     <City value="Slavutych" /> 
</State> 
</Country> 
</World> 

Также обратите внимание, что можно хотеть город в одном государстве, но не еще (т.е. OH против KY, Jonesville).

Я могу получить одну страну для работы, но я не понимаю, как заставить шаблоны сопоставлять разные атрибуты. Есть идеи?

+0

Трудно сказать, что именно вы ищете. Каковы критерии, которые вы хотите применить при выборе городов для копирования на ваш выход? – Jollymorphic

+0

Он будет определен посредством набора параметров в XSLT. каждый клиент может войти и изменить их на другую ценность города. –

+0

@Matt A: Полный ответ зависит от того, какие данные вы используете для этой фильтрации. В другой руке это точно так же, как ваш прежний [вопрос] (http://stackoverflow.com/questions/5585372/use-xslt-to-pare-down-xml-output). –

ответ

0

следующая таблица стилей выполняет некоторые основные проверки/фильтрации:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:my="my"> 
    <my:vals> 
     <v v="USA|KY|Hebron" /> 
     <v v="USA|OH|Cincinnati" /> 
     <v v="USA|OH|Jonesville" /> 
     <v v="Russia|Estonia|Dorpat" /> 
     <v v="Russia|Estonia|Owensboro" /> 
     <v v="Russia|Ukraine|Kiev" /> 
     <v v="Russia|Ukraine|Sevastopol" /> 
     <v v="Russia|Ukraine|Slavutych" /> 
    </my:vals> 
    <xsl:variable name="vals" select="document('')/*/my:vals/*" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="World"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|Country[State/City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]]" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Country"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|State[City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]]" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="State"> 
     <xsl:copy> 
      <xsl:apply-templates 
       select="@*|City[ 
        concat(../../@value, '|', ../@value, '|', @value)=$vals/@v]" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

на этом входе:

<World> 
    <Country value="USA"> 
     <State value="KY"> 
      <City value="Hebron" /> 
      <City value="Lexington" /> 
      <City value="Owensboro" /> 
      <City value="Jonesville" /> 
     </State> 
     <State value="OH"> 
      <City value="Cincinnati" /> 
      <City value="Columbus" /> 
      <City value="Cleveland" /> 
      <City value="Jonesville" /> 
     </State> 
     <State value="IN"> 
      <City value="Indianapolis" /> 
     </State> 
    </Country> 
    <Country value="Russia"> 
     <State value="Estonia"> 
      <City value="Tallinn" /> 
      <City value="Dorpat" /> 
      <City value="Owensboro" /> 
     </State> 
     <State value="Ukraine"> 
      <City value="Kiev" /> 
      <City value="Sevastopol" /> 
      <City value="Slavutych" /> 
      <City value="Jonesville" /> 
     </State> 
    </Country> 
</World> 

Производит:

<World> 
    <Country value="USA"> 
     <State value="KY"> 
      <City value="Hebron" /> 
     </State> 
     <State value="OH"> 
      <City value="Cincinnati" /> 
      <City value="Jonesville" /> 
     </State> 
    </Country> 
    <Country value="Russia"> 
     <State value="Estonia"> 
      <City value="Dorpat" /> 
      <City value="Owensboro" /> 
     </State> 
     <State value="Ukraine"> 
      <City value="Kiev" /> 
      <City value="Sevastopol" /> 
      <City value="Slavutych" /> 
     </State> 
    </Country> 
</World> 

Объяснение: Мы только ввести Country элементы, которые содержат действительный State и City комбинацию; только State элементов, которые содержат действительный City; и, тогда, действительны только City элементов. Все недопустимые или пустые элементы удаляются.

+0

+1 Правильный ответ. Мне нравится фиксированный путь, но для простоты вы можете использовать ''. Только копировать элементы, имеющие потомок «Город», соответствующий критериям. –

0

На основании вашего комментария, что ваш пользователь укажет желаемые города с помощью каких-либо параметрических критериев, я думаю, вы сделали бы что-то вроде следующего (обратите внимание на псевдокод «SATISFIES CRITERIA», так как я точно не знаю, какие критерии город @value должен удовлетворять):

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <template match="/World"> 
     <copy> 
     <apply-templates select="Country[ State/City[ @value SATISFIES CRITERIA ] ]" /> 
     </copy> 
    </template> 

    <template match="Country|State|@*"> 
     <copy> 
     <apply-templates select="*|@*" /> 
     </copy> 
    </template> 

    <template match="City[ @value SATISFIES CRITERIA ]"> 
     <copy> 
     <apply-templates select="@*" /> 
     </copy> 
    </template> 
</stylesheet> 
Смежные вопросы