a) Могу ли я автоматически получить значение логического true | false непосредственно из строки 'true | false'?
b) Существует ли конструкция (xpath?) Для сопоставления логического true | false с '*', ''?
Это на самом деле вопрос XPath .
I.XPath 1.0
Существует несколько выражений XPath, вычисление которых дает желаемый результат:
substring('*', 2 -(@flag = 'true'))
Это также отвечает б) - обратите внимание, что строки 'true'
и 'false'
не являются логическими значениями!Единственными двумя логическими значениями являются true()
и false()
, и они не являются строками.
В вышеприведенном выражении мы используем тот факт, что в XPath 1.0, если логическое значение находится в контексте, где требуется число,он автоматически конвертируется в число.По определению:
number(true())
равно 1
и
number(false())
равно 0
Таким образом, второй аргумент вызоваsubstring()
выше:
2 - (@flag = 'true')
оценивается как 1
при @flag = 'true'
и 2
в противном случае.
Более общее выражение XPath 1.0, которое создает строку$s1
, если $val
равно "x"
и генерирует строку $s2
, если $val
равно "y"
:
concat(substring($s1, 1 div ($val = "x")),
substring($s2, 1 div ($val = "y"))
)
Это приводит к строке $s1
при $val = "x"
, строка $s2
, когда $val = "y"
, и пустая строка - если не выполняется ни одно из этих двух условий.
Вышеприведенное выражение XPath 1.0 можно обобщить, чтобы получить N различных результатов строки $s1
, $2
, ..., $sN
точно, когда $val
является одним из значений $v1
, $v2
, ..., $vN
, потому что функция concat()
может иметь любое количество аргументов.
II.XPath 2.0 (XSLT 2.0)
'*'[current()/@flag = 'true']
И в более общем смысле, учитывая 2 * N атомных значений $s1
, $s2
, ... $sN
и $v1
, $v2
, ..., $vN
, так что все значения $vi
различны, результат вычисления выражения XPath 2.0:
($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)]
равен $sK
точно, когда $v eq $vK
.