【问题标题】:How to maintain a global list to uniquely loop in XSLT如何维护一个全局列表以在 XSLT 中唯一循环
【发布时间】:2012-09-09 20:14:39
【问题描述】:

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

数据.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 项根据它们的组属性属于同一组,所以我只需要打印其中任何一个的组名。

【问题讨论】:

  • 我认为&lt;xsl:key&gt; 方法不能跨文档工作,但也许这就是答案的一部分。
  • @cbeer 如果我将属性放在单个文件中,可以做些什么吗?例如

标签: xml xslt loops


【解决方案1】:
<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>

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

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多