Обнаружение пространства имен существующего узла и вставка нового узла того же пространства имен в XML-документ через Xquery

Я пытаюсь динамически создавать новые узлы в XML-документе на основе окружающих его узлов. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу добавить новый узел после запаса, который имеет то же пространство имен, что и запас. Хотя для этого примера это было бы легко, я хочу иметь возможность сделать это, не зная пространств имен вокруг меня. Можно ли скопировать, а затем переименовать узел, чтобы сохранить его пространство имен и, возможно, другие атрибуты?

то есть если бы у меня было

<?xml version="1.0" encoding="UTF-8"?>
<nsX:bookstore xmlns:nsX="http://namespace1" xmlns:nsY="http://namespace2">
  <nsX:bookList>
    <nsX:book category="COOKING">
      <nsX:title lang="en">Everyday Italian</nsX:title>
      <nsY:stock>1</nsY:stock>
    </nsX:book>
    <nsX:book category="CHILDREN">
      <nsX:title lang="en">Harry Potter</nsX:title>
      <nsY:stock>0</nsY:stock>
    </nsX:book>
    <nsX:book category="WEB">
      <nsX:title lang="en">XQuery Kick Start</nsX:title>
      <nsY:stock>1</nsY:stock>
    </nsX:book>
    <nsX:book category="WEB">
      <nsX:title lang="en">Learning XML</nsX:title>
      <nsY:stock>0</nsY:stock>
    </nsX:book>
  </nsX:bookList>
</nsX:bookstore>

и хотел сгенерировать следующее, еще не зная, какие пространства имен присутствуют.

<?xml version="1.0" encoding="UTF-8"?>
<nsX:bookstore xmlns:nsX="http://namespace1" xmlns:nsY="http://namespace2">
  <nsX:bookList>
    <nsX:book category="COOKING">
      <nsX:title lang="en">Everyday Italian</nsX:title>
      <nsY:stock>1</nsY:stock>
      <nsY:newNode></nsY:newNode>
    </nsX:book>
    <nsX:book category="CHILDREN">
      <nsX:title lang="en">Harry Potter</nsX:title>
      <nsY:stock>0</nsY:stock>
      <nsY:newNode></nsY:newNode>
    </nsX:book>
    <nsX:book category="WEB">
      <nsX:title lang="en">XQuery Kick Start</nsX:title>
      <nsY:stock>1</nsY:stock>
      <nsY:newNode></nsY:newNode>
    </nsX:book>
    <nsX:book category="WEB">
      <nsX:title lang="en">Learning XML</nsX:title>
      <nsY:stock>0</nsY:stock>
      <nsY:newNode></nsY:newNode>
    </nsX:book>
  </nsX:bookList>
</nsX:bookstore>

В настоящее время я создаю новый узел, используя xQuery с моей BaseXDB.

insert node <newNode></newNode> after $v/*:bookList/*:book/*:stock

(где $v — книжный магазин)

Как определить пространство имен стандартного узла и затем применить его к новым узлам, которые я создаю?


person David K    schedule 02.04.2015    source источник


Ответы (1)


Используйте fn:namespace-uri(), чтобы получить URI пространства имен узла, затем создайте QName из URI и локального имени с помощью fn:QName(). Наконец, создайте элемент из QName с помощью конструктора элемента:

let $ns-uri := ($v/*:bookList/*:book/*:stock)[1]/fn:namespace-uri(.)
let $new-node := element { fn:QName($ns-uri, "newNode") } {}
return
  insert node $new-node after $v/*:bookList/*:book/*:stock
person joemfb    schedule 02.04.2015
comment
Спасибо @joemfb за помощь. Я попробую. - person David K; 02.04.2015