在xquery中添加默认命名空间

时间:2013-03-12 14:59:31

标签: xquery

我有一个从a.xml转换为b.xml的xquery文件。下面是我的x查询示例:

<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 个答案:

答案 0 :(得分: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>等等。

解决此问题的一种方法是在默认命名空间的XML之外执行无命名空间的XQuery代码:

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>