gpt4 book ai didi

XPath 3.0 递归查询

转载 作者:行者123 更新时间:2023-12-03 16:08:44 24 4
gpt4 key购买 nike

我有一些具有类似继承语义的 XML 数据,并且我想进行一个考虑继承的查询。我知道这在 XPath 1.0 中是不可能的,但我相信在 XPath 3.0 中是可能的,但我对 3.0 不熟悉。

所以我有一个像这样的结构:

<elems>
<elem id="n">
<property name="xxx" value="yyy"/>
...
</elem>
</elems>

不是,名称为 inherits 的属性指向@id另一个<elem> 。所以,基本上,我想查询 @id <elem>的具有(或不具有)属性 Z,无论该属性是在其自身上还是在通过 inherits 链接的任何元素上。属性(property)。例如:

<elems>
<elem id="1">
<property name="a" value="alpha"/>
</elem>
<elem id="2">
<property name="inherits" value="1"/>
<property name="b" value="bravo"/>
</elem>
<elem id="3">
<property name="inherits" value="2"/>
<property name="c" value="charlie"/>
</elem>
</elems>

因此查询具有属性 c 的元素将返回3 ,其反向将返回 12 。查询具有属性 b 的元素将返回23其反向将返回 1 。最后,调用具有属性 a 的元素将返回1 , 23 ,并且它的反向不会返回任何内容。

我该怎么做?

最佳答案

您正在寻找的本质上是传递闭包,这是最常见的递归查询类型;基本上,XPath 不能进行递归查询,除非内置祖先轴和后代轴的特殊情况。

XPath 3.0 允许您定义函数,但由于它们是匿名的,因此它们无法(轻松)调用自身。

“(轻松)”是因为有一个转义子句:显然 Y 组合器可以让你克服这个限制。例如,参见What is a Y-combinator? 。但我从来没有真正理解它们,也永远不会在现实生活中尝试这样做,因为有一个更简单的解决方案:在 XQuery 或 XSLT 中使用命名函数,这使得递归非常简单。事实上在XSLT 3.0中你甚至不需要递归,你可以使用xsl:iterate .

关于XPath 3.0 递归查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50978572/

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