2013-03-19 4 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>가 제거되었습니다.

Saxon 9.1.0.8을 사용하여 distinct-value($S)을 시도했지만 반환 유형은 xs:anyAtomicType이며 적절한 순서로 캐스팅하는 방법을 모르겠습니다 (가능한 경우).

그러나 count(distinct-value($S))을 사용하여 반환되는 요소의 수가 실제 고유 요소 수와 일치하는지 확인하고 실제로 일치하는지 확인할 수 있습니다. 당신이 <xsl:variable name="distinct-seq" select="functx:distinct-deep($your-sequence)"/>을 사용할 수 있습니다 (차례 차례로 XSLT/XPath는 2.0 기능 deep-equal를 사용 http://www.xsltfunctions.com/xsl/functx_is-node-in-sequence-deep-equal.html 사용) http://www.xsltfunctions.com/xsl/functx_distinct-deep.html를 사용

답변

1

.

또는 당신이 원하는하지 않거나이 실제로는 XPath 2.0 질문

<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

감사합니다 ... 그것은 작동합니다. –

0

에 해당 코드를 사용해야 할 것 functx 라이브러리를 포함 할 수 없습니다.

사용 :

for $vN in /*/* 
    return 
     $vN[not(/*/*[. >> $vN and deep-equal(., $vN)])] 

XSLT 2.0 - 대조 :이 변환은 다음과 같은 XML 문서 (a로 싸서 제공 단편에 도포

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

단일 최상위 요소) :

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