gpt4 book ai didi

xpath - 如何在xpath中进行组捕获

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

我正在寻找 xpath 中可以做的事情://foo[@n="$1"]//bar[@n="$2"]这可以返回我$1$2 .或者至少把两个都还给我 <foo><bar>

这里有更多细节,我有一个xml文件:

<xml>
<foo>
<a n="1">
<b n="1"/>
<b n="2"/>
</a>
</foo>
<a n="2">
<b n="1"/>
</a>
<a n="3">
<b n="1"/>
<foo>
<b n="2"/>
</foo>
<b n="3"/>
</a>
</xml>

我想根据 <a> 中的 n 属性生成一个字符串和 <b>所以我有 xpath://a[@n]//b[@n]然后对于我返回的每个结果,我使用:./@n./ancestor::a/@n获取我想要的信息。

这工作正常,但我需要更智能的东西,因为我有很多这样的结构,并且需要自动生成 xpath。

所以对于上面的例子,我正在寻找一些像这样的 xpath://a[@n="$1"]//b[@n="$2"]然后回我:`(1, 1), (1, 2), (2, 1), (3, 1), (3, 2), (3, 3)

最佳答案

这是一个 XPath 1.0 表达式,它选择所有需要的 n 属性:

//a[.//b]/@n | //a//b/@n

在没有优化的情况下,上述表达式的计算执行至少两次完整的 XML 文档遍历。

这个 XPath 1.0 表达式可能更有效:

//*[self::a and .//b or self::b and ancestor::a]/@n

如果保证每个 a 都有一个 b 后代,那么这两个表达式都可以简化。

他们分别变成:

//a/@n | //a//b/@n

和:

//*[self::a or self::b and ancestor::a]/@n

如果保证每个 a 都有一个后代 b 并且每个 b 都有一个祖先 a:

//*[self::a or self::b]/@n

不可能在单个 XPath 1.0 表达式中获得所有需要的属性的字符串值。需要使用上述表达式之一获取所有属性,然后在每个选定属性上应用第二个 XPath 表达式:string()

在 Xpath 2.0 中,可以使用单个表达式获取所需属性的所有字符串值——只需在每个表达式后附加 /string(.)

例如,对于最简单的:

//(a|b)/@n/string(.)

更新:

OP 已经澄清了他的问题。现在我们知道他想要产生这个结果:

(1, 1), (1, 2), (2, 1), (3, 1), (3, 2), (3, 3)

不可能用单个 XPath 1.0 表达式产生想要的结果。

下面的 XPath 2.0 表达式产生了想要的结果:

for $a in //a[@n and .//b[@n]],
$b in $a//b[@n]
return
concat('(', $a/@n, ',', $b/@n, ') ')

关于xpath - 如何在xpath中进行组捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372160/

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