Question

J'essaie d'utiliser des variables XSLT et je n'ai pas beaucoup de succès. J'espère que je vais faire quelque chose de stupide.

J'ai l'extrait de code suivant:

<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>

Je m'attends donc à ce qu'il y ait une variable 'config' définie sur la valeur de l'attribut 'config' de mon élément de niveau supérieur 'requête'.

J'essaie ensuite d'utiliser la variable plus tard dans ma feuille de style, par exemple:

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

mais la sortie que je vois dans mon document HTML de sortie est:

<*>

donc la valeur n'a pas été substituée comme je l'aurais prévu.

Je pense que c'est à peu près le cas le plus simple qui puisse exister, alors je fais quelque chose de stupide! S'il vous plaît aider, merci!

UPDATE Merci à tous ceux qui ont répondu. J'ai mal compris les différents contextes, que je travaille dans un attribut ou à l'extérieur. Trié mon problème bien!

Si je le pouvais, j'accepterais deux réponses, celle que j'ai et celle de @Aaron Digulla, qui explique les attributs.

Était-ce utile?

La solution

Dans votre feuille de style, vous devez utiliser:

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

au lieu de:

{$config}

Autres conseils

Il y a deux questions qui semblent identiques, mais qui sont légèrement différentes: 1) Comment dois-je référencer une variable par son nom? 2) puis-je référencer une variable par son nom?

Tout d'abord, les variables sont toujours référencées à l'aide de la syntaxe $varname. Deuxièmement, cela peut être fait partout où une expression est autorisée . C'est la deuxième partie de ceci qui semble confondre. Pour commencer, la valeur d'un élément ou d'un attribut sera par défaut affichée littéralement. Par conséquent, aucune variable n'est réellement référencée dans l'exemple suivant:

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

La sortie correspondra littéralement à ce qui a été tapé.

Pour afficher la valeur d'une variable, nous devons la référencer là où une expression est autorisée. Dans le contenu des éléments, nous utilisons xsl:value-of; dans les attributs traités comme un modèle de valeur d'attribut (par exemple, les attributs de résultat littéral), les expressions sont délimitées par des accolades {}. Supposons la déclaration suivante:

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

... puis ce qui suit:

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

... résulte en:

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

Quelques notes de départ sur les AVT et value-of:

  • Dans les deux cas, la variable a été référencée sous la forme $test. Les accolades dans un AVT ne font pas partie de la référence de variable; ce sont des délimiteurs d'expression.
  • Dans les deux cas, il n'est pas nécessaire que l'expression contienne une référence à une variable; toute expression XPath aurait été autorisée.
  • Tous les attributs d'un document XSLT ne sont pas traités comme des modèles de valeur d'attribut. Par exemple, notez que xsl:value l'attribut select accepte déjà une expression en tant que contenu.
  • Question : Pourquoi ne pouvez-vous pas utiliser {$varname} dans un attribut comme celui-ci?

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

    Réponse : les documents XSLT doivent contenir du XML bien formé (et ce n'est pas le cas).

  • Question : Pourquoi ne pouvez-vous pas utiliser <=> dans le contenu d'un élément?

    Réponse Glib : les concepteurs de XSLT ne l'ont pas conçu de cette façon.

{$config} ne fonctionne que dans les attributs d'éléments XSLT. (Remarque: dollar à l'intérieur de l'accolade, car l'expression XPath complète doit être entourée d'accolades.)

Utilisez <xsl:value-of select="$config"/> au lieu de {$config}.

La réponse de @ lwburk est excellente (+1), mais la dernière question / réponse n'est précise que pour XSLT 1.0 et 2.0. Dans la version 3.0, vous pouvez utiliser un TVT ( modèle de valeur textuelle ; similaire à l'AVT (Attribute Value Template) mentionné dans la réponse de @ lwburk).

Pour utiliser un TVT, ajoutez l'attribut standard xsl:expand-text="yes" à l'élément. Le processeur traitera alors les nœuds de texte descendants de cet élément comme un TVT.

Exemple:

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>

Sortie (en utilisant un XML bien formé comme entrée)

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

Remarque: testé avec Saxon-PE 9.5.

Parce que vous devez utiliser <xsl:value-of select="config"/>?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top