删除节点但通过XQuery将值保持不变

时间:2012-06-08 16:56:17

标签: xquery exist-db

我有一个如下建模的content.xml

<root>
  <childnode>
    Some text here
  </childnode>
</root>

我正在尝试删除<childnode>并仅使用其值更新content.xml 所以输出看起来像

<root>
  Some Text here
</root>

我编写了一个函数来执行此操作但是无论何时我运行它都会给出错误,因为“意外令牌:修改”。我想到了一种在不使用functx功能的情况下实现这一目标的方法。

xquery version "1.0";    

declare namespace request="http://exist-db.org/xquery/request";  
declare namespace file="http://exist-db.org/xquery/file";  
declare namespace system="http://exist-db.org/xquery/system";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace response="http://exist-db.org/xquery/response";

declare function local:contentUpdate()  {
    let $root := collection('/lib/repository/content')//root/childNode
    let $rmChild := for $child in $root
    modify
    (
    return rename node $child as ''
    )
};

local:updateTitle()

提前致谢

2 个答案:

答案 0 :(得分:0)

您的查询存在多个问题:

  1. 必须将更新功能声明为updating
  2. 您正在调用另一个函数而不是您定义的函数(可能您没有注意到,因为仍然存在语法错误)。
  3. Rename node期望某个元素(或处理指令,属性)作为目标,不允许使用空字符串。
  4. 在将代码定义为XQuery 1.0时,至少BaseX不允许更新语句。也许存在并不关心这一点,如果你需要知道,可以尝试添加它。
  5. 您不想重命名,但要将所有<childnode />替换为其内容,请使用replace node

    此代码修复了所有这些问题:

    declare updating function local:contentUpdate()  {
      let $root := collection('/lib/repository/content')
      return 
        for $i in $root//childnode
        return
          replace node $i with $i/data()
    };
    
    local:contentUpdate()
    

答案 1 :(得分:0)

eXist-db的XQuery Update语法记录在http://exist-db.org/exist/update_ext.xml。请注意,此语法早于XQuery Update Facility 1.0的发布,因此语法不同并且仍然是eXist-db的唯一选择。

在eXist-db中执行所需操作的方法如下:

xquery version "1.0";

declare function local:contentUpdate()  {
    let $root := doc('/db/lib/repository/content/content.xml')/root
    return
        update value $root with $root/string()
};

local:contentUpdate()

与原始代码相比,主要更改为:

  1. 为您的更新插入了eXist-db语法
  2. 将前缀“/db”添加到您的集合名称中,因为/ db是eXist-db中数据库的根目录;用collection()调用替换doc()调用,因为您声明您在单个文件上运行,content.xml
  3. //root更改为/root,因为“root”是根元素,因此//(后代或自我)轴无关紧要
  4. updateTitle()替换为函数的实际名称contentUpdate
  5. 删除了无关的命名空间声明
  6. 有关我使用$root/string()的原因的详情,请参阅http://community.marklogic.com/blog/text-is-a-code-smell