gpt4 book ai didi

XPath 1.0 属性轴 : no chance?

转载 作者:行者123 更新时间:2023-12-03 15:49:31 24 4
gpt4 key购买 nike

新手问题在这里:

给定以下 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 中是否可行?

最佳答案

的确,从一个属性到另一个属性没有单一轴,但当然你可以通过链接轴到达那里。

属性不被视为 sibling ,因为 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 中也没有定义该概念。

关于XPath 1.0 属性轴 : no chance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13647837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com