我在一个 XML 类中,并且有以下代码行..
<xsl:value-of select="count(//@qty)" />
qty 属性前的“//”有什么作用?它指定什么?
//
简称/descendant-or-self::node()/
尽管在某些表达式中它的行为类似于 descendant:: 但并不相同。例如在问题的表达中
descendant::@qty
将是一个语法错误,因为您不能在一个步骤中同时拥有后代轴和属性轴。
/descendant-or-self::node()/@qty
另一方面是法律表达。
另一个显着的区别是//*[1]
它选择了作为其父元素的第一个子元素的每个元素。而/descendant::*[1]
选择文档中的第一个元素。
这里,//
是descendant::
轴的等价物,因此它将返回作为上下文节点后代的所有@qty 值。即:在这种情况下,没有给出上下文,因此它应该返回文档的所有值。
如果有,.//
那么上下文将是当前节点,输出将是该节点的所有后代,而不是文档。
更新正如大卫正确指出的那样,这两个表达式并不严格等同,只是在功能上等同于您的问题。他注意到下面的微妙之处。但是,我认为您会发现,尽管在技术上//
确实等同于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