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]它选择了作为其父元素的第一个子元素的每个元素。而/descendant::*[1]选择文档中的第一个元素。

于 2012-12-10T20:51:10.190 回答
2

这里,//descendant::轴的等价物,因此它将返回作为上下文节点后代的所有@qty 值。即:在这种情况下,没有给出上下文,因此它应该返回文档的所有值。

如果有,.//那么上下文将是当前节点,输出将是该节点的所有后代,而不是文档。

更新正如大卫正确指出的那样,这两个表达式并不严格等同,只是在功能上等同于您的问题。他注意到下面的微妙之处。但是,我认为您会发现,尽管在技术上//确实等同于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,并选择作为当前节点bar的任何元素子元素的后代的所有元素(因为包括自身 - 这就是位)。foox/descendant-or-self::node()xor-self

于 2012-12-10T20:51:25.140 回答