我想知道是否有人记得如何在XSLT中编写更短的OR语句。我确信有办法,但我记不起来了。
所以而不是
test="$var = 'text1' or $var = 'text2'"
我想使用较短的版本,例如test =“$ var = ['text1','text2']”但是,我无法记住或找到适合此类情况的简写语法。
如果有人可以提供帮助,我真的很感激!
非常感谢
答案 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))
只有两个字符串,但原始解决方案更短。