Как посчитать узел xml внутри элемента xml, используя xslt - PullRequest
1 голос
/ 25 августа 2010

Я использую XSLT для генерации моего HTML.

У меня ниже xml, и я хочу написать условие, если в узле страны есть только один городской узел. Я хочу написать какое-то условие, см. Ниже xml.

Есть два xmls.

1) Destination.xml

    <?xml version="1.0"?>
    <list type="Destinations">
    <resources location="include/xml/locations.xml">
    <publication>232</publication>
    </resources>
    <destination id="594904" title="Maldives" url="/destinations_offers/destinations/asiapacific/maldives/maldives.aspx" thumbnail="/99/english/images/square_tcm481-594879.jpg" FeaturedDestination="true">        
    <city id="192513" />
    </destination>
    <destination id="594089" title="New Delhi" url="/destinations_offers/destinations/asiapacific/india/newdelhi.aspx" thumbnail="/99/english/images/sydney_tcm481-594346.jpg" FeaturedDestination="true" NewestDestination="true">        
    <city id="192460" />
    </destination>
    </list>

Для примера В приведенном выше xml есть city id = 192513 для Мальдивских островов, и это единственный узел в location.xml, это будет проверено в следующих местоположениях location.xml, и если этот идентификатор один в этом узле страны, тогда мне нужно вызвать конкретный состояние.

<?xml version="1.0"?>
<list type="Locations">
<region id="192393" code="ASIA" name="Asia &amp; the Pacific" shortname="Asia &amp; the Pacific">
<country id="192395" code="AU" name="Australia" shortname="Australia">
<city id="192397" code="BNE" name="Brisbane" shortname="Brisbane">
<airport id="192399" code="BNE" name="Brisbane International Airport" shortname="Brisbane"></airport>
</city>
<city id="192409" code="SYD" name="Sydney" shortname="Sydney">
<airport id="192411" code="SYD" name="Kingsford Smith Airport" shortname="Sydney"></airport>
</city>
</country>
<country id="192511" code="MV" name="Maldives" shortname="Maldives">
<city id="192513" code="MLE" name="Male" shortname="Male">
<airport id="192515" code="MLE" name="Male International Airport" shortname="Male"></airport>
</city>
</country>
</region>
</list>

Пожалуйста, предложите!

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

Использование :

count($vLocations/*/*/country[city[@id = $vDestCity/@id]]/city) = 1

В этом выражении $vLocations - это XML-документ с верхним элементом <list type="Locations">, а $ vDestCity - это элемент <city>, который нас интересует изXML-документ с верхним элементом <list type="Destinations">

Чтобы увидеть это в действии :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:locations>
    <list type="Locations">
        <region id="192393" code="ASIA" 
                name="Asia &amp; the Pacific" 
                shortname="Asia &amp; the Pacific">
            <country id="192395" code="AU" name="Australia"
                               shortname="Australia">
                <city id="192397" code="BNE" name="Brisbane"
                                   shortname="Brisbane">
                    <airport id="192399" code="BNE"
                                          name="Brisbane International Airport"
                                          shortname="Brisbane">
                                        </airport>
                </city>
                <city id="192409" code="SYD" name="Sydney" 
                                   shortname="Sydney">
                    <airport id="192411" code="SYD"
                                         name="Kingsford Smith Airport"
                                         shortname="Sydney">
                                        </airport>
                </city>
            </country>
            <country id="192511" code="MV" name="Maldives"
                                shortname="Maldives">
                <city id="192513" code="MLE" name="Male"
                                     shortname="Male">
                    <airport id="192515" code="MLE" 
                                          name="Male International Airport"
                                          shortname="Male">
                                        </airport>
                </city>
            </country>
        </region>
    </list>
 </my:locations>

 <xsl:variable name="vLocations"
  select="document('')/*/my:locations"/>

 <xsl:variable name="vDestCity1"
    select="/*/destination/city[@id=192513]"/>

 <xsl:variable name="vDestCity2"
    select="/*/destination/city[@id=192397]"/>

 <xsl:template match="/">
   <xsl:value-of select=
    "count($vLocations/*/*/country
                [city[@id = $vDestCity1/@id]]/city
           ) = 1
    "/>
    :
<xsl:text/>
   <xsl:value-of select=
    "count($vLocations/*/*/country
                [city[@id = $vDestCity2/@id]]/city
           ) = 1
    "/>

 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному адресаты.xml:

<list type="Destinations">
    <resources location="include/xml/locations.xml">
        <publication>232</publication>
    </resources>
    <destination id="594904" title="Maldives" url="/destinations_offers/destinations/asiapacific/maldives/maldives.aspx" thumbnail="/99/english/images/square_tcm481-594879.jpg" FeaturedDestination="true">
        <city id="192513" />
    </destination>
    <destination id="594089" title="New Delhi" url="/destinations_offers/destinations/asiapacific/india/newdelhi.aspx" thumbnail="/99/english/images/sydney_tcm481-594346.jpg" FeaturedDestination="true" NewestDestination="true">
        <city id="192460" />
    </destination>
</list>

Требуется правильный результат :

true
    :
false
0 голосов
/ 25 августа 2010

например, Австралия: количество (// страна [@ id = '192395'] / город)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...