使用包含的XPath表达式构造Namespaced Xml

时间:2014-04-29 01:42:04

标签: xml xpath xquery marklogic

我正在尝试创建构造命名空间的xml元素的XQuery代码,并将现有(非命名空间)元素中的文本插入其中。以下代码是一个简化示例:

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被赋予命名空间时才会出现这个问题。第一个代码段有什么问题?

1 个答案:

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

或使用“any namespace”XPath语法:

$xml/*:elem/text()