XQuery获取没有名称空间的节点

时间:2020-01-28 13:19:05

标签: xml xquery

我有一个带有命名空间的XML:

<namespace:root>
  <namespace:node>
    <namespace:subnode>value</namespace:subnode>
  </namespace:node>
</namespace:root>

我需要执行XQuery以获取相同的XML或子节点作为输出,而没有名称空间:

<root>
  <node>
    <subnode>value</subnode>
  </node>
</root>

是否有XQuery语法?

1 个答案:

答案 0 :(得分:3)

您可以使用递归函数从元素和属性名称中删除所有前缀:

declare function local:strip-namespaces($node as node()) as node()* {
  if($node instance of element()) then (
    element { local-name($node) } {
      for $attribute in $node/@*
      return attribute { local-name($attribute) } { $attribute },
      for $child in $node/node()
      return local:strip-namespaces($child)
    }
  ) else (
    $node
  )
};

let $xml :=
  <namespace:root xmlns:namespace='URI' namespace:id='123'>
    <namespace:node>
      <namespace:subnode>value</namespace:subnode>
    </namespace:node>
  </namespace:root>
return local:strip-namespaces($xml)