2011-09-07 26 views
3

我们如何工会或2的XPath之间执行的foreach simulatenouslyXSLT工会或执行的foreach 2个不同节点

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

我想通过这两个国家和国家循环和获取名称和ID。

回答

4

使用XPath联合操作|

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

这里选择都是State元素是XML文档的顶级元素的孩子的孩子们都State元素,也所有City元素它们是所有Cities元素的子元素,它们是XML文档顶部元素的子元素。

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

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

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

最后,这里是输出的任何CityState名和ID的彻底转变:

<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> 
:当这种转变是在所提供的XML文档应用

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

想要的,正确的结果产生

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