5

私は XML クラスにいて、次のコード行があります..

<xsl:value-of select="count(//@qty)" />

qty 属性の前の「//」の目的は何ですか? それは何を指定しますか?

4

3 に答える 3

4

// の略です/descendant-or-self::node()/

ただし、一部の式では、descendant:: と同じように動作しますが、同じではありません。たとえば、質問の表現では

descendant::@qty

単一のステップで子孫軸と属性軸の両方を使用できないため、構文エラーになります。

/descendant-or-self::node()/@qty

一方、法的な表現です。

もう 1 つの注目すべき違いは//*[1]、親の最初の子であるすべての要素を選択することです。一方/descendant::*[1]、ドキュメントの最初の要素を選択します。

于 2012-12-10T20:51:10.190 に答える
2

ここで、//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}
于 2012-12-10T20:04:14.923 に答える
1

//に展開される「マクロ」です。

/descendant-or-self::node()/

スラッシュを含む。つまりfoo//bar、 とまったく同じ xpath 式であり、現在のノードの任意の要素の子の子孫であるfoo/descendant-or-self::node()/barすべての要素を選択します (それ自体が含まれているため、ビットです)。barfoox/descendant-or-self::node()xor-self

于 2012-12-10T20:51:25.140 に答える