在Xpath 2.0中获取当前节点的父节点的父节点

14

我似乎总是在xpath轴表达式上遇到麻烦...

在一些表达式中,我使用../来引用父节点,但是对于test表达式来说这样做无效吗?或者我的语法有问题?

<xsl:when test="../../[@status='current']">

我的目标是在父元素的父元素具有值为“current”的状态属性时,在xsl:when内应用一个属性。

编辑: self::parent/parent[@status='current'] 是一个有效的XPath表达式,可能是我想要的,有人能确认一下吗?我可能没有做到足够远。

4个回答

13
问题出在/[。你可以将其更改为
../../self::*[@status='current']

1
这样做就可以了。你能否详细解释一下我的误解?据我所知,../../选择父级的父级,然后[@status]对该元素的状态属性进行测试。 - meder omuraliev
@meder:/用于分隔步骤,因此不能出现在谓词([...]部分)之前。 - choroba
1
对的,这个元素不是 [],而是 *([] 只是解释了 * 元素必须具有的属性和值)。 - stommepoes

7
比choroba和Hansen提供的方法更简单的解决方案是:
../..[@status='current']

我发誓我尝试过这个,如果我的记忆没错的话,它失败了,因为表达不当,但在我的脑海中逻辑上是可行的。 - meder omuraliev
同意,这是最直接的方法。使用XSLT/XPath 1.0,oXygen报告以下验证错误:E [Saxon6.5.5] Error in expression ../..[@status='current']: Unexpected token [ beyond end of expression,但实际执行转换时仍然有效。作为XSLT/XPath 2.0,可以正常验证。 - Mads Hansen
1
我记得XPath 1.0不允许在“.”后面使用谓词,但我忘了它也不允许在“..”后面使用。这是一个完全无意义的限制,在2.0中被取消了。在1.0中,将“..”替换为“parent::node()”。 - Michael Kay

6
您也可以使用以下方法:
parent::*/parent::*[@status='current']

太好了。太遗憾了,PHP 数组做不到这一点。 - CommaToast

3

Xpath 2.0:

 ../../@status eq 'current'

使用XPath 1.0和XPath 2.0:

 ../../@status = 'current'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接