2010-02-11 7 views
2

Je me demandais si quelqu'un se souvient comment écrire une déclaration OR plus courte dans XSLT. Je suis sûr qu'il y avait un moyen mais je ne m'en souviens pas.XSLT version plus courte de l'instruction conditionnelle OR

Ainsi, au lieu de

test="$var = 'text1' or $var = 'text2'" 

Je voudrais utiliser une version plus courte comme test = "$ var = [ 'text1', 'texte2']" Cependant, je ne me souviens pas ou trouver syntaxe raccourcie droite pour de tels cas.

Vraiment apprécier si quelqu'un pouvait aider avec ça!

Un grand merci

Répondre

2

Avec XSLT 2.0 (mais pas avec XSLT 1.0) vous pouvez faire

<xsl:if test="$var = ('text1','text2')"> 

Peut-être est la syntaxe que vous recherchez.

+0

C'est ce dont j'avais besoin! Merci :) Était presque là. – DashaLuna

0

L'opérateur [] ne fonctionne que sur un ensemble de nœuds. Peut-être que vous pensez à quand vous dites quelque chose comme [a | b] pour sélectionner des nœuds de votre nœud qui ont un élément enfant ou un élément enfant b. Mais pour la comparaison de chaînes, je ne connais pas d'autre moyen que d'utiliser "ou".

1

Pour les valeurs de chaîne que vous semblez utiliser, vous pouvez utiliser une astuce concat: -

test="contains('__text1____text2__', concat('__', $var, '__'))" 

Pas plus court pour deux articles mais étant donné 5 ou plus, il commence à regarder mieux.

Cela dit, vous pouvez probablement plusieurs lignes lors de l'utilisation ou de sorte qu'il peut être mieux d'utiliser directement une série de ou de: -

test = " 
    $var = 'text1' 
    or $var = 'text2' 
    or $var = 'text3' 
    or $var = 'text3'" 

texte plus mais une solution plus claire.

1

Si vous trouvez que vous faites beaucoup de comparaisons par rapport à un ensemble fixe de valeurs, vous pouvez aussi le faire:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:cfg="http://tempuri.org/config" 
    exclude-result-prefixes="cfg" 
> 
    <xsl:output method="text" /> 

    <!-- prepare a fixed list of possible values; note the namespace --> 
    <config xmlns="http://tempuri.org/config"> 
    <val>text1</val> 
    <val>text2</val> 
    <!-- ... --> 
    </config> 

    <!-- document('') lets you access the stylesheet itself --> 
    <xsl:variable name="cfg" select="document('')/*/cfg:config/cfg:val" /> 

    <xsl:template match="/"> 
    <xsl:variable name="var" select="'text2'" /> 

    <!-- check against all possible values in one step --> 
    <xsl:if test="$cfg[.=$var]"> 
     <xsl:text>Match!</xsl:text> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Ce qui précède imprimer

 
Match! 
0

Il n'y a pas « contient » fonction pour des séquences, mais vous pouvez utiliser index de ou Intersection:

fn:exists(('test1', 'test2') intersect $var)) 

ou

fn:exists(fn:index-of(('test1', 'test2'), $var)) 

Avec seulement deux cordes, votre solution originale est plus courte que.

Questions connexes