1

使用文本处理工具和语言可以轻松解决以下问题,但我猜这不是应该这样做的..

使用 XQuery (Update) 重命名大型 XML 文档中的命名空间前缀的最简洁和最便宜的方法是什么?

资源:

<a:root xmlns:a="http://my.old.url/"/>
  <a:sub/>
</a:root>

我想得到的结果:

<b:root xmlns:b="http://my.old.url/"/>
  <b:sub/>
</b:root>

有任何想法吗?

4

2 回答 2

1

XQuery 更新

在 XQuery Update 中,您可以使用rename表达式重命名给定名称空间中的所有元素:

declare namespace ns='http://my.old.url/';
for $nd in doc('your-db')//ns:*
return rename node $nd as QName('http://my.old.url/', concat('b:', local-name($nd)))

如果您不希望更改是永久性的,您也可以将更新包装在Transform Expression中:

declare namespace ns='http://my.old.url/';
copy $doc :=
  document{
    <a:root xmlns:a="http://my.old.url/">
      <a:sub/>
    </a:root>
  }
modify
  for $nd in $doc//ns:*
  return rename node $nd as QName('http://my.old.url/', concat('b:', local-name($nd)))
return $doc
于 2013-07-20T09:09:45.510 回答
0

这在 XSLT 中可能更容易做到,但在 XQuery 中我认为您基本上会做同样的事情。声明所需的命名空间前缀,然后递归处理节点并更新元素名称以使用该前缀。

xquery version "1.0";
declare namespace b="http://my.old.url/";

declare function local:update-ns-prefix($node)
{
  typeswitch($node)    
    case element() return 
      element { xs:QName(concat('b:',local-name($node))) }
      {
        $node/@*, 
        for $n in $node/node()
        return local:update-ns-prefix($n)
      }
    default return $node
};

let $xml :=
<a:root xmlns:a="http://my.old.url/">
  <a:sub xmlns:a="http://my.old.url/"/>
</a:root>
return local:update-ns-prefix($xml)
于 2013-07-19T18:16:09.570 回答