1

我有一个 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()

提前致谢

4

2 回答 2

0

eXist-db 的 XQuery 更新语法记录在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”是根元素,所以//(descendant-or-self) 轴是无关的
  4. 替换updateTitle()为函数的实际名称 contentUpdate
  5. 删除了无关的命名空间声明

有关我为什么使用的更多信息$root/string(),请参阅http://community.marklogic.com/blog/text-is-a-code-smell

于 2012-06-09T15:21:13.500 回答
0

您的查询存在多个问题:

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

您不想重命名,而是将所有<childnode />s 替换为其内容,使用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()
于 2012-06-08T17:54:32.783 回答