2013-07-12 38 views
1

我想节点替换操作$ person变量。我需要改变什么?Xquery - 这里出什么问题

下面的代码应该改变人的名字的顺序为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

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

local:ChangeName()功能,可以构建人与名称的元素,但复制IsAnnoying元素,如:

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

对于更复杂的转换,考虑递归typeswitch或XSLT转换

0

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

$person//Name/text() 

,而不是

$person//Name/text 
0

中的XPath:

$person//Name/text 

应该是:

$person//Name/text() 

的XPath是寻找替代文本节点,它不存在。

0

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

+0

请你能帮我一下这个语法吗? – Ben

1

正如Erik在上面指出的,您不能将xdmp更新函数应用于内存中节点。如果您非常需要进行内存节点更新,Ryan Grimm的库可以派上用场。它基本上为你做了递归遍历的繁琐工作。但请注意,内存更新不会扩展到大型文档,因为它需要复制才能进行更新。

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