使用XQuery Update删除节点

时间:2010-09-23 23:36:43

标签: xml xpath xquery xquery-update

我正在尝试使用xquery从父节点中删除子节点。说,我的xml中有一个如下所示的条目:

 <entry>
        <id>36</id>
        <title>Engineering Village Author Tool</title>
        <updated>2009-09-30T12:55:42Z</updated>
        <libx:libapp>
          <libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>
        </libx:libapp>
      </entry>

如何删除子节点

<libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>

我正在使用以下xquery代码:

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed      as xs:anyAtomicType := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@libx:src=$child_id]

此处传递的变量值为: child_id = 37 parent_id = 36 doc_name =正在使用的文档的名称

我猜测使用命名空间的方式或我在xquery中使用的xpath表达式出现问题:

return delete node $parent_entry//libx:entry[@libx:src=$child_id]

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

您宣布$feed as xs:anyAtomicType,但您正在设置它并将其用作node()

我真的很惊讶查询编译。请尝试删除xs:anyAtomicType或将其替换为element()

此外,您只希望@src选择您的子节点,而不是@libx:src。所以

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@src=$child_id]

答案 1 :(得分:0)

不知道输出或错误是什么,我猜想$ parent_node没有正确设置;也就是说,查询$feed/atom:entry[atom:id=$parent_id]没有返回任何内容。我会尝试$feed/entry[id=$parent_id]来获得乐趣。另外,确保$ feed也正确设置,并尝试从declare variable $feed语句中删除“atom:”。

对于打印语句(可能是调试),这可能是您正在使用的数据库供应商特有的。如果您仍在使用BaseX,请从命令行运行此查询并为输出添加“-v”。现在我再次查看该代码,我想知道为什么我使用let $parent_entry...代替declare variable $parent_entry...

xquery是一种痛苦,不是吗?

-tjw