XQuery получить узел без пространства имен - PullRequest
0 голосов
/ 28 января 2020

У меня есть 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 Ответ

3 голосов
/ 28 января 2020

Вы можете использовать рекурсивную функцию для удаления всех префиксов из имен элементов и атрибутов:

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)
...