2008-12-10 5 views
5

Ich möchte dynamisch Variablen mit dynamischen Namen für die spätere Verwendung in meiner Transformation erstellen, aber dazu müsste ich XSL dynamisch generieren und dann im selben Skript ausführen.Verwenden Sie XSL, um dynamische XSL zu generieren, die im selben Skript ausgeführt wird?

Dies ist nur ein grober Pseudo-Code Beispiel für das, was ich suche.

Kann ich mit XSL dynamisch XSL erstellen, um später im selben Skript ausgeführt zu werden?

Hinweis: Unser XML wird über einen Batch-Prozess umgewandelt, der eine CL XSL-Transformations-Engine ausführt. Es ist also keine Option, nur auf ein XSL-Stylesheet im XSL-Dokument zu verweisen.

Antwort

1

Was Sie wollen, ist derzeit in reinem XSLT (1.0 oder 2.0) nicht möglich.

Wenn Sie die Saxon 9.x XSLT processor verwenden, gibt es ein paar Erweiterungsfunktionen, die dies implementieren: saxon:compile-stylesheet() und saxon:transform().

Es ist sehr selten, dass eine Lösung für ein Problem wirklich solche Funktionalität erfordert und es ist durchaus möglich, dass die Leute den besten Weg finden, das Problem zu lösen, ohne ein XSLT-Stylesheet dynamisch erstellen und ausführen zu müssen.

14

XSLT verfügt über eine spezielle integrierte Funktion, die das Generieren von Ausgaben unterstützt, nämlich XSLT.

Dies ist die <xsl:namespace-alias> XSLT-Direktive.

Als the XSLT 1.0 Spec von explaiened.

"

 
<!-- Category: top-level-element --> 
<xsl:namespace-alias 
    stylesheet-prefix = prefix | "#default" 
    result-prefix = prefix | "#default" /> 

A Sheet das xsl:namespace-alias Element verwenden können, um festzustellen, dass ein NamespaceURI ist ein alias für einen anderen NamespaceURI Wenn ein Literal NamespaceURI. wurde als Alias ​​für einen anderen Namespace-URI deklariert, dann ist der Namespace-URI im Ergebnisbaum der Namespace-URI, für den der Literal-Namespace-URI ein Alias ​​ist, anstelle des Literal-Namespace-URI selbst. Das xsl:namespace-alias -Element decl res, dass der Namespace-URI, der an das durch das stylesheet-prefix-Attribut angegebene Präfix gebunden ist, ein Alias ​​für den Namespace-URI ist, der an das durch das result-prefix-Attribut angegebene Präfix gebunden ist. Daher gibt das Attribut stylesheet-prefix den Namespace-URI an, der im Stylesheet angezeigt wird, und das Attribut gibt den entsprechenden Namespace-URI an, der im Ergebnisbaum angezeigt wird. "

Hier ist ein kleines Beispiel für eine Transformation, die eine xsl:stylesheet enthält eine xsl:variable, erzeugt, die in der gewünschten Art und Weise aufgebaut ist:

 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/> 

<xsl:template match="/*"> 
    <xxx:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xxx:variable name="{@name}"> 
    <xsl:value-of select="."/> 
    </xxx:variable> 
</xxx:stylesheet> 
</xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf das folgende XML-Dokument angewendet wird:

        <v name="myVarName">myValue</v>

das gewünschte Ergebnis produziert:

 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="myVarName">myValue</xsl:variable> 
</xsl:stylesheet> 

Dann wird der nächste Schritt sein wird, in Ihrem „Skript“ diese dynamisch generierte XSLT-Transformation zu starten.

+0

Wenn Sie nur Ihr Beispiel ausführen, wird Ihre Antwort unterschiedlich beantwortet. Was tatsächlich herauskommt, ist: ' myValue ' –

+0

@blast_hardcheese, Es ist nicht garantiert, dass das Namespace-Präfix mit dem im Attribut 'result-prefix' der Deklaration' xsl: namespace-alias' angegebenen identisch ist - Es wird nur verwendet, um den ** Namensraum ** anzugeben, in den die Literal-Ergebnis-Elemente in der Ausgabe eingefügt werden sollen. Somit ist das tatsächlich zu verwendende Präfix vom XSLT-Prozessor abhängig. Saxon verwendet dasselbe Präfix wie das Attribut 'result-prefix'. Andere XSLT-Prozessoren haben jedoch die Freiheit, das zu verwenden, was ihre Entwickler für geeignet hielten. –

+0

@blast_hardcheese, Sie wissen wahrscheinlich, dass, wenn in zwei XML-Dateien nur einige Präfixe (nicht die Namespace-URIs, an die sie gebunden sind) unterschiedlich sind, diese beiden XML-Dateien äquivalent sind. –