Изменить пространство имен в XQuery - PullRequest
2 голосов
/ 09 августа 2011

Я обнаружил следующую пользовательскую функцию XQuery в книге O'Reiily 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>

Похоже, чтоисходное пространство имен удалено, но новое еще не подключено, или просто процессор не печатает пространство имен, потому что незатронутое объявление пространства имен также пропало?

Ответы [ 2 ]

1 голос
/ 11 августа 2011

К сожалению, в окне результатов eXist Sandbox не отображаются атрибуты пространства имен (@xmlns).Но если вы сохраните свой запрос в виде файла .xq и запустите его через браузер, вы увидите, что он действительно правильно сохраняет информацию о пространстве имен.Кстати, версия Sandbox следующего поколения, называемая eXide, отображает информацию о пространстве имен несколько лучше.См. Демонстрационную версию eXide по адресу http://demo.exist -db.org / exist / eXide / index.html .

0 голосов
/ 30 ноября 2012

У меня похожая проблема при использовании реализации Saxon 9.3 на OSB 11. Странно, но она работает на Oxygen, но не на OSB.

...