我想检查文档中是否有内联样式表,但我不确定如何选择元素的后代属性,因为“style”属性可以附加到body元素中的任何元素。这是我写的当前xpath:
descendant::@*[self::@style]
但解析器抛出错误说:“意外的令牌”@“轴名后”。任何人都可以告诉我如何解决它或有另一种方法这样做?谢谢!
答案 0 :(得分:3)
因此,您正在寻找文档中任何具有@style
属性的元素。
如果您想要包含您想要的属性的元素如下:
descendant::*[@style]
这将返回当前节点具有@style
属性的所有后代元素。如果您想要属性本身,最好使用以下内容:
descendant::*[@style]/@style
那将找到你自己的所有风格属性。
答案 1 :(得分:2)
使用此XPath://@style
,它将选择所有属性style
答案 2 :(得分:0)
@Kirill给出了关于如何修复的正确答案
descendant::@*[self::@style]
使用
//@style
但对于那些想知道为什么的人来说,初始XPath不起作用,以及是否有使用self::
的变体可以工作......
请记住,@
是attribute::
轴的缩写。因此self::@foo
是self::attribute::foo
的简写。但从语法上讲,位置步骤中只能有一个轴。这就是解析器拒绝self::@style
的原因:它有两个轴。
这里还有其他有趣的东西。您可能认为可以按如下方式修复表达式:
//@*[self::style]
(暂时忽略这一事实//@style
不必要地变得更加复杂。当你想要除 style
之外的所有属性时,你就开始尝试这样的表达式,例如{ {1}}。)
此表达式解析并运行且没有错误。第一部分//@*[not(self::style)]
匹配文档中的所有属性节点。你可能会认为(正如我所做的)谓词//@*
只要其上下文节点是[self::style]
属性就会评估为真值。
但我们错了。如果我们尝试它,我们将得到一个空的节点集。为什么?如果上下文节点是属性节点,并且style
轴仅包含上下文节点,并且属性的名称与self::
之后的名称匹配,则谓词中的表达式不应该产生该属性节点作为结果?
在p。 XSLT 2.0和XPath 2.0(第4版)中的1228,Self Axis的术语表定义解释:
自轴的主节点种类是元素,这意味着 当上下文节点是属性时,轴的步骤 表单
self::
或self::*
不会选择该属性[粗体强调我的]。
但是,在XPath 2.0中,您可以使用self::xyz
。即您可以使用KindTest而不是NameTest。
Michael Kay详细介绍了有关哪些节点可以通过p上的NameTest匹配的规则。 695。