XSLT更短版本的OR条件语句

时间:2010-02-11 10:35:16

标签: xslt

我想知道是否有人记得如何在XSLT中编写更短的OR语句。我确信有办法,但我记不起来了。

所以而不是

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

我想使用较短的版本,例如test =“$ var = ['text1','text2']”但是,我无法记住或找到适合此类情况的简写语法。

如果有人可以提供帮助,我真的很感激!

非常感谢

5 个答案:

答案 0 :(得分:2)

使用XSLT 2.0(但不能使用XSLT 1.0),您可以执行

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

也许这就是你要找的语法。

答案 1 :(得分:1)

对于您似乎正在使用的字符串值,您可以使用concat技巧: -

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

仅仅两个项目不短,但是给定5个或更多,它开始看起来更好。

说过你可能在使用时可以多线,所以最好只使用一系列或者: -

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

更多文字,但更清晰的解决方案。

答案 2 :(得分: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!

答案 3 :(得分:0)

[]运算符仅适用于节点集。也许你在考虑什么时候你会说[a | b]来从你的节点集中选择具有子元素a 子元素b的节点。但是对于字符串比较,我不知道除了使用“或”之外的任何其他方式。

答案 4 :(得分:0)

序列没有'包含'功能,但您可以使用 index-of intersect

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

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

只有两个字符串,但原始解决方案更短。