xslt中两个正斜杠的目的是什么? “//”

时间:2012-12-10 20:00:16

标签: xml xslt

我在XML类中并拥有以下代码行。

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

qty属性之前“//”的目的是什么?它指的是什么?

3 个答案:

答案 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//barfoo/descendant-or-self::node()/bar完全相同的xpath表达式,并选择所有bar元素作为当前节点的任何foo元素子元素的后代(因为{{ 1}}包含x/descendant-or-self::node()本身 - 即x位。