vérification de la valeur d'une variable dans une variable de priorité supérieure dans XSLT

StackOverflow https://stackoverflow.com/questions/400909

  •  03-07-2019
  •  | 
  •  

Question

Je dois pouvoir vérifier ce que le " courant " la valeur d'une variable est dans une redéclaration de cette même variable dans un xslt différent incluant l'autre.

main.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="other.xslt"/>
    <xsl:variable name="email">
        <xsl:if test="string-length($email) = 0">
            bar@foo.com
        </xsl:if>
    </xsl:variable>
    <xsl:template match="/">
        <Email>
            <xsl:value-of select="$email"/>
        </Email>
    </xsl:template>
</xsl:stylesheet>

other.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="email">foo@bar.com</xsl:variable>
</xsl:stylesheet>

Ce que je voudrais faire est de pouvoir vérifier quelle sera la valeur de la variable de priorité inférieure pour voir si j'ai besoin de l'écraser dans la variable du xslt actuel. (disclaimer - le code actuel plante cruellement)

Était-ce utile?

La solution

Comme d'autres l'ont noté, l'ajout d'une valeur par défaut à une variable globale définie dans une feuille de style importée ne peut pas être effectué à l'aide du même nom de variable . En effet, la variable portant ce nom, définie dans la feuille de style xslt actuelle, a une priorité supérieure à celle de la feuille de style importée et seule la première sera utilisée (vous ne pouvez pas accéder à la variable portant le même nom dans la feuille de style de priorité inférieure).

Voici comment on peut ajouter une valeur par défaut :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--                                            -->
  <xsl:import href="other.xsl"/> 
<!--                                            -->
    <xsl:variable name="vMyEmail" select=
     "concat(substring('bar@foo.com', 1 div not($vEmail)), $vEmail)"
     />
<!--                                            -->
    <xsl:template match="/">
      <xsl:value-of select="$vMyEmail"/>
    </xsl:template>
</xsl:stylesheet>

Notez que la variable globale $ vMyEmail est définie de telle sorte qu'elle ait la valeur de la variable < code> $ vEmail (défini dans la feuille de style importée) s'il s'agit d'une chaîne de longueur d'au moins 1 ou de la valeur par défaut souhaitée - sinon.

En utilisant cette technique, on utilisera le $ vMyEmail ainsi défini n'importe où après sa définition. La variable $ vEmail de la feuille de style importée ne sera pas utilisée directement du tout .

Autres conseils

Vous ne pouvez pas faire ce que vous voulez directement, vous devez définir une seconde variable.

Mais je ne comprends pas l’intention: si cela était basé sur un modèle, vous pourriez fournir une valeur par défaut à n’importe quel paramètre (qui agit de manière très similaire aux variables). La façon dont vous formulez la question donne à penser que c’est la bonne approche pour moi, mais pouvez-vous préciser le lien et l’utilisation de ces modèles?

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