使用包含的XPath表达式构造命名空间Xml

使用包含的XPath表达式构造命名空间Xml,xml,xpath,xquery,marklogic,Xml,Xpath,Xquery,Marklogic,我试图创建XQuery代码,它构造一个有名称空间的xml元素,并将现有(无名称空间)元素的文本插入其中。以下代码是一个简化示例: xquery version "1.0-ml"; let $xml := <wrapper><elem>textIWant</elem></wrapper> return <newElem xmlns="http://www.blah.org">{$xml/elem/text()}</newElem&

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

xquery version "1.0-ml";

let $xml := <wrapper><elem>textIWant</elem></wrapper>
return <newElem xmlns="http://www.blah.org">{$xml/elem/text()}</newElem>
xquery版本“1.0-ml”;
让$xml:=textIWant
返回{$xml/elem/text()}
而不是产生所需的输出:

<newElem xmlns="http://www.blah.org">textIWant</newElem>
textIWant
它产生了以下结果:

<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>
xquery版本“1.0-ml”;
让$xml:=textIWant
让$elemText:=$xml/elem/text()
返回{$elemText}

使用其他形式的xml构造(元素(){…})也可以很好地工作。只有当构造的xml被赋予名称空间时,问题才会出现。第一个代码段有什么问题?

通过
xmlns
伪属性提供名称空间会更改嵌套XQuery范围中的默认元素名称空间。您可以通过使用名称空间前缀来解决这个问题

declare namespace ns = "http://www.blah.org";
let $xml := <wrapper><elem>textIWant</elem></wrapper>
return <ns:newElem>{ $xml/elem/text() }</ns:newElem>

通过
xmlns
伪属性提供名称空间会更改嵌套XQuery范围中的默认元素名称空间。您可以通过使用名称空间前缀来解决这个问题

declare namespace ns = "http://www.blah.org";
let $xml := <wrapper><elem>textIWant</elem></wrapper>
return <ns:newElem>{ $xml/elem/text() }</ns:newElem>

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。我已经编辑了你的标题。请看“,”其中的共识是“不,他们不应该”。这是完全正确的。经验法则:如果代码看起来是正确的,特别是如果它在一个上下文中工作,而不是在另一个上下文中,并且你没有得到任何结果,那么它可能是名称空间。这是完全正确的。经验法则:如果代码看起来是正确的,特别是如果它在一个上下文中工作,而不是在另一个上下文中工作,并且没有得到任何结果,那么可能是名称空间。