Используйте это выражение XPath 1.0 :
x and not(y) or y and not(x)
Всегда старайтесь избегать оператора !=
, потому что он имеет неожиданное значение / поведение, когда один или оба его аргумента являются наборами узлов.
В 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