我在XML类中并拥有以下代码行。
<xsl:value-of select="count(//@qty)" />
qty属性之前“//”的目的是什么?它指的是什么?
答案 0 :(得分:4)
//
是/descendant-or-self::node()/
虽然在某些表达式中它的行为类似于后代::它不一样。例如,在问题中的表达式
descendant::@qty
会出现语法错误,因为您不能在一个步骤中同时拥有后代和属性轴。
/descendant-or-self::node()/@qty
另一方面,是一种法律表达。
另一个显着的区别是//*[1]
,它选择了作为其父级的第一个子元素的每个元素。而/descendant::*[1]
选择文档中的第一个元素。
答案 1 :(得分:2)
这里,//
相当于descendant::
轴,因此它将返回作为上下文节点后代的所有@qty值。即:在这种情况下,没有给出上下文,因此它应该返回文档的所有值。
如果您有.//
,则上下文将是当前节点,输出将是该节点的所有后代,而不是文档。
更新正如David正确指出的那样,这两个表达式并不完全等效,只是功能上等同于您的问题。他注意到下面的微妙之处。但是,我想您会发现尽管技术上//
确实等同于descendant-or-self::node()
:
//x == //descendant-or-self::node()/x
在使用descendant::
时期望//
是有道理的,因为:
<x/>//* => ()
<x/>/descendant-or-self::* => <x/>
并且你不能简单地使用//
而无需选择。因此,//
实际上无法为您提供-or-self
部分。
/a/b// => {error}
答案 2 :(得分:1)
//
是一个“宏”,可以扩展为
/descendant-or-self::node()/
包括斜杠。换句话说,foo//bar
与foo/descendant-or-self::node()/bar
完全相同的xpath表达式,并选择所有bar
元素作为当前节点的任何foo
元素子元素的后代(因为{{ 1}}包含x/descendant-or-self::node()
本身 - 即x
位。