我正在尝试使用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]
请帮我解决这个问题。
答案 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