【问题标题】:XQuery: return to no namespaceXQuery:返回无命名空间
【发布时间】:2014-03-21 13:30:57
【问题描述】:

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

我的问题是我从 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>

【问题讨论】:

  • 很难说你想要实现什么,因为你的 XML sn-p 和你的 XQuery 代码都是无效的。
  • sn-ps 是为了勾勒总体思路,我已将它们更新为有效代码。

标签: xml namespaces xsd xquery xml-namespaces


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这会将 other 中的 default 命名空间声明为无命名空间,但 other 仍将在 a 的 NS 中。
  • Stefan K.,是什么让您认为 other 会在命名空间 a 中?正如您正确指出的那样,other 元素没有默认命名空间;这不仅适用于 other 元素的内容,还适用于其无前缀 QName 的解析:命名空间声明适用于它们出现的开始标签的元素,而不仅仅是该元素的内容。
【解决方案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
};

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2021-08-23
    • 2023-03-09
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多