gpt4 book ai didi

XQuery 不插入子节点

转载 作者:行者123 更新时间:2023-12-02 00:02:27 25 4
gpt4 key购买 nike

下面是 XML 结构。它是我的原始结构的样本,不是精确的。

<Docs>
<Doc>
<Para>
<P n="1"><B>Constants : T</B>he value of pi is 3.14</P>
<P n="2">pi is a geometric term.</P>
</Para>
</Doc>
<Doc>
<Para>
<P n="1"><B>Constants : T</B>he value of g is 9.81 m/sqr of sec</P>
<P n="2">g is a acceleration due to gravity.</P>
</Para>
</Doc>
<Doc>
<Para>
<P n="1"><B>Constants : T</B>he value of c is 3.00 x 10 power 8 m/sec</P>
<P n="2">c is a speed of light in vacuum.</P>
</Para>
</Doc>
</Docs>

我已经以编程方式生成了 XML 文件。 B节点有数据 Constant : T , 它应该只有 Constants : .我已经编写了一个 XQuery 来进行必要的更改,但它没有按预期工作。

下面是 XQuery - 版本 1

for $x in doc('doc1')//Doc
where $x/Para/P[@n="1"]/B/text()="Constants : T"

return
let $p := $x/Para/P[@n="1"]
let $pText := concat("T", $p/text())
let $tag := <P n="1">{$pText}</P>

return
(
delete node $p,
insert node $tag as first into $x/Para,
insert node <B>Constants :</B> as first into $x/Para/P[@n="1"]
)

版本 - 2(更小、更甜但不起作用!!!)

let $b := <B> Constants :</B>
for $x in doc('doc1')//Doc/Para[P[@n="1"]/B/text()="Constants : T"]/P[@n="1"]

return
(
replace value of node $x with concat("T", $x/text()),
insert node $b/node() as first into $x
)

两个查询都没有插入 <B>Constants : </B> .有人可以帮我解决这个问题吗?

最佳答案

您面临的问题与 XQuery 更新的性质有关。它使用挂起的更新列表并在查询结束时应用所有更新。更新操作的顺序定义明确,因此独立于您在更新语句中给出的顺序。在 https://docs.basex.org/wiki/Updates#Pending_Update_List 查看更多信息.

因此,在您的情况下,insertreplace 之前应用,因此您实际上是在替换刚刚插入的节点,从而覆盖此更改。

要解决这个问题,我将只替换文本值并替换 B 节点。因此,您的两个操作都是相互独立的,并且可以毫无问题地更改它们的执行顺序。

let $b := <B> Constants :</B>
for $x in doc('doc1')//Doc/Para[P[@n="1"]/B/text()="Constants : T"]/P[@n="1"]

return
(
replace value of node $x/text() with concat("T", $x/text()),
replace node $x/B with $b
)

关于XQuery 不插入子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20464100/

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