2015-04-02 46 views
1

我试图在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是书店)

如何检测股票节点的命名空间,然后应用它到我正在创建的新节点?

回答

4

使用fn:namespace-uri()获取节点的名称空间URI,然后从URI和本地名称中创建一个名称为fn:QName()的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 
+0

谢谢@joemfb的帮助。我会给这个镜头。 – 2015-04-02 14:46:03

相关问题