2013-03-19 61 views
1

假設我有以下順序:如何刪除基於子女的重複節點?

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

我想獲得的所有獨特的「節點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>已被刪除。

使用撒克遜9.1.0.8,我試過distinct-value($S)但返回類型是xs:anyAtomicType,我不知道如何將它轉換爲正確的序列(如果這甚至是可能的!)。

但是,我可以使用count(distinct-value($S))來檢查返回的元素數是否與唯一元素的實際數量匹配,並且實際上它匹配。

回答

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)"/>

或者,如果你不想或者不能包括你需要使用它的代碼在

<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))]"/> 
+0

謝謝...它的工作原理。 – 2013-03-19 15:22:14

0

這實際上是一個XPath 2.0問題functx庫。

使用

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>