Как вы проверяете, соответствует ли значение одному из набора значений?

#xslt #xslt-1.0

#xslt #xslt-1.0

Вопрос:

итак, в python вы можете проверить, как

 if value in ('value1', 'value2', ...):
    ....
  

есть ли equilvant в xslt?

 <xsl:if test="@value in ('value1', 'value2')">
    ...
</xsl:if>
  

без необходимости использовать длинный список операторов or @value = 'value1' or @value = 'value2'

Комментарии:

1. Да, есть эквивалент — даже в XSLT 1.0. Однако вам нужно предоставить менее абстрактный пример. Откуда берутся значения?

Ответ №1:

Вы можете использовать подобные наборы, которые проверяют, является ли значение частью набора:

 <xsl:if test="@value = ('value1', 'value2')">
  Succeeds if @value is either "value1" or "value2"
</xsl:if>
  

Низшая альтернатива в XSLT-1.0 использует отдельную проверку для каждого значения, подобного этому:

 <xsl:if test="@value = 'value1' or @value = 'value2'">
  Succeeds if @value is either "value1" or "value2"
</xsl:if>
  

Комментарии:

1. Сравнение наборов также возможно в XSLT 1.0.

2. @michael.hor257k: Спасибо. И я так ошибался, что эта функция доступна только для XSLT-2.0 :-/

3. Это основная функция языка XSLT. Единственным преимуществом XSLT 2.0 является простота создания последовательности по сравнению с набором узлов в XSLT 1.0.

4. Но XSLT 1.0 имеет только наборы узлов, а не наборы строк. Для работы первого примера вам нужна модель данных для поддержки последовательностей строк, а это поставляется только с XSLT 2.0.

5. @MichaelKay Как я уже сказал в комментарии к вопросу, мы не знаем, откуда берутся эти значения. Если они поступают из входного XML, то они могут уже быть набором узлов. Если они должны быть жестко запрограммированы в таблице стилей, их можно так же легко жестко запрограммировать, как и набор узлов. И если, как я подозреваю, OP использует libxslt, они могут просто преобразовать строку с разделителями в набор узлов, используя функцию str:tokenize() расширения EXSLT.