Налице е добре познат код за идентичност трансформиране в. \ T XQuery wikibook
Но той работи добре само без документи на пространството от имена или изрично декларира пространствата от имена със същите префикси, използвани в документа, който ще се обработва.
Ако не декларирате пространства от имена (със същите префикси), получавате грешка:
Не може да се компилира xquery: err: XPST0081 Не е определено пространство от имена за префикс xsd [в ред 15, колона 12]
Има ли начин да се напише трансформация на идентичност в XQuery, която може автоматично да обработва пространствата от имена и префиксите, избягвайки изричното деклариране на пространства от имена?
РЕДАКТИРАНЕ:
Това е кодът от 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.
За да го възпроизведете, просто копирайте / поставете и стартирайте с документ, който използва префикс пространства от имена.
Отговори:
0 за отговор № 1Мисля, че отговорът е не. Ако искате да обработвате елементи с имена, тогава тези пространства от имена трябва да бъдат декларирани.
0 за отговор № 2
Въз основа на съобщението за грешка, всичко, което трябва да направите, е да декларирате пространството за имена xsd в горната част на вашия документ XQuery.
Declare namespace xsd="http://www.w3.org/2001/XMLSchema";
Ако това не го направи, публикуването на XQuery ще ни помогне много да разберем какъв е проблемът.