#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.