检查列表中是否包含xpath值

时间:2014-01-17 08:59:43

标签: xslt

我必须根据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是一个包含所需值列表的变量?

1 个答案:

答案 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, '|'))"/>