xquery";更新的内容为空";

xquery";更新的内容为空";,xquery,xquery-update,Xquery,Xquery Update,这是我第一次遇到Xquery(3.1)错误更新的内容是空的,在Google上搜索没有返回任何有用的内容 如果我运行这个简单的查询来识别嵌套的/tei:p/tei:p: for $x in $mycollection//tei:p/tei:p return $x 我得到的XML片段如下所示: <p xmlns="http://www.tei-c.org/ns/1.0"/> <p xmlns="http://www.tei-c.org/ns/1.0">Histoires q

这是我第一次遇到Xquery(3.1)错误
更新的内容是空的
,在Google上搜索没有返回任何有用的内容

如果我运行这个简单的查询来识别嵌套的
/tei:p/tei:p

for $x in $mycollection//tei:p/tei:p
return $x
我得到的XML片段如下所示:

<p xmlns="http://www.tei-c.org/ns/1.0"/>
<p xmlns="http://www.tei-c.org/ns/1.0">Histoires qui sont maintenant du passé (Konjaku monogatari shū). Traduction, introduction et
commentaires de Bernard Frank, Paris, Gallimard/UNESCO, 1987 [1re éd. 1968] (Connaissance de
l'Orient, Série japonaise, 17), p. 323. </p>
<p xmlns="http://www.tei-c.org/ns/1.0">Ed. Chavannes, Cinq cents contes et apologues extraits du Tripitaka chinois, Paris, t. 4,
1934, Notes complémentaires..., p. 147.</p>
<p xmlns="http://www.tei-c.org/ns/1.0"/>
<p xmlns="http://www.tei-c.org/ns/1.0">Ed. Chavannes, Cinq cents contes et apologues extraits du Tripitaka chinois, Paris, t. 4,
1934, Notes complémentaires..., p. 129.</p>
我不明白为了更正查询,错误试图告诉我什么

非常非常感谢

编辑:

我也尝试过这样做,用
self
轴替换
parent
,这导致了一个非常模糊的错误
exer:error node not found

for $x in $mycollection//tei:p/tei:p
let $y := $x/self::*
return update replace $x/parent::* with $y
解决方案:

for $x in $local:COLLECTIONS//tei:p/tei:p
return if ($x/(text()|*))
        then update replace $x with $x/(text()|*)
        else update delete $x

错误消息表明
$y
是一个空序列。以下描述了
replace
语句:

<text xmlns="http://www.tei-c.org/ns/1.0">
    <p>Hello</p>
    <p>Hello there</p>
    <p>Hello <p>there</p></p>
</text>
expr
返回的节点替换为
exprSingle
中的节点<代码>表达式必须计算为单个元素、属性或文本节点。如果是元素,
exprSingle
必须包含单个元素节点

在某些情况下,如上面的示例数据所示,
$y
将返回一个空序列-这将违反
expr
必须对单个元素求值的规则

要解决这种情况,可以添加一个条件表达式,其中包含一个空序列
()
else
子句或一个delete语句:

if ($y instance of element()) then 
    update replace $x with $y
else 
    update delete $x
如果您的目标不仅仅是解决错误,而是找到一个更直接的解决方案来替换“双嵌套”元素,例如:

<p><p>Mixed <hi>content</hi>.</p></p>
给定一个
$mycollection
,例如:

<text xmlns="http://www.tei-c.org/ns/1.0">
    <p>Hello</p>
    <p><p>Hello there</p></p>
    <p>Hello <p>there</p></p>
</text>

你好

你好

你好那里

查询将集合转换为如下所示:

<text xmlns="http://www.tei-c.org/ns/1.0">
    <p>Hello</p>
    <p>Hello there</p>
    <p>Hello <p>there</p></p>
</text>

你好

你好

你好那里


这是查询的预期结果,因为只有第二个
元素具有嵌套的
,可以干净地剥离。显然,如果您可以假设您的内容满足更简单的模式,那么您可以删除
和count(node())eq 1
条件。

我将第二个建议作为更新查询执行,但没有效果。我已经在我的帖子的编辑中发布了确切的查询。我以为
(text()|*)
检索了
/tei:p/tei:p
之后的任何可能节点。我看到您的帖子已编辑,但我不确定如何集成条件表达式。澄清:任何嵌套的
/tei:p/tei:p
之间都没有节点。
/tei:p/tei:p
后面可能有text+节点,也可能是空的。这就是我使用
(text()|*)
的原因。您的问题的一个不幸缺点是它不是完全独立的。它指的是不存在的数据。因此,试图回答问题的人很难预测所有问题。我建议调整你的方法。我已经发布了一个有效的解决方案。你的
if…then…else
想法促使我改变想法:替换或删除,而不是仅仅替换。希望这些回答对以后可能搜索错误的人有用。
delete
也发生在我身上-但我之前没有提到,因为从
text()|*
中不清楚您想要删除空的
元素。我现在明白了,当你提出
self::*
变体时,这就是你想要的。总的来说,我建议下次显示源数据的最小样本,包括(a)转换之前和(b)转换之后,+(c)您试图实现的目标,以及(d)您实际看到的内容。这个问题需要一些读心术!多花点时间来表达这个问题,这样没有您的数据的人可以看到足够的图片来帮助您。您是否知道EXPR return$x中$x的表达式
与表达式
EXPR
完全等效?是的,我这样发布它是因为我在原始代码中的
for
中有where语句,并将它们剥离出来进行调试。。。
<p>Mixed <hi>content</hi>.</p>
xquery version "3.1";

declare namespace tei="http://www.tei-c.org/ns/1.0";

for $x in $mycollection//tei:p[tei:p and count(node()) eq 1]
let $y := $x/tei:p
return
    update replace $x with $y
<text xmlns="http://www.tei-c.org/ns/1.0">
    <p>Hello</p>
    <p><p>Hello there</p></p>
    <p>Hello <p>there</p></p>
</text>
<text xmlns="http://www.tei-c.org/ns/1.0">
    <p>Hello</p>
    <p>Hello there</p>
    <p>Hello <p>there</p></p>
</text>