如何使用xslt来计算xml元素中的xml节点

问题描述:

我正在使用XSLT来生成我的HTML。如何使用xslt来计算xml元素中的xml节点

我有下面的XML,我想写条件,如果只有一个国家节点内的城市节点我想写一些条件,请参阅下面的XML。

有两个xml。

1)destinations.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> 

对于eample在上述XML有city id = 192513马尔代夫并且在locations.xml单独节点,这将在下面locations.xml检查中,如果该ID是单独在那个国家节点那么我需要调用特定的条件。

<?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> 

请建议!

谢谢。

+0

好qyestion (+1)。请参阅我的答案,了解简短的单行XPath解决方案。 – 2010-08-25 13:05:13

使用

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> 

当这种转变是在提供 destinations.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 

例如澳大利亚:计数(//国家[@ ID = '192395'] /地点)