2014-04-29 68 views
2

我試圖創建XQuery代碼,它構造一個名稱空間的xml元素並將其從現有(非名稱空間)元素插入到其中。以下代碼是一個簡化的例子:使用包含的XPath表達式構造名稱空間Xml

xquery version "1.0-ml"; 

let $xml := <wrapper><elem>textIWant</elem></wrapper> 
return <newElem xmlns="http://www.blah.org">{$xml/elem/text()}</newElem> 

代替產生所需的輸出:

<newElem xmlns="http://www.blah.org">textIWant</newElem> 

它產生這樣的:

<newElem xmlns="http://www.blah.org"/> 

此代碼,但是,工作原理:

xquery version "1.0-ml"; 

let $xml := <wrapper><elem>textIWant</elem></wrapper> 
let $elemText := $xml/elem/text() 
return <newElem xmlns="http://www.blah.org">{$elemText}</newElem> 

使用其他形式的xml構造(element(){...})也可以正常工作。這個問題似乎只在正在構建的xml被賦予命名空間時發生。第一個代碼片段有什麼問題?

+0

我編輯了自己的冠軍。請參閱「[應該在標題中是否包含」標籤「](http://meta.stackoverflow.com/questions/19190/)」,其中共識是「不,他們不應該」。 –

回答

4

通過xmlns僞屬性提供名稱空間可更改嵌套XQuery作用域中的默認元素名稱空間。您可以通過使用空間前綴解決這個問題,

declare namespace ns = "http://www.blah.org"; 
let $xml := <wrapper><elem>textIWant</elem></wrapper> 
return <ns:newElem>{ $xml/elem/text() }</ns:newElem> 

或使用「任何命名空間」 XPath語法:

$xml/*:elem/text() 
+0

這是完全正確的。經驗法則:如果代碼看起來是正確的,特別是如果它在一個上下文中運行而不是另一個上下文,並且你沒有得到任何結果,那麼它可能是命名空間。 –

相關問題