使用命名空间进行身份转换

时间:2014-08-29 16:03:59

标签: xquery exist-db

XQuery wikibook

中有一个众所周知的身份转换示例代码

但它只适用于没有命名空间文档,或明确声明名称空间使用文档中使用的相同前缀来处理。

如果您没有声明名称空间(使用相同的前缀),则会收到错误:

  

无法编译xquery:错误:XPST0081没有为前缀定义名称空间   xsd [第15行,第12栏]

有没有办法在XQuery中编写一个Identity Transform,可以自动处理命名空间和前缀,避免显式声明命名空间?

编辑:

这是Wikibook的代码:

(: return a deep copy of  the element and all sub elements :)
declare function local:copy($element as element()) as element() {
   element {node-name($element)}
      {$element/@*,
          for $child in $element/node()
              return
               if ($child instance of element())
                 then local:copy($child)
                 else $child
      }
};

就我而言,我不知道要处理的文档中的名称空间或前缀,因此如果未在XQuery中声明名称空间和前缀,element { } { }构造将失败。

要重现它,只需复制/粘贴并使用带有前缀命名空间的文档运行它。

2 个答案:

答案 0 :(得分:0)

我认为答案是肯定的。如果要处理命名空间元素,则需要声明这些命名空间。

答案 1 :(得分:0)

根据错误消息,您需要做的就是在XQuery文档的顶部声明xsd命名空间。

Declare namespace xsd="http://www.w3.org/2001/XMLSchema";

如果没有这样做,那么发布你的XQuery将极大地帮助我们理解问题所在。