Есть ли в XPath1.0 эксклюзивный OR 'XOR'?
Есть ли эксклюзивный OR XOR в XPath?
Ответ 1
Используйте это выражение XPath 1.0:
x and not(y) or y and not(x)
Всегда старайтесь избегать оператора !=
, поскольку он имеет неожиданное значение/поведение, когда один или оба его аргумента node -sets.
В XSLT 2.0 или XQuery 1.0 можно записать это как функцию, а затем использовать только функцию в любом выражении XPath. Ниже приведено определение функции XSLT 2.0 для xor
и небольшой пример использования этой функции:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="my:f">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select=
"for $x in (true(), false()),
$y in (true(), false())
return
('xor(', $x, ',', $y,') = ', f:xor($x, $y), '
')
"/>
</xsl:template>
<xsl:function name="f:xor">
<xsl:param name="pX" as="xs:boolean"/>
<xsl:param name="pY" as="xs:boolean"/>
<xsl:sequence select=
"$pX and not($pY) or $pY and not($pX)"/>
</xsl:function>
</xsl:stylesheet>
, когда это преобразование применяется к любому XML-документу (не используется), желаемый, правильный результат получается:
xor( true , true ) = false
xor( true , false ) = true
xor( false , true ) = true
xor( false , false ) = false
Ответ 2
Нет, но вы можете эмулировать его:
(a or b) and (a != b)
Ответ 3
number($boolean_var)
преобразует true()
в 1
и false()
в 0
. (Обратите внимание, что только true
обращается к node!!)
boolean($numeric_var)
преобразует 1
в true()
и 0
в false()
.
Следовательно, XOR может быть выполнено:
boolean((number($v1) + number($v2) + number($v3)) mod 2)
то есть. добавление наименьших значащих бит с использованием оператора mod 2
. Да, XPATH является громоздким.