gpt4 book ai didi

xml - XPath 表达式

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:37 25 4
gpt4 key购买 nike

我有一个这样的 XML 文件:

<lib:library>    
<lib:book> XML </lib:book>
<lib:book> XPath </lib:book>
<lib:book> XSLT </lib:book>
<lib:book> Java </lib:book>
<lib:book> C++ </lib:book>
</lib:library>

我想去看书 [2]...我当然可以做类似//lib:Book[2] 的事情...而且它有效。可能会发生在同一个 XML 文件中,例如,相同的标签名称但不同的 namespace ;在这种情况下,我的 XPath 表达式不起作用...

我可以替换它:

//*[local-name() = "book"]

此表达式返回 XML 文件中包含的所有书籍...但是如果我想获取数字 [2] 怎么办...我应该如何重写添加有关数字的条件的 XPath 表达式?当然我不想考虑 namespace ,它必须对每个使用的 namespace 都有效。

谢谢卢卡

最佳答案

当前选择的答案是错误的

其实//someExpression[2]可以选择很多节点。

例如,如果我们有以下 XML 文档:

<lib:library xmlns:lib="UNDEFINED!!!">
<topic name="XML">
<lib:book> XML </lib:book>
</topic>
<topic name="XPath">
<lib:book> XPath </lib:book>
</topic>
<topic name="XSLT">
<lib:book> XSLT1 </lib:book>
<lib:book> XSLT2 </lib:book>
</topic>
<topic name="Imperative PLs">
<lib:book> Java </lib:book>
<lib:book> C++ </lib:book>
</topic>
</lib:library>

当表达:

   //*[local-name() = "book"][2]

根据上面的文档进行评估,选择了两个节点(它们都不是文档中具有所需属性的第二个节点):

<lib:book xmlns:lib="UNDEFINED!!!"> XSLT2 </lib:book>
<lib:book xmlns:lib="UNDEFINED!!!"> C++ </lib:book>

解决方案:在整个文档中选择第 N(比如第 2 个)节点(比如 lib:book)的一种方法是:

   (//*[local-name() = "book"])[2]

当在上面的文档上计算这个表达式时,选择了正确的单个节点:

<lib:book xmlns:lib="UNDEFINED!!!"> XPath </lib:book>

说明:如 W3C XPath recommendations中所定义:

// is short for /descendant-or-self::node()/

因此:

//someName[2]

是以下内容的简写:

/descendant-or-self::node()/someName[2]

这会选择文档中名为 someName 且是其父元素的第二个 someName 子元素的任何元素。

换句话说,[] 运算符比 // 伪运算符绑定(bind)更强(具有更高的优先级)。这就是为什么我们需要括号来覆盖默认的运算符优先级。

关于xml - XPath 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7397401/

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