0

子と属性が異なっていても、同じ名前のノードの最初の出現をすべて返す必要があります。

例えば

<Data>
  <A>
    <X randomattr="1"/>
    <Y randomattr="1"/>
    <Z/>
  </A>
  <B>
    <X/>
    <X randomattr="3"/>
    <Z/>
  </B>
</Data>

次の名前が繰り返されるため、最初のX、Y、Zの3つのノードを返す必要があります。X要素の1つにrandomattrがない場合でも、別の要素の値が異なる場合でもかまいません。

name()からのdistinct-valuesは必要ありません。ノード全体を返したいのですが、何かのようなもの

/Data/*/*[distinct-values(name())]

また、ダブルループですべてのノードを横断できることも知っていますが、簡単なワンライナーやこのための関数、またはdistinct [1]のような特別なXpath構文があるかどうかを自問しています。ありがとうございます!

4

2 に答える 2

0

これがあなたが探しているものだと思います。いくつかの簡単なテストで動作しました:

  • (Xpath 2.0)/Data/*/*[not((preceding-sibling::*/name(.)=name(.)) or (../preceding-sibling::*/*/name(.)=name(.)))]
  • (Xpath 1.0)/Data/*/*[not((name(preceding-sibling::*)=name(.)) or (name(../preceding-sibling::*/*)=name(.)))]

あらゆる深さで機能させるように要求した後...私はあなたのスキーマに精通していませんが、例から、あなたが探しているノードは最下位レベルのノードであると想定しています。以下では、子孫軸を使用して、名前のチェック中に子のないノードを検索します。

  • /Data/descendant::*[not(name() = preceding::*[not(child::*)]/name())][not(child::*)]
于 2012-07-16T19:10:52.360 に答える
0

私はいつでも間違った質問を受け入れますが、彼から学んだことから別の可能性に答え、AXES でいくつかの調査を行った後、私が学んだことを学びました。

/Data/*/*[not(name() = preceding::*[name(../..)='Data']/name())]

( First name() は、次の構文で self::*/name() にすることもできます)

これは、リーフレベルが深い場合に指数関数的に複雑にならないため、どのようなコンテキストでも、私が考えるより簡単で最良の行です。[name(../..)='Data'] のような「from-root」兄弟に一致するように前例の条件を変更するか、この階層レベルのすべてのノードを定義する条件、または先行する::name_node (それらがすべて共有する場合)同じqname

于 2012-07-17T09:37:11.440 に答える