Xquery - 这里有什么问题

时间:2013-07-12 15:18:36

标签: xquery sequence marklogic

我希望节点替换为$ 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(.)

5 个答案:

答案 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库可以派上用场。它基本上为你做了递归遍历的繁琐工作。但要注意,内存中更新不能扩展到大型文档,因为它需要制作副本才能进行更新。

https://github.com/marklogic/commons/tree/master/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的结果在同一事务中不可见。要查看结果,您需要开始新的交易。