2016-04-17 8 views
1

Unsere Situation ist, dass wir XPath 1.0 und Funktion current() (und ein paar andere Funktionen) in unseren Modellen unterstützen müssen, aber wir haben keine Daten als XML-Dokumente. Wir haben eine NodeInfo-Implementierung geschrieben, um das Nicht-XML-Datenquellenproblem zu behandeln.Die Funktion current() in einem Nicht-XSLT-Kontext kann nicht verwendet werden

aber, wenn ich einen Ausdruck von der folgenden Art lief

/a/b/c[name = current()/../x]/yy/uu/name 

durch ein Objekt Einstellen die Wurzel wie das Dokumentobjekt darstellen, und ein anderes Objekt mit Geschwisterelement x als Kontextknoten, habe ich den Fehler

nicht den Strom() Funktion in einem nicht-XSLT Kontext

Als ich gedebuggt ich sah, dass der Kontext th in Gebrauch verwenden kann, ist e Standalone-Kontext. Wie bekomme ich die Unterstützung für die current() Funktion? Ich habe versucht, durch den Ausdruck

Ändern
/a/b/c[name = ./../x]/yy/uu/name 

aber die . als c interpretiert.

+0

Welche Version von Saxon verwenden Sie genau mit? Warum muss es XPath 1.0 sein, wenn Sie Saxon 9 benutzen, dann haben Sie XPath 2.0 oder in 9.7 sogar XPath 3.0 (wo Sie zB 'let $ context: =. Return/a/b/c [name = $ context /../ x]/yy/uu/name'). –

+0

gibt es eine Spezifikation, die ich unterstützen muss. Die Spezifikation beschränkt sich auf xpath 1.0 und einige geliehene Funktionen wie current(). – user19937

+0

Es gibt eine Spezifikation für mich, die ich unterstützen muss. Die Spezifikation beschränkt sich auf xpath 1.0 und einige geliehene Funktionen wie current(). Meine Implementierung kann irgendeine Sache benutzen, also ist saxon 9.7 sicherlich eine Option, vorausgesetzt, es ist möglich, eine benutzerdefinierte NodeInfo-Implementierung durchzuführen. – user19937

Antwort

1

Saxon wendet eine sehr strenge Konformitätskonformität an, und die XPath-Spezifikation erlaubt es Implementierern nicht, ihre eigenen Funktionen außer in einem anderen Namespace hinzuzufügen. Die Funktion current() ist in XSLT definiert, und die Semantik der Funktion ist in Begriffen definiert, die nur in XSLT Sinn ergeben, obwohl man sicherlich eine analoge Funktion für die Verwendung in freistehenden XPath-Ausdrücken definieren könnte. In aktuellen Versionen von XPath wird es wirklich nicht mehr benötigt, weil Sie Variablen mit "let" binden können (wie Martin Honnen zeigt).

Wenn Sie bereit sind, sich intensiv mit internen Schnittstellen zu beschäftigen, dann können Sie mit Saxon den Funktionsumfang erweitern. Beispielsweise gibt es XForms-Implementierungen, die die darunter liegende Saxon-Engine verwenden, mit zusätzlichen Funktionen, die in der XForms-Spezifikation definiert sind. Die Details hängen davon ab, welche sächsische Version Sie verwenden: Die Tatsache, dass der statische Kontext ein StandaloneContext ist, legt nahe, dass es sich um eine ziemlich alte Version handelt. Wenn Sie 9.7 verwenden, wäre es wahrscheinlich ein IndependentContext. Der IndependentContext verfügt über die Methoden getFunctionLibrary() und setFunctionLibrary(), mit denen die dem XPath-Parser bekannten Funktionen geändert werden können. Aber damit das funktioniert, müssen Sie sich mit dem Inneren von Saxon vertraut machen. Wenn Sie jedoch wirklich verpflichtet sind, eine Spezifikation zu implementieren, die XPath 1.0 auf nichtkonforme Weise erweitert, haben Sie nicht viele Optionen.

+0

Ich habe keine andere Wahl, als dieses Ding zu unterstützen. Vielen Dank. Ich werde in 9.7 nachsehen. Ich muss die Open-Source-Bibliothek verwenden (und eine Lizenz, die uns nicht benötigt, um unseren Code zu öffnen). Wir werden gerne den Anpassungscode beisteuern, können aber keinen Anwendungscode preisgeben. Erlaubt Saxon 9.7 das? – user19937

+0

Die Mozilla-Lizenz erfordert, dass Sie Änderungen an vorhandenen Modulen veröffentlichen, aber Sie können neue Module hinzufügen, ohne sie zu veröffentlichen.Sie können den Buchstaben dieser Anforderung erfüllen, indem Sie vorhandene Module modifizieren, um an geeigneten Stellen Ihre eigenen neuen Module aufzurufen - Ihr modifizierter Code muss nicht einmal selbst kompilieren. Verrückt, aber das alles wurde von Anwälten geschrieben, die keine Ahnung von Technologie haben. –