假设我有以下顺序:
<node-1> <children-A attr="100" /> </node-1>
<node-1> <children-A attr="200" /> </node-1> <!--not a duplicate -->
<node-1> <children-B /> </node-1>
<node-1> <children-B /> </node-1> <!-- duplicate off the above -->
<node-1> <children-A /> <children-B /> </node-1> <!--not a duplicate -->
我想获得所有唯一的“node-1”,以便输出为:
<node-1> <children-A attr="100" /> </node-1>
<node-1> <children-A attr="200" /> </node-1>
<node-1> <children-B /> </node-1>
<node-1> <children-A /> <children-B /> </node-1>
注意:仅删除了<node-1> <children-B /> </node-1>
。
使用Saxon 9.1.0.8,我尝试了distinct-value($S)
,但返回类型为xs:anyAtomicType
,我不知道如何将其转换为正确的序列(如果可能的话!)。
但是,我可以使用count(distinct-value($S))
来检查返回的元素数是否与实际的唯一元素数相匹配,实际上它确实匹配。
答案 0 :(得分:1)
使用http://www.xsltfunctions.com/xsl/functx_distinct-deep.html(反过来使用http://www.xsltfunctions.com/xsl/functx_is-node-in-sequence-deep-equal.html反过来使用XSLT / XPath 2.0函数deep-equal
),您可以使用<xsl:variable name="distinct-seq" select="functx:distinct-deep($your-sequence)"/>
。
或者,如果您不想或不能包含functx库,则需要在
中使用其代码<xsl:variable name="distinct-seq"
select="for $pos in (1 to count($your-sequence))
return $your-sequence[$pos]
[not(some $node in $your-sequence[position() lt $pos] satisfies deep-equal(., $node))]"/>
答案 1 :(得分:0)
这实际上是一个XPath 2.0问题。
使用强>:
for $vN in /*/*
return
$vN[not(/*/*[. >> $vN and deep-equal(., $vN)])]
基于XSLT 2.0的验证:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:sequence select=
"for $vN in /*/*
return
$vN[not(/*/*[. >> $vN and deep-equal(., $vN)])]
"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(提供的片段包装到单个顶部元素中):
<t>
<node-1> <children-A attr="100" /> </node-1>
<node-1> <children-A attr="200" /> </node-1>
<node-1> <children-B /> </node-1>
<node-1> <children-B /> </node-1>
<node-1> <children-A /> <children-B /> </node-1>
</t>
产生了想要的正确结果:
<node-1>
<children-A attr="100"/>
</node-1>
<node-1>
<children-A attr="200"/>
</node-1>
<node-1>
<children-B/>
</node-1>
<node-1>
<children-A/>
<children-B/>
</node-1>