2013-03-12 55 views
0

我有一個從a.xml轉換爲b.xml的xquery文件。下面是我的x查詢的一個例子:在xquery中添加默認名稱空間

<TestMessage> 
    <Header> 
     <MessageType> 
      {for $x in doc("input.xml")//Test/NewHeader return 
     if ($x/MessageType/text() = "FIRST") then "FirstMessageType" 
     else "SecondMessageType" 
    } 
     </MessageType> 
    </Header> 
</TestMessage> 

這工作正常,並適當填充我的MessageType。但是我需要添加一個名稱空間作爲TestMessage元素的一個屬性。所以,當我這樣做時,

<TestMessage xmlns="http://www.testsource.com/TestMessage"> 
    <Header> 
     <MessageType> 
      {for $x in doc("input.xml")//Test/NewHeader return 
     if ($x/MessageType/text() = "FIRST") then "FirstMessageType" 
     else "SecondMessageType" 
    } 
     </MessageType> 
    </Header> 
</TestMessage> 

xquery結果有一個空的MessageType元素。除了在x-query文檔中添加命名空間之外,我沒有改變任何東西。但我不明白爲什麼這給了我一個錯誤的結果XML。

任何幫助將不勝感激。

非常感謝!

回答

1

將默認名稱空間添加到TestMessage元素時,該名稱空間也會應用於您在其下執行的XPath:doc("input.xml")//Test/NewHeader($x/MessageType/text()

如果內容沒有命名空間,那麼最容易做的事情是宣佈在XML根命名空間前綴:xmlns:test="http://www.testsource.com/TestMessage,和前綴的所有元素:<test:TestMessage xmlns:test="http://www.testsource.com/TestMessage><test:Header>等。要解決這個問題

的一種方法是執行沒有命名空間XQuery代碼默認命名空間中的XML之外:

declare function local:get-message-type() 
{ 
    for $x in doc("input.xml")//Test/NewHeader 
    return 
    if ($x/MessageType/text() = "FIRST") 
    then "FirstMessageType" 
    else "SecondMessageType" 
}; 

<TestMessage xmlns="http://www.testsource.com/TestMessage"> 
    <Header> 
     <MessageType> 
      { local:get-message-type() } 
     </MessageType> 
    </Header> 
</TestMessage> 
+0

但我的生成的XML的根元素應該看起來就像這樣:<的TestMessage的xmlns =「http://www.testsource.com/TestMessage」> – ridermule 2013-03-12 15:19:46

+0

除了演示文稿之外,使用默認命名空間或命名空間前綴生成的XML沒有區別。任何應用程序都會將它們視爲相同。但是,請參閱更新後的解決方案。 – wst 2013-03-12 15:30:07

+1

@wst是正確的。這在XQuery中被稱爲「名稱空間繼承」。有關詳情,請參閱http://docs.marklogic.com/guide/xquery/namespaces#id_49014。 – joewiz 2013-03-15 16:54:36

相關問題