我有一个如下建模的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()
提前致谢
答案 0 :(得分:0)
您的查询存在多个问题:
updating
。Rename node
期望某个元素(或处理指令,属性)作为目标,不允许使用空字符串。您不想重命名,但要将所有<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()
与原始代码相比,主要更改为:
/db
”添加到您的集合名称中,因为/ db是eXist-db中数据库的根目录;用collection()
调用替换doc()
调用,因为您声明您在单个文件上运行,content.xml //root
更改为/root
,因为“root”是根元素,因此//
(后代或自我)轴无关紧要updateTitle()
替换为函数的实际名称contentUpdate 有关我使用$root/string()
的原因的详情,请参阅http://community.marklogic.com/blog/text-is-a-code-smell。