使用文本处理工具和语言可以轻松解决以下问题,但我猜这不是应该这样做的..
使用 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>
有任何想法吗?
使用文本处理工具和语言可以轻松解决以下问题,但我猜这不是应该这样做的..
使用 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>
有任何想法吗?
在 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
这在 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)