XSLT联合或执行2个不同节点的foreach

时间:2011-09-07 20:05:52

标签: xslt

我们如何在2 xpath之间同时联合或执行foreach

<Country>
<States>
    <State>
        <name>1</name>
        <id>California</id>
    </State>
    <State>
        <name>2</name>
        <id>Texas</id>
    </State>
    <State>
        <name>3</name>
        <id>New York</id>
    </State>
</States>
<Cities>
    <City>
        <name>3</name>
        <id>SFO</id>
    </City>
    <City>
        <name>4</name>
        <id>SAN DIEGO</id>
    </City>
    <City>
        <name>5</name>
        <id>ORLANDO</id>
    </City>
</Cities>

我想遍历国家和州,并获取姓名和身份。

1 个答案:

答案 0 :(得分:4)

使用XPath联合运算符|

/*/States/State | /*/Cities/City

这会选择所有State个元素,这些元素是所有State个元素的子元素,这些元素是XML文档的顶级元素的子元素,也是所有City元素的子元素它是作为XML文档顶部元素的子元素的所有Cities元素的子元素。

在XSLT中,可以指定一个匹配多个节点类型的模板,再次使用... XPath union('|')运算符作为匹配模式的一部分:

<xsl:template match=""City | State">

此模板规则与任何CityState元素匹配。

最后,这是一个完整的转换,输出任何CityState的名称和ID:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="City | State">
     <xsl:copy-of select="*"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<Country>
    <States>
        <State>
            <name>1</name>
            <id>California</id>
        </State>
        <State>
            <name>2</name>
            <id>Texas</id>
        </State>
        <State>
            <name>3</name>
            <id>New York</id>
        </State>
    </States>
    <Cities>
        <City>
            <name>3</name>
            <id>SFO</id>
        </City>
        <City>
            <name>4</name>
            <id>SAN DIEGO</id>
        </City>
        <City>
            <name>5</name>
            <id>ORLANDO</id>
        </City>
    </Cities>
</Country>

产生了想要的正确结果

<name>1</name>
<id>California</id>
<name>2</name>
<id>Texas</id>
<name>3</name>
<id>New York</id>
<name>3</name>
<id>SFO</id>
<name>4</name>
<id>SAN DIEGO</id>
<name>5</name>
<id>ORLANDO</id>