5

最近、HTML ドキュメントのノードで XQuery を評価する必要がありました。基本的に、body 要素の最初の子から href 属性を持つすべての要素を選択する必要がありました。説明するために少し例を追加しました。

<html>
    <body>
        <a href="http://www.google.be"/>
    </body>
</html>

この場合、望ましい抽出結果は明らかに次のとおりです。

<a href="http://www.google.be"/>

私の最初のアイデアは、次の//body/*[1]//*[@href]理由で使用することでした。

  • //bodyどこにいても body 要素に一致します
  • /*[1]body 要素の最初の子に一致します
  • //*[@href]現在の要素のすべての子孫または自分自身に一致します

私はそれがうまくいくと考えましたが、提供された例では、XQuery は結果を返しません。

ただし、少し読んだところ、次のことがわかりました (ソース: http://www.keller.com/xslt/8/ ):

Alternate notation for "//": descendant-or-self::node()

そこで、XQuery を に変更したところ//body/*[1]/descendant-or-self::node()[@href]、今回は正しい結果が得られました。

私の質問: // と descendant-or-self::node() の違いは何ですか? ここで見つけたもの ( xpath の //node と /descendant::node の違いは何ですか? ) とここ ( http://www.w3.org/TR/xpath/#axes ) は次のように述べています。

//の略です/descendant-or-self::node()/。たとえば、//paraは の略です/descendant-or-self::node()/child::para

//これにより、と は交換可能ではないと結論付けられ/descendant-or-self::node()ます (おそらく、最後に終了/するためですか?) /descendant-or-self::node()

4

2 に答える 2

1

問題はあなたの説明にあると思いますが、あなたの例と一致していないようです!

入力が与えられた場合:

<html>
    <body>
        <a href="http://www.google.be"/>
    </body>
</html>

および要件ステートメント:

「body要素の最初の子からhref属性を持つすべての要素」

次の XPath 式:

//body/*[1]//*[@href]

要件ステートメントと一致します。しかし、予想される出力は、あなたが見つけたのとまったく同じように空のシーケンスになります...そしてあなたが提案した出力ではありません:

<a href="http://www.google.be"/>

提案された出力を取得するには、XPath 要件ステートメントはおそらく次のようになります。

「href 属性を持つ body 要素の最初の子」、これは XPath につながります:

//*[@href][parent::body][1]

要件ステートメントと一致しない例から、あなたが何を意味しているのかを正確に確認するのは困難です。したがって、おそらくあなたの要件ステートメントは次のとおりです。

「href 属性を持つ本文の最初の要素」

その場合は、XPath をお勧めします。

($input//*[@href][ancestor::body])[1]

シーケンス コンストラクター、つまり '(' と ')' は、配列と同様の方法で選択した各子孫をアドレス指定できるように、子孫シーケンスを平坦化することに注意してください。

于 2014-01-21T00:20:57.803 に答える