如何维护一个全局列表以在XSLT中唯一循环

时间:2012-09-17 15:12:54

标签: xml xslt loops

我需要过滤一些重复的节点(在一个键上)的操作 以下是我的数据文件。

data.xml中

<root>
    <node name="item1" />
    <node name="item2" />
    <node name="item3" />
    <node name="item4" />
</root>

在文件item1.xml

<item>
 <group>A</group>
</item>

item2.xml

<item>
 <group>B</group>
</item>

item3.xml

<item>
 <group>B</group>
</item>

item4.xml

<item>
 <group>D</group>
</item>

XSLT文件

<xsl:for-each select="/root/node">
     <xsl:variable name="itemName"   select="@name"/>
     <xsl:variable name="groupName"  select="document($itemName)/item/group"/>
     <xsl:value-of select="concat('Group ',$groupName)"/>
</xsl:for-each>   

输出

  

A组   B组   B组   C组

期望的输出

  

A组   B组   C组

此处第2项和第3项根据其组属性属于同一组,因此我只需要打印其中任何一个的组名。

1 个答案:

答案 0 :(得分:0)

<root>
    <node name="item1" group="A"/>
    <node name="item2" group="B"/>
</root>

如果组名本身可以某种方式作为属性放在主XML文件中,则可以按如下方式找到不同的节点

   <xsl:for-each select="/root/node[not(@group = preceding-sibling::node/@group)]">
   </xsl:for-each>

上面的select表达式将忽略之前遇到的任何节点(属于前面的一个节点)

PS:这不是涉及多个XML文件的问题的解决方案。该行中的任何答案都是有用的。