使用 xslt 查找唯一节点

发布于 2024-08-20 02:22:12 字数 496 浏览 5 评论 0原文

我有一个 xml 文档,其中包含一些带有 id 的“Item”元素。我想制作一个唯一项目 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 方法。谢谢!

I have an xml document that contains some "Item" elements with ids. I want to make a list of the unique Item ids. The Item elements are not in a list though - they can be at any depth within the xml document - for example:


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

I would like the output 1,2,3 (or a similar representation). If this can be done with a single xpath then even better!

I have seen examples of this for lists of sibling elements, but not for a general xml tree structure. I'm also restricted to using xslt 1.0 methods. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

机场等船 2024-08-27 02:22:12

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

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

Selecting all unique items with a single XPath expression (without indexing, beware of performance issues):

//Item[not(@id = preceding::Item/@id)]
々眼睛长脚气 2024-08-27 02:22:12

试试这个(使用 慕尼黑分组):

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

Try this (using 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>
树深时见影 2024-08-27 02:22:12

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

在 html

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

模板中。

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

Not sure if this is what you mean, but just in case.

In the html

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

The template.

 <xsl:template match="id">
        <p>
        <xsl:value-of select="@id"/> - 
        <xsl:value-of select="."/> 
        </p>
    </xsl:template>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文