Ist es möglich, eine Dynamische xPath-Ausdruck im xslt-Stylesheet?
Ich gerne den Wert eines xslt-parameter in einem xpath-Ausdruck. Insbesondere als Teil einer not()
Aufruf in einem <xsl:if
Ausdruck.
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- my_param contains a string '/foo/bar', passed in from ant -->
<!-- the 'no' is just a default value -->
<xsl:param name="my_param">no</xsl:param>
<xsl:variable name="var_myparam" select="$my_param" />
<!-- ... -->
<!-- this works -->
<xsl:if test="not(/foo/bar)" /> <!-- expression returns boolean true -->
<!-- ... -->
</xsl:if>
<!-- I can't figure out how to do this the right way -->
<!-- None of these appear to work -->
<xsl:if test="not($var_myparam)" /> <!-- expression returns boolean false -->
<!-- ... -->
</xsl:if>
<xsl:if test="not({$var_myparam})" /> <!-- complains Required attribute 'test' is missing -->
<!-- ... -->
</xsl:if>
<xsl:if test="not({$myparam})" /> <!-- complains Required attribute 'test' is missing -->
<!-- ... -->
</xsl:if>
<xsl:if test="not($myparam)" /> <!-- expression returns boolean false -->
<!-- ... -->
</xsl:if>
</xsl:transform>
Bin ich ein wenig unklar, was die richtige syntax für das erstellen einer dynamischen xpath-Ausdruck im xslt-Stylesheet. Ich bin auch ein wenig verschwommen auf den Unterschied zwischen einem Parameter, einer variable und wie expanstion der beiden Werke. Zum Beispiel, mit den Parametern, ich weiß, dass ich manchmal müssen Sie die Klammern, und manchmal habe ich nicht.
<!-- when creating an element, it seems I need brackets -->
<xsl:element name="{$my_param}" />
<!-- when selecting an element value for the output stream, no brackets are needed -->
<xsl:value-of select="$my_param"/>
Allgemeine/spezifische Hilfe würde sehr geschätzt werden.
InformationsquelleAutor Alan Storm | 2009-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Check-out http://www.exslt.org/.
Speziell mit Blick auf die dynamische:evaluieren-Modul.
Ich glaube nicht, dass es möglich ist mit XSLT "out of the box". Der parameter-Wert ausgewertet wird, als Zeichenfolge, sondern als ein Knoten-set. Michael Kay eine ähnliche Frage beantwortet ein paar Jahre zurück und empfahl die Verwendung der evaluate () - Funktion als Lösung. biglist.com/lists/xsl-list/archives/200406/msg00006.html
Michael Kay? Was weiß er darüber 🙂 wie es Klingt, EXSLT-oder-nichts-dann, was bedeutet, du bist SOL, es sei denn, du bist mit einer der gesegneten Parser.
Alan, Sie sind genau richtig, die Kompatibilität ist nicht garantiert. Ich habe auf der Suche nach einer Liste der 'gesegnet Parser' und haben, gehen leer aus. Ich weiß aus (und die EXSLT-Dokumentation), dass der Apache-Server sind in Ordnung, und was ich gesehen habe, durch die Suche, es wurde vorgeschlagen, dass MSXML würde auch funktionieren.
InformationsquelleAutor CMN
XSLT nicht unterstützt die dynamische Auswertung von XPath - das ist, warum Sie benötigen, um zu verwenden, eine Erweiterung Funktion wie EXSLT ist
evaluate
es zu tun.Wenn Sie nicht wollen, verwenden Sie die Verlängerung Funktionen (und es gibt gute Gründe das nicht zu), eine andere Möglichkeit ist eine Abfrage der input-Dokuments DOM, bevor Sie führen Sie die Transformation, und übergeben Sie das Knoten-set in der Transformation als parameter.
Bearbeiten
Über die geschweiften Klammern: Diese werden Attribut-Wert-Vorlagen (AVTs). Diese sind semantisch äquivalent, die in einem XSLT-Transformation:
Das zweite ist nur eine Verknüpfung für die erste.
Variablen und Parameter: Syntaktisch besteht kein Unterschied zwischen einer Variablen und einem parameter, überall verweisen Sie auf
$foo
in einem XPath-Ausdruck es wird funktionieren, egal obfoo
ist definiert durchxsl:variable
oderxsl:param
.Den Unterschied zwischen den beiden ist, wie Sie ausgefüllt. Variablen sind befüllt
xsl:variable
Erklärung. Parameter deklariert sind, in einer benannten Vorlage mitxsl:param
, aber Sie sind bevölkert von was auch immer ruft die Vorlage, mitxsl:with-param
, z.B.:Den großen Hupen Ausnahme ist, Parameter, die ein Kind
xsl:stylesheet
. Es gibt keinen Weg, um füllen Sie diese Parameter in der Transformation; jene aufgefüllt werden, die extern, durch was auch immer (Umwelt-spezifische) Mechanismus ist die Anrufung der Transformation.Ein ziemlich häufiger Anwendungsfall ist die Herstellung bis auf die Tatsache, dass XSLT-nicht über ein system-Datum-Funktion. So sehen Sie etwas wie:
und dann, beim Aufruf der Transformation, so etwas (in C#):
Wie die übergabe eines Parameters in a transform funktioniert, hängt von der XSLT-Prozessor Sie verwenden. Zum Beispiel, in C#, die Sie verwenden würden
XmlNode.Select()
zu bauen, die ein node-set (d.h.XmlNodeList
). Dann würden Sie erstellen einXmlArgumentList
- Objekt, füllen es mit der node-set, und übergeben Sie es inXslCompiledTransform.Transform()
. Wenn Sie ein tool verwenden, dass nicht geben Ihnen den programmatischen Zugriff auf die input-Dokuments DOM, dieser Weg ist wahrscheinlich für Sie geöffnet.Weiß jemand, ob es einen Weg gibt, zu übergeben das argument-Knoten in Java mit dem built-in XSLT?
InformationsquelleAutor Robert Rossney
Versuchen Sie einige Variationen dieser:
Das problem ist, wie wertet XPath-Boolean. Jede nicht-leere Zeichenfolge wird zu true ausgewertet, in XPath. Kasse diesem write-up über xpath-Boolean.
Als für deine anderen Fragen... Variablen und Parameter das gleiche handeln wie jeder andere in XPath-Ausdrücken. Beide verwiesen mit der form $var.
Für alle XSLT-Attribut mit dem Namen "wählen Sie," Sie brauchen nicht die Klammern. Klammern werden verwendet, in sogenannten "Attribut-Wert Vorlagen." Sie verwenden Sie Sie, wenn Sie XSLT-erwartet einen string, zum Beispiel:
Den XSLT-Spezifikation spricht über AVTs, und so hat auf dieser Seite.
Hmm, in diesem Fall müssen Sie eine Erweiterung der Funktion, gemäß der Diskussion in CNutt Antwort. saxon:eval () - ist eine option: saxonica.com/documentation/extensions/functions/evaluate.html
InformationsquelleAutor James Sulak