XQuery替换具有前缀的元素值

时间:2019-02-12 09:20:42

标签: xquery

我是Xquery的新手。此查询中已经存在一个帖子,但是当XML具有如下前缀时,我遇到了问题:

源XML:

enter code here
<?xml version="1.0" encoding="UTF-8"?>
<so:category>
    <bo:catid>1</bo:catid>
    <bo:cattext>sport</bo:cattext>
</so:category>

Xquery更改另一篇文章中提供的值:

declare namespace local = "http://example.org";
declare namespace bo = "http://example1.org";

declare function local:copy-replace($element as element()) {

  if ($element/self::bo:catid)
  then <bo:catid>test</bo:catid>
  else element {node-name($element)}
               {$element/@*,
                for $child in $element/node()
                 return if ($child instance of element())
                        then local:copy-replace($child)
                       else $child
               }
};
 local:copy-replace(/*)

我在XML文档中有一个元素前缀。所以当我执行查询时 我收到以下错误:

错误-元素“ bo:catid”的前缀“ bo”未绑定。

我不确定如何处理前缀,并已在互联网上搜索了相关主题。但是,我无法通过提供的信息来解决此问题,并且需要知道我在做什么错。

1 个答案:

答案 0 :(得分:3)

根据XML 1.0的建议,您的XML格式正确,但根据XML命名空间1.0,它的名称空间格式不正确(因为它使用的名称空间前缀未绑定到任何名称空间URI)。 XML生态系统中的大多数工具只能处理命名空间格式良好的XML,这是使用XQuery的绝对要求。

在查询中声明名称空间前缀并不能避免使用具有名称空间格式的输入。