繁体   English   中英

XQuery:不返回任何名称空间

[英]XQuery: return to no namespace

是否可以通过前缀不返回任何名称空间? 换句话说,当在Xquery中设置默认名称空间时,如何在名称空间中放置元素,或者如何在没有名称空间的情况下创建元素

我的问题是我从a-> b定义了一个Xquery映射,现在我意识到,b期望它的子代不合格。 在映射中,我将默认名称空间设置为a并始终为b。 如果我从bs子级中删除nsprefix,则应用NS。 例如

这是期望的结果XML:

<myB:StatusEvent xmlns:myB="http://b">
<Action/> <!-- note Action has no, not even an inherited, namespace -->
</myB:StatusEvent>

虽然这是整个xquery映射中通常使用的前缀:

declare default element namespace "http://a";
let $elem :=  doc("someinput.xml")/somePathWithoutMyAPrefix
(: note the xpath expressions use the default a namespace :)
return
<myB:StatusEvent>{$elem/someVal}
    <myNN:Action> (: <== how do I create Action **without** a namespace? :)
</myB:StatusEvent>

我真的建议不要使用declare default element namespace "http://a"; 这是非常邪恶的,尤其是如果其他开发人员没有注意到它的使用并且花了很多时间试图弄清楚为什么会得到意想不到的结果的话。

话虽如此,某些实现可能支持使用xmlns=""将元素放回到默认的默认名称空间中。 例如

declare default element namespace "http://a";

<a>
    <other xmlns=""/>
</a>

据我所知,这不能通过前缀来完成。

您声明使用默认名称空间只是为了方便查询本身。 我想您要做的就是从某些元素中删除名称空间。 您可以使用类似以下的递归函数来做这样的事情:

declare function local:remove-namespace ($node as node()) {
  typeswitch ($node)
    case element() 
      return  element { local-name($node) } {$node/@*, for $child in $node/node() return local:remove-namespace($child) }
    default 
  return $node
};

只需在不需要名称空间的元素上调用此方法即可(从您的示例中不能完全清楚)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM