检测现有节点的命名空间并通过 Xquery 将相同命名空间的新节点插入到 xml 文档中
Detect namespace of an existing node and insert a new node of the same namespace into an xml document via Xquery
我正在尝试根据文档周围的节点在 xml 文档中动态创建一些新节点。我遇到的问题是我想在 stock 之后添加一个与 stock 具有相同命名空间的新节点。虽然对于这个例子来说很容易,但我希望能够在不知道我周围的名称空间的情况下做到这一点。是否可以复制然后重命名节点,以便我可以保留其名称空间和可能的其他属性?
即如果我有
<?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,然后使用 fn:QName()
从 URI 和本地名称创建 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
我正在尝试根据文档周围的节点在 xml 文档中动态创建一些新节点。我遇到的问题是我想在 stock 之后添加一个与 stock 具有相同命名空间的新节点。虽然对于这个例子来说很容易,但我希望能够在不知道我周围的名称空间的情况下做到这一点。是否可以复制然后重命名节点,以便我可以保留其名称空间和可能的其他属性?
即如果我有
<?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,然后使用 fn:QName()
从 URI 和本地名称创建 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