Référence une variable XSLT via un nom dynamique
Je suis coincé avec un petit problème.
Le XSL-Fichier:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/">
<xsl:variable name="unumericValue" select="10" />
<xsl:variable name="uanotherValue" select="8" />
<xsl:for-each select="/root/try">
<xsl:value-of select="var" />
<xsl:variable name="min"><xsl:value-of select="@minimum" /></xsl:variable>
<xsl:value-of select="@type" />
<xsl:variable name="referenceName"><xsl:value-of select='concat("u",var)' /></xsl:variable>
<xsl:value-of select="$referenceName" />
<xsl:if test='$referenceName > $min'>
<p>Do something.</p>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Le Fichier XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="q1.xsl"?>
<root>
<try type="compare" minimum="9">
<var>numericValue</var>
<something>...</something>
</try>
<try type="compare" minimum="10">
<var>anotherValue</var>
<something>...</something>
</try>
</root>
Comme vous pouvez le voir le fichier XML a deux var-Éléments qui devraient correspondre aux variables du XSLT-Fichier. Cependant, je ne sais pas quelle Syntaxe est correcte.
$referenceName est juste le nom de la variable que je veux utiliser. Mais je ne sais pas comment faire pour référence le nom de la variable existante.
Vous devez vous connecter pour publier un commentaire.
$referenceName
n'est pas une référence à la variable avec le nom "unumericValue" ou autrement. C'est juste la valeur de chaîne "unumericValue", etc. De sorte que ne sera jamais supérieure à$min
. Cependant, avec un peu de travail supplémentaire, il existe une astuce pour trouver une variable par son nom:Une grande limitation à noter ici est que cela ne fonctionne que pour les variables qui sont une constante de valeur numérique.
Voici une façon de simuler des variables constante d'une chaîne de valeurs:
Et enfin, une façon de simuler des variables avec des valeurs calculées:
De la dernière approche est probablement la plus orthodoxe, mais nécessite le processeur XSLT-dépendante (au moins en XSLT 1.0)
node-set()
fonction.Par la voie, ne pas faire ceci:
quand vous pourriez faire ceci:
Ce n'est pas seulement informative, c'est aussi inefficace: il n'y a pas besoin de copier les données et construire un nouvel arbre, qui est une opération très coûteuse, quand tout ce que vous voulez, c'est une référence à un nœud existant.
Comme avec la plupart des langages de programmation, XSLT, les noms de variables ne sont pas accessibles au moment de l'exécution. La variable peut même ne pas exister au moment de l'exécution - l'optimiseur est autorisé à jouer toutes sortes de trucs, comme l'in-lining, toutes les références à la variable au point où la variable est utilisée.
La meilleure approche est d'avoir une variable avec un nom standard, et de lui donner du contenu XML. Les noms d'élément et attribut dans le XML sont accessibles au moment de l'exécution, à la différence des noms de variables.