XML - Wildcard in NAMESPACE?

Hallo,
ich muss Abfragen für die IUCLID5 ( http://de.wikipedia.org/wiki/IUCLID ) Datenbank erstellen. In der Datenbank sind ein wesentlicher Teil der Daten in einem XML Feld / Tabellenspalte abgelegt. Die XML Spalte kann leicht mit xpath abgefragt werden.
Das Problem dabei ist jedoch folgendes: die XML Daten sind mit NAMESPACE i5 versehen. Dessen Definition ändert sich meistens mit jeder neuen Version, z.B.:

Version 5.4: xmlns:i5=“http://echa.europa.eu/schemas/iuclid5/20120101
Version 5.5: xmlns:i5=“http://echa.europa.eu/schemas/iuclid5/20130101

Die XML Schemas ändern sich nur geringfügig, so dass man sagen kann: beide Versionen sind nahezu identisch. Bei der Konvertierung von einer Version zur nächsten werden die vorhandenen XML Daten nicht in das aktuelle Schema konvertiert. Neue Daten bzw. geänderte Daten werden nach der Konvertierung im neuen Schema gespeichert, so dass man XML Daten mit mehreren unterschiedlichen NAMESPACEs parallel vorliegen hat. Man kann eine sehr lange dauernde manuelle Konvertierung altes Schema in neues Schema durchführen, was jedoch mein Problem nicht löst. Das ist nämlich folgendes:

Es ist offenbar nicht möglich, in PostgreSQL das Jokerzeichen “*” beim Schema in xpath Ausdrücken zu verwenden (Microsoft SQL Server kann das). Das führt dazu, dass ich bei einem Versionswechsel auf jeden Fall eine Konvertierung des alten Schemas in das neue Schema durchführen muss (das wäre noch gut erträglich), aber auch die NAMESPACE Definition in allen meinen xpath Queries aktualisieren muss. Und das möchte ich vermeiden.

Beispiel anstatt den xpath NAMESPACE (der Inhalt der XML Spalte ist hier zur Verdeutlichung als String angegeben)

SELECT xpath(’/i5:a/text()’, ‘<i5:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</my:a>’,
ARRAY[ARRAY[‘i5’, ‘http://echa.europa.eu/schemas/iuclid5/20120101’]]);

beim Wechsel auf Version 5.5 zu ändern in

SELECT xpath(’/i5:a/text()’, ‘<i5:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20130101">test lalilo</my:a>’,
ARRAY[ARRAY[‘i5’, ‘http://echa.europa.eu/schemas/iuclid5/20130101’]]);

hätte ich gern (* als NAMESPACE Jokerzeichen und keine NAMESPACE Definition)

SELECT xpath(’/*:a/text()’, ‘<i5:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</my:a>’);

Bin für jeden hilfreichen Tipp sehr dankbar.
Rainer Kroos

Also das Fragment:

<i5:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</my:a>

ist kein valides XML.
Das muss entweder:

<i5:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</i5:a>

sein(aber dann kriege ich vom XML validator z.B. die Warnung "The prefix “i5” for element “i5:a” is not bound. [2]"oder es müsste

<my:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</my:a>

Ich nehme mal an, Du wolltest eigentlich die zweite Variante.

Man kann bei XPath über die Funktion local-name() den Namen des Tags überprüfen ohne auf den Namespace zu achten.
Das folgend funktionert bei meiner 9.2 Installation:

SELECT xpath('//*[local-name()="a"]/text()', '<my:a xmlns:my="http://echa.europa.eu/schemas/iuclid5/20120101">test lalilo</my:a>');

P.S.: soweit ich das auf die Schnelle sehen konnte, ist ein Wildcard für den Namespace so wie es wohl bei Microsoft geht nicht spezifiziert.

Ein * ist aber kein Namespace name und daher dort nicht erlaubt.
Von: Namespaces in XML 1.0 (Third Edition)