如何找到具有相同子节点的节点

2024-01-05

我有以下 xml。请注意,节点 n1 和 n3 具有相同的子节点(顺序可以不同)。如何编写 XSL 转换来识别此类节点?

<Document>
    <Node name="n1">
        <Item value="v1">
        <Item value="v2">
        <Item value="v3">
    </Node>
    <Node name="n2">
        <Item value="p1">
        <Item value="p2">
        <Item value="p3">
    </Node>
    <Node name="n3">
        <Item value="v3">
        <Item value="v1">
        <Item value="v2">
    </Node>
</Document>

下面是使用 XSLT 1.0 的尝试:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:param name="sep" select="' '"/>

  <xsl:output indent="yes"/>

  <xsl:template match="Node">
    <Node name="{@name}">
      <xsl:attribute name="matches">
        <xsl:apply-templates 
          select="../Node[not(generate-id() = generate-id(current()))]
                         [count(Item) = count(current()/Item)]
                         [not(Item[not(@value = current()/Item/@value)])]"
           mode="check"/>
      </xsl:attribute>
    </Node>
  </xsl:template>

  <xsl:template match="Node" mode="check">
    <xsl:if test="position() &gt; 1">
      <xsl:value-of select="$sep"/>
    </xsl:if>
    <xsl:value-of select="@name"/>
  </xsl:template>

</xsl:stylesheet>

针对示例输入使用 Saxon 6.5.5 运行样式表时

<Document>
    <Node name="n1">
        <Item value="v1"/>
        <Item value="v2"/>
        <Item value="v3"/>
    </Node>
    <Node name="n2">
        <Item value="p1"/>
        <Item value="p2"/>
        <Item value="p3"/>
    </Node>
    <Node name="n3">
        <Item value="v3"/>
        <Item value="v1"/>
        <Item value="v2"/>
    </Node>
    <Node name="n4">
        <Item value="p3"/>
        <Item value="v1"/>
        <Item value="v2"/>
    </Node>
    <Node name="n5">
        <Item value="v2"/>
        <Item value="v1"/>
        <Item value="v3"/>
    </Node> 
    <Node name="n6">
        <Item value="v2"/>
        <Item value="v1"/>
        <Item value="v3"/>
        <Item value="v4"/>
    </Node> 
    <Node name="n7">
        <Item value="v1"/>
        <Item value="v1"/>
        <Item value="v2"/>
        <Item value="v3"/>
        <Item value="v4"/>
    </Node> 
</Document>

我得到以下结果:

<Node name="n1" matches="n3 n5"/>

<Node name="n2" matches=""/>

<Node name="n3" matches="n1 n5"/>

<Node name="n4" matches=""/>

<Node name="n5" matches="n1 n3"/>

<Node name="n6" matches=""/>

<Node name="n7" matches=""/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到具有相同子节点的节点 的相关文章

随机推荐