2014-01-17 4 views
1

Мне нужно установить значение переменной в XSLT на основании того, является ли значение в xpath одним из списка значений. Есть ли способ, кроме делатьПроверьте, содержится ли значение xpath в списке

<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 - переменная, содержащая список требуемых значений?

ответ

3

В XSLT 2.0 вы можете иметь последовательности атомарных значений, так что вы можете сделать

<xsl:variable name="isBuyable" select="$someVar = ('A', 'B', 'C')" /> 

В 1.0 у вас есть только наборы узлов, а не атомные последовательности, так что это немного более неудобный. Если ваш процессор поддерживает функцию node-set расширения (в msxsl один для процессоров Microsoft, 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, '|'))"/> 
+0

Я использую 1.0 и думал сделать это с помощью subsring, если список способов не существует. –

Смежные вопросы