2016-06-30 11 views
0

Für alle XQuery-Abfragen ich ausführen, definiere ich einen Namespace Standardelement, etwa so:Ist es möglich, einen Standard-Namespace aus einer externen Variablen dynamisch zu deklarieren?

declare default element namespace 'http://example.com'; 
(: rest of the query :) 

Aber diesen Namensraum zu codieren Art umständlich ist. Kann ich einen Standard-Namespace aus einer externen Variablen dynamisch definieren?

Es versucht:

declare default element namespace $namespace; 
(: error: Expecting quote, found '$'. :) 

.. und:

declare variable $namespace external; 
declare default element namespace $namespace; 
(: error: Default declarations must be declared first. :) 

... aber sie funktionieren nicht, leider.


Ich verwende derzeit BaseX 7.7.2, übrigens.

Antwort

1

Leider können statische Namespaces nur statisch deklariert werden, da die Grammatik nur ein URILiteral an dieser Stelle erlaubt. Der Standardelementnamespace befindet sich im statischen Kontext der Abfrage.

Sie können jedoch QNames aus einer Variablen erstellen, die den Namespace dynamisch enthält (aus einer Variablen). Sie können neue Elemente mit solchen QNames mit berechneten Elementkonstruktoren erstellen. Die XPath-Navigation wäre jedoch komplizierter, da Sie Namespaces explizit filtern müssen.

+0

Direkt an. Sehr hilfreich wieder; Danke! –

+0

Ich glaube, ich werde meine Abfragen einfach in eine generische Abfragevorlage einfügen, so dass ich den Namespace nur an einer Stelle deklarieren muss. Außerdem denke ich, dass ich diesen generischen Wrapper auch als 'try .. catch'-Block benutzen könnte, und dann (in Bezug auf meine andere Frage [Sie antwortete] (https://Stackoverflow.com/a/38124483/165154)) mit ein generischer "" Generator im 'catch' Block. Danke noch einmal! –

1

Es wird allgemein angenommen, dass wenn Sie die lokalen Namen der Elemente im Quelldokument statisch kennen, dann werden Sie ihre Namespaces auch statisch kennen. Diese Annahme ist nicht immer richtig; Sie stoßen manchmal auf eine Familie von Namespaces (z. B. verschiedene Versionen eines Namespace), die dieselben lokalen Namen verwenden; aber XQuery (und XSLT) sind nicht gut für dieses Szenario geeignet.

Wenn Sie also die Namen der Elemente statisch kennen und Pfadausdrücke wie Rechnung/Kunde/Adresse verwenden, dann sind die Namen in diesem Pfad einfach eine Abkürzung für die vollständigen erweiterten Namen und es wird angenommen, dass die Kurzschrift sein kann vom Compiler gelöst. Aus diesem Grund sind die Namespace-Deklarationen alle statisch festgelegt.

Wenn Sie die Namen der Elemente, die Sie statisch abfragen, nicht kennen, schreiben Sie wahrscheinlich eine Abfrage, die Platzhalterzeichen (z. B. child :: *) anstelle von expliziten lokalen Namen wie "Rechnung" verwendet. In diesem Fall kommt die Default-Namespace-Deklaration sowieso nicht zum Einsatz.

So die einzige Situation, die ich sehen kann, wo Sie Probleme haben, ist das obige Szenario, wo mehrere Namespaces ähnliche Sätze von lokalen Namen verwenden. Die meisten Leute raten davon ab, Namespaces so zu benutzen, aber leider hat nicht jeder diesen Ratschlag befolgt.