1

我希望节点替换作用于 $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(.)
4

5 回答 5

5

xdmp:node-replace()仅对持久化文档进行操作,而不对内存中的文档进行操作。

您的local:ChangeName()函数可以构造 Person 和 Name 元素,但复制IsAnnoying元素,如下所示:

declare function local:ChangeName($person)
{
  <p>
  <Person>
  <Name>X</Name>
  {$person//IsAnnoying}
  </Person>
  </p>
};

对于更复杂的转换,请考虑递归类型切换或XSLT转换。

于 2013-07-12T17:42:25.290 回答
1

正如 Erik 上面提到的,您不能将xdmp更新函数应用于内存节点。如果您强烈需要进行内存中节点更新,Ryan Grimm 的memupdate库可以派上用场。它基本上为您完成了递归遍历的繁重工作。但请注意,内存中的更新无法扩展到大型文档,因为它需要制作副本才能进行更新。

https://github.com/marklogic/commons/tree/master/memupdate

于 2013-08-11T11:51:14.147 回答
0

我没有运行 ML 实例,所以我无法测试它(可能还有更多问题),但它必须是

$person//Name/text()

代替

$person//Name/text
于 2013-07-12T15:30:26.050 回答
0

Xpath:

$person//Name/text 

应该:

$person//Name/text()

XPath 正在寻找替换不存在的文本节点。

于 2013-07-12T15:34:23.330 回答
0

另请注意,xdmp:node-replace 的结果在同一事务中将不可见。要查看结果,您需要开始一个新事务。

于 2013-07-12T16:32:41.753 回答