2010-02-11 18 views
2

我想知道是否有人記得如何在XSLT中編寫較短的OR語句。我確信有一種方法,但我不記得了。XSLT較短版本的OR條件語句

所以不是

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

我想使用一個較短的版本像測試=「$ VAR = [‘文本1’,‘文本2’]」但是,我不記得或者找到這種情況的正確速記語法。

如果有人能幫上忙,我會很感激!

非常感謝

回答

2

使用XSLT 2.0(但不與XSLT 1.0),你可以做

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

也許這就是你正在尋找的語法。

+0

這就是我需要的!謝謝:)快到了。 – DashaLuna 2010-02-12 09:50:02

0

[]運算符只適用於nodeset。也許你正在想當你說[a | b]之類的東西來選擇你的節點集中有一個子元素b的子元素的節點。但對於字符串比較,除了使用「或」之外,我不知道任何其他方式。

1

對於字符串值,你似乎是使用你可以使用CONCAT絕招: -

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

只是兩個項目爲不短但由於5個或更多,它開始看起來更好。

說了這麼多,你使用或公司時,所以它可能是隻是爲了更好地使用一系列或年代大概可以多行: -

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

更多的文本,但更清晰的解決方案。

1

如果你發現你做很多比較針對一組固定的值,你也可以這樣做:

<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> 

上面會打印

 
Match! 
0

沒有「包含」功能對於序列,但您可以使用索引相交

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

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

由於只有兩根弦,你原來的解決方案是較短的,但。