Есть ли в XPath эксклюзивный ИЛИ XOR? - PullRequest
13 голосов
/ 27 июня 2011

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

Ответы [ 3 ]

19 голосов
/ 28 июня 2011

Используйте это выражение 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), '&#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 
3 голосов
/ 27 июня 2011

Нет, но вы можете подражать ему:

(a or b) and (a != b)
0 голосов
/ 16 декабря 2016

number($boolean_var) преобразует true() в 1 и false() в 0. (Обратите внимание, что только true обращается к узлу !!)

boolean($numeric_var) преобразует 1 в true() и 0 в false().

Следовательно, XOR может быть выполнен:

boolean((number($v1) + number($v2) + number($v3)) mod 2)

т.е. добавление младшего значащего бита с использованием оператора mod 2. Да, XPATH громоздка.

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