【问题标题】:Finding unique nodes with xslt使用 xslt 查找唯一节点
【发布时间】:2010-02-04 21:36:21
【问题描述】:

我有一个 xml 文档,其中包含一些带有 id 的“项目”元素。我想列出唯一的项目 ID。但 Item 元素不在列表中 - 它们可以位于 xml 文档中的任何深度 - 例如:


<Node>
  <Node>
    <Item id="1"/>
    <Item id="2"/>
  </Node>
  <Node>
    <Item id="1"/>
    <Node>
      <Item id="3"/>
    </Node>
  </Node>
  <Item id="2"/>
</Node>

我想要输出 1,2,3(或类似的表示)。如果这可以用单个 xpath 完成,那就更好了!

我已经看到了兄弟元素列表的例子,但没有看到一般的 xml 树结构。我也仅限于使用 xslt 1.0 方法。谢谢!

【问题讨论】:

    标签: xslt xpath unique


    【解决方案1】:

    使用单个 XPath 表达式选择所有唯一项(没有索引,注意性能问题):

    //Item[not(@id = preceding::Item/@id)]
    

    【讨论】:

      【解决方案2】:

      试试这个(使用Muenchian grouping):

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:key name="item-id" match="Item" use="@id" />
          <xsl:template match="/Node">
              <xsl:for-each select="//Item[count(. | key('item-id', @id)[1]) = 1]">
                  <xsl:value-of select="@id" />,
              </xsl:for-each>
          </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

      • //Item[generate-id() = generate-id(key('item-id', @id)[1]))] 更简洁,耗时更少。
      • 有趣,我不知道,你!
      【解决方案3】:

      不确定这是不是你的意思,但以防万一。

      在html中

      <xsl:apply-templates select="item"/>
      

      模板。

       <xsl:template match="id">
              <p>
              <xsl:value-of select="@id"/> - 
              <xsl:value-of select="."/> 
              </p>
          </xsl:template>
      

      【讨论】:

      • 那行不通,因为你没有id 元素; OP 希望显示唯一的 @id 值
      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多