0

我有一个从 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。

任何帮助将不胜感激。

多谢!

4

1 回答 1

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>
于 2013-03-12T15:06:54.817 回答