Question

J'aimerais appliquer un modèle avec différents paramètres en fonction du résultat d'une condition. Quelque chose comme ça:

<xsl:choose>
    <xsl:when test="@attribute1">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 1</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:when test="@attribute2">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 2</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Error</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes">No matching attribute   </xsl:with-param>
            </xsl:apply-templates>
    </xsl:otherwise>
</xsl:choose>

Tout d’abord, j’imagine que cela pourrait être résolu d’une bien meilleure façon. (Je suis entièrement nouveau dans XSLT, alors suggérez des améliorations et pardonnez le code gonflé.)

Maintenant, posons-nous la question suivante: comment pourrais-je définir les paramètres en fonction de cette condition, et les utiliser quand même dans un xsl: apply-templates ? J'ai essayé d'emballer tout le code xsl: choisissez avec une balise de début / fin xsl: apply-templates , mais ce n'est apparemment pas légal. Des indices?

Était-ce utile?

La solution

Une autre méthode consiste à placer les instructions xsl: Choose dans les éléments xsl: param

<xsl:apply-templates select="." mode="custom_template">
   <xsl:with-param name="attribute_name" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1">Attribute no. 1</xsl:when>
         <xsl:when test="@attribute2">Attribute no. 2</xsl:when>
         <xsl:otherwise>Error</xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
   <xsl:with-param name="attribute_value" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:when test="@attribute2"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:otherwise>No matching attribute </xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
</xsl:apply-templates>

Autres conseils

Votre méthode n'a rien d'anormal, mais vous pouvez également ajouter votre conditionnel dans l'attribut xsl: template match . Cela conduira à un seul xsl: apply-templates , mais à plusieurs éléments xsl: template

Vous pouvez vous débarrasser de toute cette logique et de ces modes en extrayant vos conditions dans des prédicats. Vous ne dites pas quel est le nom de l'élément avec lequel vous faites affaire, mais en supposant qu'il s'appelle toto , alors quelque chose comme ceci devrait suffire:

<xsl:template match="foo[@attribute1]">
    <!-- 
         do stuff for the case when attribute1 is present 
         (and does not evaluate to false) 
    -->
</xsl:template>

<xsl:template match="foo[@attribute2]">
    <!-- 
         do stuff for the case when attribute2 is present 
         (and does not evaluate to false)
    -->
</xsl:template>

<xsl:template match="foo">
    <!-- 
         do stuff for the general case  
         (when neither attribute1 nor attribute 2 are present) 
    -->
</xsl:template>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top