2009-10-21 5 views
2

J'aimerais appliquer un modèle avec des paramètres différents en fonction du résultat d'une condition. Quelque chose comme ceci:XSLT: Appliquer des modèles avec des paramètres conditionnels?

<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, je soupçonne que cela pourrait être résolu d'une manière beaucoup, beaucoup mieux. (Je suis entièrement nouveau à XSLT, alors s'il vous plaît suggérer des améliorations et pardonner le code boursouflé.)

Maintenant pour la question: comment aurais-je pu définir les paramètres basés sur ce conditionnel, et les utilisait toujours dans un xsl:apply-templates? J'ai essayé d'envelopper l'ensemble xsl:choose avec un xsl:apply-templates de démarrage/balise de fin, mais c'est apparemment pas légal. Des indices?

Répondre

9

Une autre méthode serait de mettre le xsl: choisir des déclarations dans le xsl: éléments 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> 
+0

+1. Battez-moi. ;-) Merci – Tomalak

+0

, Tim C! Cela semble mieux. – conciliator

3

Rien de mal à votre méthode, mais vous pouvez également ajouter votre condition dans xsl:template match attribut. Cela conduira à un seul xsl:apply-templates, mais plusieurs xsl:template éléments

+0

Merci Rubens, mais je ne suis pas tout à fait sûr de ce que vous êtes visant à ... Je suis encore trop inexpérimenté pour vous suivre sans aucun exemple concret. – conciliator

3

Vous pouvez vous débarrasser de tout ce que la logique et les modes en extrayant vos conditions en prédicats. Vous ne dites pas ce que le nom de l'élément que vous avez affaire à l'est, mais en supposant qu'il est appelé foo alors quelque chose comme cela 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> 
Questions connexes