Xquery-这里出了什么问题

Xquery-这里出了什么问题,xquery,sequence,marklogic,Xquery,Sequence,Marklogic,我希望节点replace对$person变量起作用。我需要改变什么 下面的代码应将序列中的人员名称更改为X declare function local:ChangeName($person) { xdmp:node-replace($person//Name/text, text { "X" } ) <p>{$person}</p> }; let $b := <Person> <Name>B</Name>

我希望节点replace对$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(.)

我没有一个ML实例在运行,所以我无法测试它,也许还有更多的问题,但必须这样

$person//Name/text()
而不是

$person//Name/text

我没有一个ML实例在运行,所以我无法测试它,也许还有更多的问题,但必须这样

$person//Name/text()
而不是

$person//Name/text
Xpath:

$person//Name/text 
应该是:

$person//Name/text()
XPath正试图替换不存在的文本节点。

XPath:

$person//Name/text 
应该是:

$person//Name/text()

XPath希望替换不存在的文本节点。

还请注意,xdmp:node replace的结果在同一事务中不可见。要查看结果,您需要启动一个新事务。

还要注意,xdmp:node replace的结果在同一事务中不可见。要查看结果,您需要启动一个新事务。

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

declare function local:ChangeName($person)
{
  <p>
  <Person>
  <Name>X</Name>
  {$person//IsAnnoying}
  </Person>
  </p>
};
< >对于更复杂的转换,考虑递归类型SwiteSwitter或XSLT转换。

XDMP:节点替换只对持久文档进行操作,而不在内存文档上操作。 您的local:ChangeName函数可以构造Person和Name元素,但可以复制IsAnnoying元素,如中所示:

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

< >对于更复杂的转换,考虑递归类型SwiteSwitter或XSLT转换。

< P>如上面提到的埃里克,您不能将XDMP更新函数应用到内存节点中。如果您有强烈的内存节点更新需求,Ryan Grimm的库可以派上用场。它基本上为您完成递归遍历的繁重工作。但请注意,内存中的更新不会扩展到大型文档,因为它需要制作一个副本来进行更新


如上所述,您不能将xdmp更新函数应用于内存中的节点。如果您有强烈的内存节点更新需求,Ryan Grimm的库可以派上用场。它基本上为您完成递归遍历的繁重工作。但请注意,内存中的更新不会扩展到大型文档,因为它需要制作一个副本来进行更新


你能帮我解释一下这个的语法吗?