2

我正在尝试使用 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]

请帮我解决这个问题。

4

2 回答 2

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]
于 2010-09-24T06:45:23.237 回答
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

于 2010-09-24T02:22:05.587 回答