我有一个从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。
非常感谢任何帮助。
非常感谢!
答案 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>