Существует хорошо известный тождественное преобразование пример кода в XQuery wikibookIndentity Transform с пространствами имен
Но он хорошо работает только без каких-либо пространства имен документов, или явно объявляя пространства имен с одинаковыми префиксами, используемых в документе о подлежащих обработке ,
Если вы не объявить пространство имен (с теми же приставками), вы получите сообщение об ошибке:
Cannot compile xquery: err:XPST0081 No namespace defined for prefix xsd [at line 15, column 12]
есть способ, чтобы написать тождественное преобразование в XQuery, который может автоматически обрабатывать пространство имен и префиксы, избегая явного объявления пространств имен?
EDIT:
Это код из 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
}
};
В моем случае, я не знаю имен или префиксов в документе должны быть обработаны, поэтому element { } { }
конструкция терпит неудачу если пространство имен и префикс не объявлены в XQuery.
Чтобы воспроизвести его, просто скопируйте/вставьте его и запустите с документом, который использует префиксные пространства имен.
Этого не было в моем опыте. можете ли вы разместить свой код и контент? – joemfb
Думаю, вам придется вставить пример вашего XML. Я просто проверил ваш XQuery, и он отлично работает для меня с пространствами имен с префиксами и без них. – adamretter
Попробуйте так: let $ x: = doc ('http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Order-2.1.xsd') return local: copy ($ x) Помните, что я использую eXist-db –