我有以下 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() > 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(使用前将#替换为@)