我希望节点替换为$ person变量。我需要改变什么?
以下代码应将序列中人员的姓名更改为X.
declare function local:ChangeName($person)
{
xdmp:node-replace($person//Name/text, text { "X" } )
<p>{$person}</p>
};
let $b := <Person>
<Name>B</Name>
<IsAnnoying>No</IsAnnoying>
</Person>
let $j := <Person>
<Name>J</Name>
<IsAnnoying>No</IsAnnoying>
</Person>
let $people := ($b, $j)
return $people ! local:ChangeName(.)
答案 0 :(得分:5)
xdmp:node-replace()
仅对持久文档进行操作,而不是对内存中的文档进行操作。
您的local:ChangeName()
函数可以构造Person和Name元素,但复制 IsAnnoying 元素,如:
declare function local:ChangeName($person)
{
<p>
<Person>
<Name>X</Name>
{$person//IsAnnoying}
</Person>
</p>
};
对于更复杂的转换,请考虑递归类型切换或 XSLT 转换。
答案 1 :(得分:1)
正如Erik上面提到的,您无法将xdmp
更新函数应用于内存节点。如果您非常需要进行内存节点更新,Ryan Grimm的memupdate库可以派上用场。它基本上为你做了递归遍历的繁琐工作。但要注意,内存中更新不能扩展到大型文档,因为它需要制作副本才能进行更新。
答案 2 :(得分:0)
我没有运行ML实例,所以我无法测试它(可能还有更多问题),但必须是
$person//Name/text()
而不是
$person//Name/text
答案 3 :(得分:0)
Xpath:
$person//Name/text
应该是:
$person//Name/text()
XPath正在寻找替换不存在的文本节点。
答案 4 :(得分:0)
另请注意,xdmp:node-replace的结果在同一事务中不可见。要查看结果,您需要开始新的交易。