最近、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()
。