3

初学者的问题在这里:

给定以下 XML 摘录:

<root>
  <element>
    <child1>a</child1><child2>b</child2><child3>c</child3>
  </element>
</root>

当我在child3上下文中时,我可以使用它preceding-sibling::*来获取child2节点。好的。

在以下 XML 摘录中:

<root>
  <element child1="a" child2="b" child3="c">
  </element>
</root>

当我在child3上下文中时,XPath 1.0 中没有轴来获取child2属性节点是否正确?我想我需要这样的东西preceding-sibling-attribute::是不可用的。

作为一个附带问题,这对 XPath 2 是否可行?

4

1 回答 1

4

确实没有单一的轴可以从一个属性到另一个属性,但是您当然可以通过链接轴来实现。

在 XPath 使用的数据模型中,属性不被视为兄弟,因为它们不被视为父元素的“子元素” 。preceding-sibling::这是行不通的原因之一。这也意味着属性名称(例如child1child2)具有误导性,因为属性不是“子”。

另一个preceding-sibling::不起作用的原因是给定元素的属性顺序是未定义的(依赖于实现)。属性必须在给定的序列化中以某种顺序列出(例如在文件中),但该文件可能会被解析并以不同的顺序再次输出属性,并且它仍将被视为来自 XML 信息模型点的相同文档观点。因此,XML 中不存在“previous”或“preceding”属性。

要从child2属性的上下文中获取child3属性的值,您可以使用其中之一,具体取决于您如何知道所需的属性...

../@child2

child2“父元素命名的属性”

../@*[name() != name(current())]

“父元素的其他属性(不是这个)”

你甚至可以尝试

../@*[2]

但结果通常无法预测,因为属性的顺序是不确定的。

如果属性名称包括您的示例中的索引组件 (1, 2, 3),您可以将其中的数字替换name(current())为较小的数字。

要回答您的附带问题,这取决于您的要求是如何定义的。如果要求是“选择前一个属性”,那么不,XPath 2 中也没有定义该概念。

于 2012-11-30T15:57:55.270 回答