5 Stimmen

Wie kann ich xsl:import mit einer Variablen im Dateipfad verwenden?

Im Grunde möchte ich dies in XSL machen:

Aber anscheinend kann ich kein Variablen ($domain) im include verwenden. Irgendwelche Vorschläge für einen Workaround?

0 Stimmen

Gute Frage, +1. Sehen Sie meine Antwort für eine XSLT 2.0 - nur mögliche (aber begrenzte) Lösung und eine alternative, nicht-XSLT-Lösung.

6voto

lavinio Punkte 23413

xsl:import und xsl:include werden zur Kompilierzeit aufgelöst und unterstützen keine Laufzeiterweiterung.

Ausnahme, wenn Sie XSLT 2.0 verwenden, können Sie bedingte Einbindung mit use-when verwenden, wenn Sie einen Ausdruck haben, der in einem statischen Kontext ausgewertet werden kann.

1 Stimmen

+1 Richtig Antwort. Auch in XSLT 2.0 ist die Stylesheet-Modul-URI nicht "dynamisch". Es kann sich natürlich um eine relative URI handeln.

2voto

Dimitre Novatchev Punkte 234995

Wie @lavinio erläutert, kann in XSLT 2.0 das use-when -Attribut verwendet werden, um eine gewisse "Kompilierungszeit"-Einbindung einer XSLT-Anweisung zu ermöglichen. Dies ist jedoch nur auf das Testen von Bedingungen beschränkt, die aus Werten im statischen Kontext und aus diesen dynamischen Kontextwerten abgeleitet werden können: aktuelles Datum und Uhrzeit sowie implizite Zeitzonierung.

Ein weiterer Ansatz besteht darin, das XSLT-Stylesheet (als XML-Dokument) zur Laufzeit zu laden und vor dem Initiieren der Transformation dynamisch den href-Attribut beliebiger gewünschter und/oder -Anweisungen festzulegen.

Diese Technik wird vom XPath Visualizer verwendet, um das XSLT-Stylesheet dynamisch zu ändern, das dann den vom Benutzer angegebenen XPath-Ausdruck auswertet und das XML-Dokument mit allen ausgewählten und sichtbaren Knoten formatiert - hervorgehoben.

2voto

Daniel Haley Punkte 48844

Mit der Ergänzung von statischen Parametern ist es jetzt möglich, bedingt in XSLT 3.0 einzuschließen. Statische Parameter können im use-when-Attribut des xsl:include verwendet werden.

Jetzt können wir Parameter mit Standardwerten von false() deklarieren und dann die benötigten zur Laufzeit überschreiben...

Hier ist ein vollständiges funktionierendes Beispiel getestet mit Saxon-HE v9.7 (auch getestet mit Saxon-PE 9.5).

XML-Eingabe (test.xml)

Haupt-XSLT 3.0 (test_main.xsl)

Mögliche erste eingeschlossene XSLT 3.0 (test_inc1.xsl)

    DATEI 1 EINSCHLIEßEN!!!

Zweite mögliche eingeschlossene XSLT 3.0 (test_inc2.xsl)

    DATEI 2 EINSCHLIEßEN!!!

Befehlszeile (Setzen von inc2 auf true)

java -cp "saxon9he.jar" net.sf.saxon.Transform -s:"test.xml" -xsl:"test_main.xsl" inc2="true"

Ausgabe

   DATEI 2 EINSCHLIEßEN!!!

0voto

ruvim Punkte 6176

Ein weiterer Lösungsansatz besteht darin, eine XML-Datei zu laden und sie mithilfe eines Satzes von Regeln zu transformieren (diese Datei könnte sogar eine einfache XSLT-Variante sein).

_default

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X