我必须根据xpath中的值是否是值列表中的一个来在XSLT中设置变量值。除了做
之外还有什么办法吗?<xsl:variable name="isBuyable">
<xsl:choose>
<xsl:when test="$someVar='A'">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:when test="$someVar='B'">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:when test="$someVar='C'">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
或喜欢
<xsl:variable name="isBuyable">
<xsl:choose>
<xsl:when test="$someVar='A' or $someVar='B' or $someVar='C'">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
someVar
保存xpath中的值。
是否可以执行<xsl:when test="contains($listVar, $someVar)>"
之类的操作,其中listVar
是一个包含所需值列表的变量?
答案 0 :(得分:3)
在XSLT 2.0中,您可以拥有原子值序列,因此可以执行
<xsl:variable name="isBuyable" select="$someVar = ('A', 'B', 'C')" />
在1.0中你只有节点集,而不是原子序列,所以它更加繁琐。如果您的处理器支持node-set
扩展功能(用于Microsoft处理器的msxsl,对于大多数其他处理器,则为exslt),那么您可以执行
<xsl:variable name="buyableValuesRTF">
<val>A</val>
<val>B</val>
<!-- etc -->
</xsl:variable>
<xsl:variable name="buyableValues" select="exslt:node-set($buyableValuesRTF)/val"/>
创建一个包含有效值的节点集,然后可以与之进行比较:
<xsl:variable name="isBuyable" select="$someVar = $buyableValues"/>
在这两个版本中,这是有效的,因为如果左边的任何元素匹配任何=比较成功>右边的那些。
要在没有扩展功能的1.0中执行此操作,您必须使用子字符串匹配伪造序列 - 将允许值列表定义为由某些字符分隔的字符串,该字符串不在任何值中
<xsl:variable name="buyableValues" select="'|A|B|C|'"/>
并使用contains
函数检查子字符串:
<xsl:variable name="isBuyable" select="contains($buyableValues,
concat('|', $someVar, '|'))"/>