2011-07-11 3 views
3

Comment quitter un modèle prématurément?comment quitter le modèle prématurément?

Comme je veux:

<xsl:template match="asd"> 
    <xsl:if test="$true">EXIT TEMPLATE()</xsl:if> 
    <!--my main code here--> 
</xsl:template> 

Je le fais de cette façon maintenant (ce qui fonctionne bien sûr), mais sans conteste le code ci-dessus est beaucoup plus propre s'il y a une variante de celui-ci qui fonctionne:

<xsl:template match="asd"> 
      <xsl:choose> 
       <xsl:when test="$true"></xsl:when> 
       <xsl:otherwise> 
        <!--my main code here--> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:template> 

Répondre

3

Il existe plusieurs façons de procéder. Si votre état ne contient pas une variable/référence de paramètre (qui ne sont pas autorisés dans les modèles de match dans XSLT 1.0), puis déplacer vers le haut dans le modèle de correspondance, comme ceci:

<xsl:template match="asd[not(<some_boolean_expression>)]"> 
    <!--my main code here--> 
</xsl:template> 

Si $true est une variable/paramètre de référence, puis appliquer conditionnellement modèles:

<xsl:template match="parent_of_asd"> 
    <xsl:apply-templates select="asd[not($true)]"/> 
</xsl:template> 

<xsl:template match="asd"> 
    <!--my main code here--> 
</xsl:template> 
2

Vous ne pouvez pas faire exactement ce que vous décrivez; XSLT est un langage déclaratif, pas un langage procédural, il n'est pas vraiment conçu en pensant au «flux de programme». Cependant, pour paraphraser votre exemple, vous pouvez le faire:

<xsl:template match="asd[not($true)]"> 
    <!--my main code here--> 
</xsl:template> 

L'inconvénient est que cela vous empêche d'entrer le modèle en premier lieu, de sorte que vous ne pouvez pas avoir quoi que ce soit avant le « si ». NB: Strictement parlant, la spécification pour XSLT1.0 n'est pas censée autoriser des variables dans une condition de correspondance comme celle-ci, mais de nombreux moteurs XSLT 1.0 le feront quand même, et ceci n'est un problème que si vous êtes réellement en état. a une variable comme celle-ci. XSLT 2.0 le permet officiellement, cependant.

+0

Cela doit être mentionné en tant que solution XSLT 2.0. –

+0

Non, ce n'est pas le cas. Je dois admettre que j'étais supposé que '$ true' était une représentation d'une condition plus significative de toute façon, mais vous pouvez définir une variable ou un paramètre dans la racine de la feuille de style et l'utiliser comme ceci dans XSLT1.0. – Flynn1179

+0

Non, vous ne pouvez pas. XSLT 1.0 ne prend pas en charge les références de variable dans les modèles de correspondance de modèle. Si vous supposez que $ true n'est pas une variable, cela doit être mentionné. –

2

Si:

  • vous n'utilisez pas XSLT 2.0 (@ la réponse de Flynn)
  • vous ne voulez pas vous débarrasser de votre référence variable ou utilisez l'approche apply-templates (@ réponse de Iwburk)

Vous pouvez toujours utiliser xsl:if et travailler avec une approche logique négative:

<xsl:if test="not($true)"> 
<!--your main code here--> 
</xsl:if>