Есть ли эксклюзивный OR XOR в XPath?

Есть ли в XPath1.0 эксклюзивный OR 'XOR'?

Ответ 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), '&#xA;')
  "/>
 </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 является громоздким.