【问题标题】:Detect namespace of an existing node and insert a new node of the same namespace into an xml document via Xquery检测现有节点的命名空间,并通过 Xquery 将同一命名空间的新节点插入 xml 文档
【发布时间】:2015-04-02 13:34:49
【问题描述】:

我正在尝试根据其周围的节点在 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 是书店)

如何检测股票节点的命名空间,然后将其应用于我正在制作的新节点?

【问题讨论】:

    标签: xml namespaces xquery basex


    【解决方案1】:

    使用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
    

    【讨论】:

    • 感谢@joemfb 的帮助。我会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多