2

我在 O'Reily 的书XQuery中找到了以下 XQuery 用户定义函数,它用于在打印 XML 文件时更改其名称空间:

declare namespace functx = "http://www.functx.com";
declare function functx:change-element-ns-deep
($element as element(), $newns as xs:string) as element()
{
let $newName := QName ($newns, name ($element))
return (element {$newName} 
      {$element/@*,
       for $child in $element/node()
       return if ($child instance of element())
              then functx:change-element-ns-deep ($child, $newns)
              else $child
       }
      )
};

调用此函数的一个示例是:

<text xmlns:pre="pre"> 
{           
  functx:change-element-ns-deep(<pre:x><pre:y>123</pre:y></pre:x>, "http://new") 
}  
</text> 

返回:

<test xmlns:pre="pre" > 
  < x xmlns="http//new">  
    <y>123</y> 
  </x>   
</test> 

但我得到的是:

<test>  
  <x>    
    <y>123</y>  
  </x>  
</test>

似乎原始名称空间已被剥离,但尚未附加新名称空间,或者仅仅是处理器没有打印名称空间,因为未受影响的名称空间声明也消失了?

4

2 回答 2

1

遗憾的是,eXist Sandbox 结果窗口不显示命名空间属性 (@xmlns)。但是,如果您将查询保存为 .xq 文件并通过浏览器运行它,您会发现它实际上正确地保留了命名空间信息。顺便说一句,名为 eXide 的沙盒的下一代版本确实可以更好地显示名称空间信息。请参阅https://exist-db.org/exist/apps/eXide上的 eXide 演示。

于 2011-08-11T11:47:07.793 回答
0

我在 OSB 11 上使用 Saxon 9.3 实现时遇到了类似的问题。奇怪的是,它适用于 Oxygen,但不适用于 OSB。

于 2012-11-30T11:38:30.617 回答