如何检查属性是否位于元素中?

时间:2011-08-12 10:23:20

标签: xml xpath schematron

我想检查文档中是否有内联样式表,但我不确定如何选择元素的后代属性,因为“style”属性可以附加到body元素中的任何元素。这是我写的当前xpath:

descendant::@*[self::@style]

但解析器抛出错误说:“意外的令牌”@“轴名后”。任何人都可以告诉我如何解决它或有另一种方法这样做?谢谢!

3 个答案:

答案 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::@fooself::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。