簡體   English   中英

檢測現有節點的名稱空間,並通過Xquery將具有相同名稱空間的新節點插入到xml文檔中

[英]Detect namespace of an existing node and insert a new node of the same namespace into an xml document via 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是書店)

如何檢測庫存節點的名稱空間,然后將其應用於我正在制作的新節點?

使用fn:namespace-uri()獲取節點的名稱空間URI,然后根據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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM