0

这是我第一次遇到 Xquery (3.1) 错误Content for update is empty,并且在 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>

即一些与text()和其他empty

我正在尝试“去重复” /tei:p/tei:p,但以下尝试返回相同的上述错误:

for $x in $mycollection//tei:p/tei:p
return update replace $x with $x/(text()|*)


for $x in $mycollection//tei:p/tei:p
let $y := $x/(text()|*)
return update replace $x with $y

我不明白错误试图告诉我什么以更正查询。

非常感谢。

编辑:

for $x in $mycollection//tei:p[tei:p and count(node()) eq 1]
let $y := $x/tei:p
return update replace $x with $y

我也试过这个,用parent轴代替self,这导致了一个非常模棱两可的错误exerr: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
4

1 回答 1

1

错误消息表明这$y是一个空序列。XQuery 更新文档对语句的描述如下replace

update replace expr with exprSingle

将返回的节点替换为 中expr的节点exprSingleexpr必须计算为单个元素、属性或文本节点。如果是元素,则exprSingle必须包含单个元素节点...

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

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

if ($y instance of element()) then 
    update replace $x with $y
else 
    update delete $x

如果您的目标不仅仅是解决错误,而是要找到更直接的解决方案来替换“双嵌套”元素,例如:

<p><p>Mixed <hi>content</hi>.</p></p>

.... 和:

<p>Mixed <hi>content</hi>.</p>

...我建议使用此查询,它注意不要无意中删除可能以某种方式滑入两个嵌套<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

给定一个$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>

这是查询的预期结果,因为只有第二个元素具有可以干净剥离<p>的嵌套。<p>显然,如果您可以假设您的内容符合更简单的模式,则可以删除该and count(node()) eq 1条件。

于 2019-09-04T20:12:53.927 回答