Frage

Ich versuche, XSLT-Variablen zu verwenden, und nicht viel Erfolg haben, hoffentlich bin ich nur etwas Dummes zu tun.

Ich habe den folgenden Code-Snippet:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xalan="http://xml.apache.org/xslt"
  version="1.0">

    <xsl:template match="/">
      <xsl:variable name="config" select="query/@config"></xsl:variable>

so ich dort erwarten eine Variable 'config' auf den Wert des 'config' Attribut meiner Top-Level-Element 'query' gesetzt werden.

ich dann versuchen, die Variable zu verwenden später in meinem Sheet, zum Beispiel:

<a href="localhost/test?go">
    {$config}
</a>

aber die Ausgabe ich in meiner Ausgabe HTML-Dokument zu sehen ist:

<a href="localhost/test?go">
    {$config}
</a>

so hat sich der Wert nicht ersetzt worden, wie ich erwartet hätte.

Ich denke, das ist ziemlich viel einfachsten Fall könnte es sein, so ich tue domething dumm! Bitte helfen, danke!


UPDATE Dank an alle, die geantwortet haben, falsch verstanden ich die verschiedenen Kontexte, ob ich in einem Attribut arbeiten oder außerhalb. schön sortiert mein Problem aus!

Wenn ich könnte ich zwei Antworten akzeptieren würde, die, die ich habe, und @Aaron Digulla ist, die die Attribute Sache erklärt.

War es hilfreich?

Lösung

In Ihrem Stylesheet müssen Sie verwenden:

<xsl:value-of select="$config"/>

statt:

{$config}

Andere Tipps

Es gibt zwei Fragen hier, dass das gleiche sein, aber davon sind auf subtile Weise anders: 1) Wie Sie verweise ich eine Variable mit Namen? 2) Wo kann ich eine Variable mit Namen verweisen?

Zuerst werden Variablen immer die $varname Syntax referenziert werden. Zweitens kann dies getan werden überall ein Ausdruck erlaubt ist, . Es ist der zweite Teil davon, die zu verwirren scheint. Zu Beginn wird der Wert eines Elements oder Attribut standardmäßig ausgegeben wird buchstäblich, also gibt es keine Variablen tatsächlich im folgende Beispiel verwiesen:

<element attr="$test">$test or {$test}</element>

Die Ausgabe wird buchstäblich übereinstimmen, was eingegeben wurde.

Zur Ausgabe Wert einer Variable, müssen wir es verweisen, wo ein Ausdruck erlaubt ist. In Elementgehalt verwenden wir xsl:value-of; Attribute, die in als Attributwert-Template (zB die Attribute behandelt werden ein Literal Ergebniselement), sind Ausdrücke, die durch geschweifte Klammern {} begrenzt. Angenommen, die folgende Erklärung ab:

<xsl:variable name="test" select="'value'"/>

... dann wie folgt vor:

<element attr="{$test}"><xsl:value-of select="$test"/></element>

... Ergebnisse in:

<element attr="value">value</element>

Einige Trenn Hinweise auf AVT und value-of:

  • In beiden Fällen wird die Variable wurde als $test verwiesen. Die Streben in einer AVT sind nicht Teil der variablen Referenz; sie sind Ausdruck Begrenzungszeichen.
  • In jedem Fall muss der Ausdruck keinen Verweis auf eine Variable enthalten hat; jeder XPath-Ausdruck erlaubt worden wäre.
  • Nicht alle Attribute in einem XSLT-Dokument werden als Attributwert-Vorlagen behandelt. Zum Beispiel xsl:value Attribut, das select werden bemerken, nimmt bereits einen Ausdruck als Inhalt.
  • Frage : Warum können Sie nicht value-of in einem Attribut zu verwenden, wie dies

    <element attr="<xsl:value-of select="$test"/>"/>
    

    Antwort . Da XSLT-Dokumente enthalten muss wohlgeformte XML (und das ist nicht)

  • Frage : Warum können Sie nicht {$varname} in Elementinhalt benutzen?

    Glib Antwort : weil XSLT Erschaffer es nicht, dass die Art und Weise entwerfen.

{$config} funktioniert nur in Attribute von XSLT-Elemente. (Anmerkung: Dollar in der Klammer, da der vollständige XPath-Ausdruck muss von Klammern umgeben sein)

Verwenden <xsl:value-of select="$config"/> statt {$config}.

@ lwburk Antwort groß ist (1), aber die letzte Frage / Antwort ist nur genau für XSLT 1.0 und 2.0. In 3.0 können Sie eine TVT ( Liste Wert Vorlage verwenden; ähnlich der AVT (Value Template Attribute) in @ lwburk Antwort erwähnt).

eine TVT verwenden möchten, fügen Sie das Standardattribut xsl:expand-text="yes" auf das Element. Dies wird der Prozessor dazu veranlassen geordneten Textknoten dieses Elements als TVT zu behandeln.

Beispiel:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

Output (unter Verwendung eines beliebigen wohlgeformte XML als Eingabe)

<result>This is Dan's result: BAM!</result>

. Hinweis: Getestet mit Saxon-PE 9.5

Weil Sie brauchen <xsl:value-of select="config"/> zu benutzen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top