XQuery:返回没有命名空间

时间:2014-02-20 14:24:30

标签: xml namespaces xsd xquery xml-namespaces

是否可以通过前缀返回无命名空间?换句话说,当在Xquery中设置默认命名空间时,如何在 no 命名空间中放置一个元素,或者如何创建一个没有命名空间的元素?

我的问题是我从a-> b定义了一个Xquery映射,我现在意识到,b期望它的子节点不合格。在映射中,我将默认命名空间设置为a且始终为限定b。如果我从bs children中删除nsprefix,则应用NS。 e.g。

这是期望的结果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>

2 个答案:

答案 0 :(得分:3)

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

话虽如此,一些实现可能支持使用xmlns=""将元素放回默认的默认命名空间。 e.g。

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

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

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

答案 1 :(得分:2)

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

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
};

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