私は XML クラスにいて、次のコード行があります..
<xsl:value-of select="count(//@qty)" />
qty 属性の前の「//」の目的は何ですか? それは何を指定しますか?
//
の略です/descendant-or-self::node()/
ただし、一部の式では、descendant:: と同じように動作しますが、同じではありません。たとえば、質問の表現では
descendant::@qty
単一のステップで子孫軸と属性軸の両方を使用できないため、構文エラーになります。
/descendant-or-self::node()/@qty
一方、法的な表現です。
もう 1 つの注目すべき違いは//*[1]
、親の最初の子であるすべての要素を選択することです。一方/descendant::*[1]
、ドキュメントの最初の要素を選択します。
ここで、//
はdescendant::
軸に相当するため、コンテキスト ノードの子孫であるすべての @qty 値を返します。つまり、この場合、コンテキストが指定されていないため、ドキュメントのすべての値を返す必要があります。
その場合.//
、コンテキストは現在のノードになり、出力はドキュメントではなく、そのノードからのすべての子孫になります。
更新Davidが正しく指摘しているように、これら2つの式は厳密には同等ではなく、質問に対して機能的に同等です。彼は以下の微妙な点に注目しています。ただし、技術的には次のようになりますが、次のことが//
わかると思いdescendant-or-self::node()
ます。
//x == //descendant-or-self::node()/x
次の理由によりdescendant::
、使用時に期待するのは理にかなっています。//
<x/>//* => ()
<x/>/descendant-or-self::* => <x/>
選択するものがなければ、単純に使用することはできません//
。//
したがって、実際にあなたにその役割を与えることができる状況はありません-or-self
。
/a/b// => {error}
//
に展開される「マクロ」です。
/descendant-or-self::node()/
スラッシュを含む。つまりfoo//bar
、 とまったく同じ xpath 式であり、現在のノードの任意の要素の子の子孫であるfoo/descendant-or-self::node()/bar
すべての要素を選択します (それ自体が含まれているため、ビットです)。bar
foo
x/descendant-or-self::node()
x
or-self