/ / Indentity Transformation mit Namespaces - xquery, exist-db

Indentity-Transformation mit Namespaces - xquery, exist-db

Es gibt einen bekannten Identity Transform - Beispielcode in der XQuery Wikibook

Aber es funktioniert nur gut, wenn keine Namespace-Dokumente vorhanden sind oder wenn die Namespaces mit denselben Präfixen, die im Dokument zur Verarbeitung verwendet werden, explizit deklariert werden.

Wenn Sie die Namespaces (mit den gleichen Präfixen) nicht deklarieren, erhalten Sie einen Fehler:

Xquery kann nicht kompiliert werden: err: XPST0081 Kein Namespace für Präfix definiert xsd [in Zeile 15, Spalte 12]

Gibt es eine Möglichkeit, eine Identitätstransformation in XQuery zu schreiben, die automatisch die Namespaces und Präfixe verarbeiten kann und die explizite Deklaration von Namespaces vermeidet?

BEARBEITEN:

Dies ist der Code aus dem 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
}
};

In meinem Fall kenne ich die Namespaces oder Präfixe im zu verarbeitenden Dokument nicht, also die element { } { } Konstrukt schlägt fehl, wenn Namespace und Präfix nicht in XQuery deklariert sind.

Um es zu reproduzieren, kopieren Sie es einfach und führen Sie es mit einem Dokument aus, das vorangestellte Namespaces verwendet.

Antworten:

0 für die Antwort № 1

Ich denke, die Antwort ist nein. Wenn Sie Namespaced-Elemente verarbeiten möchten, müssen diese Namespaces deklariert werden.


0 für die Antwort № 2

Basierend auf der Fehlermeldung müssen Sie lediglich den Xsd-Namespace oben in Ihrem XQuery-Dokument deklarieren.

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

Wenn dies nicht der Fall ist, würde das Hochladen von XQuery uns sehr helfen, das Problem zu verstehen.