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))返される要素の数が実際の一意の要素の数と一致するかどうかを確認するために使用できます。実際、一致しています。

4

2 に答える 2

1

http://www.xsltfunctions.com/xsl/functx_distinct-deep.htmlを使用します(これはhttp://www.xsltfunctions.com/xsl/functx_is-node-in-sequence-deep-equal.htmlを使用しますturnは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))]"/>
于 2013-03-19T12:41:28.450 に答える
0

これは実際にはXPath2.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>
于 2013-03-20T04:18:58.767 に答える