gpt4 book ai didi

xml - 在 XQuery 中,如何根据给定谓词递归过滤后代?

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

鉴于此 XML 片段:

<root> <!-- $root points here -->
<!-- ... -->
<A visible="true">
<B visible="false">
<C visible="true"/> <!-- but effectively false! -->
</B>
<D visible="true">
<E visible="true" />
<F visible="false" />
</D>
</A>
<!-- ... -->
</root>

运行查询 $root//A 会得到 A 及其所有后代。到目前为止一切顺利。

我想要的是通过谓词过滤 A 的后代,比如 [@visible=true]。我希望查询返回

  <A visible="true">
<D visible="true">
<E visible="true" />
</D>
</A>

相反,即。过滤掉所有与谓词不匹配(或其父元素不匹配)的子元素。

想像一个用 XML 描述的 GUI 系统,在呈现它时我会在其中过滤可见元素的树。

我认为这对于 XSLT 来说是微不足道的,但我一定会使用 XQuery。

最佳答案

它也可以在 XQuery 中轻松完成。只要有一个函数递归地重写合格的节点,同时应用过滤器:

declare function local:rewrite($node as node()) as node()?
{
typeswitch ($node)
case element() return
if (local:filter($node)) then
element {node-name($node)}
{
$node/@*,
for $child in $node/node() return local:rewrite($child)
}
else
()
default return
$node
};

declare function local:filter($node as element()) as xs:boolean
{
$node/@visible
};

然后使用路径表达式选择 A 并将函数应用于结果:

for $a in $root//A return local:rewrite($a)

该函数采用通用模式,使用 XQuery 来处理所谓的 XSLT 任务。事实上,我认为这样做也是非常可以接受的。就我而言,我很欣赏不必在这里留下 XQuery 符号的好处...

关于xml - 在 XQuery 中,如何根据给定谓词递归过滤后代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917389/

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