XPath中是否存在异或“XOR”?

时间:2011-06-27 13:41:10

标签: xslt xpath

XPath1.0中是否存在异或“XOR”?

3 个答案:

答案 0 :(得分:18)

使用此XPath 1.0表达式

x and not(y)   or   y and not(x)

始终尝试避开!=运算符,因为当其一个或两个参数是节点集时,它具有意外的含义/行为。

在XSLT 2.0或XQuery 1.0中,可以将其编写为函数,然后在任何XPath表达式中仅使用该函数。下面是xor的XSLT 2.0函数定义和使用此函数的一个小例子:

<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 

答案 1 :(得分:3)

不,但你可以效仿它:

(a or b) and (a != b)

答案 2 :(得分:0)

/usr/local/bin:number($boolean_var)转换为true(),将1转换为false()。 (请注意,0单独处理节点!!)

trueboolean($numeric_var)转换为1,将true()转换为0

因此,XOR可以通过以下方式完成:

false()

即。使用boolean((number($v1) + number($v2) + number($v3)) mod 2)运算符添加最低有效位。是的,XPATH很麻烦。