Функция IN в тестовом логическом выражении xslt - PullRequest
3 голосов
/ 11 октября 2011

нигде не может найти ответ, можете ли вы сделать test="$var in ('Val1','Val2','Val3')" в XSLT вместо test="$var='Val1' or $var='Val2' or $var='Val3'"?

Ответы [ 3 ]

2 голосов
/ 11 октября 2011

В XSLT 1.0 вы можете использовать функцию contains():

test(contains('Val1,Val2,Val3',$var))`

Возвращает логический результат, проверяя, содержит ли первая строкавторая строка

Обычный способ помочь уменьшить ложноположительные результаты для частичных совпадений строк - это использовать разделитель и дополнять значения этим разделителем:

test="contains(' Val1 Val2 Val3 ', concat(' ',$var,' '))

Таким образом, если значение $var был "Val", он вернул бы true, только если "Val" был добавлен в список тестируемых значений.

В XSLT 2.0 вы могли бы использовать:

test="$var = ('Val1','Val2','Val3')"

Он вернет true, если $var равно любому из элементов в последовательности (это то, что вы определяете, когда в скобках указан список значений, разделенных запятыми).

Другое решение XSLT 2.0:

test="some $value in ('Val1','Val2','Val3') satisfies $var=$value"
1 голос
/ 11 октября 2011

I.XPath 1.0 / XSLT 1.0

Использовать :

contains(concat($Sep, 'Val1', $Sep, 'Val2', $Sep, 'Val3', $Sep),
         concat($Sep, $var, $Sep)
        )

, где $Sep - строка, которая гарантированно не появится ни в одном из значений.

Объединение необходимо для исключения ложных срабатываний, когда одно или несколько значений начинаются с или заканчиваются значением $var.

Сравнение еще проще, если'Val1', 'Val2' и 'Val3' являются текстовыми узлами (скажем, /a/b) :

$var = /a/b

II.XPath 2.0 (XSLT 2.0)

$var = ('Val1', 'Val2', 'Val3')
0 голосов
/ 11 октября 2011

XSLT / XPath не поддерживает выражения IN.

Но вы можете сохранить эти значения во фрагменте XML и выполнить поиск внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...