【问题标题】:XPath 1.0 attribute axes: no chance?XPath 1.0 属性轴:没有机会?
【发布时间】:2012-11-18 19:52:57
【问题描述】:

这里是初学者的问题:

鉴于以下 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 是否可以做到这一点?

【问题讨论】:

  • 除了示例(“从 child3 到 child2”)之外,您能否从概念上解释您的要求?如果概念要求是“选择上一个属性”,那么不,这是不可能的,因为这个概念在 XML 中没有很好地定义。

标签: xpath attributes axes


【解决方案1】:

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

属性不被视为兄弟,因为they are not considered 'children' of the parent element,在 XPath 使用的数据模型中。这就是preceding-sibling:: 不起作用的原因之一。这也意味着child1child2 等属性名称具有误导性,因为属性不是“子”。

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

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

../@child2

"父元素名为child2的属性"

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

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

你甚至可以尝试

../@*[2]

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

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

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

【讨论】:

  • 感谢您详尽的回答,LarsH。我生成了一个 XML 文件,我想将一些属性转换为 HTML,其顺序与它们在 XML 文件中出现的顺序完全相同。处理有点复杂,所以需要知道一个属性是否是第一个。您通过引用给定元素的属性顺序未定义这一事实澄清了这一点。由于我完全拥有 XML 文件这一事实,我将更改生成器以便使用元素而不是属性。这将解决我的问题。
  • @Karel:非常好的决定。当 XML 文件中的事物顺序很重要时,您确实需要使用元素而不是属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多