XSLT简化版的OR条件语句

3

我在想是否有人记得如何在XSLT中编写更短的OR语句。我确定曾经有过一种方法,但现在无法回忆起来。

因此,不是这样:

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

我想使用一个更短的版本,类似于test="$var =['text1','text2']"。然而,我无法记住或找到这种情况下的正确速记语法。
如果有人能帮忙解决这个问题,我将非常感激!
谢谢!
5个回答

3

使用XSLT 2.0(但不是XSLT 1.0),您可以执行以下操作:

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

也许这就是您正在寻找的语法。

这就是我需要的!谢谢 :) 差不多就快成功了。 - DashaLuna

1

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

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

对于只有两个项目来说,这并不更短,但是当有5个或更多时,它看起来会更好。

话虽如此,当使用or时,您可能可以使用多行,因此最好只使用一系列的or:

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>

上面的代码将会输出:

匹配!

0

序列中没有“包含”函数,但您可以使用index-ofintersect

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

或者

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

虽然如此,只用两个字符串,您的原始解决方案更短。


0

[]运算符仅适用于节点集。也许您在说像[a|b]这样的语句时,想要从节点集中选择具有子元素a或子元素b的节点。但是对于字符串比较,我不知道除了使用"或"之外还有其他方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接