2013-07-12 41 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