XPath1.0中是否存在异或“XOR”?
答案 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), '
')
"/>
</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
单独处理节点!!)
true
将boolean($numeric_var)
转换为1
,将true()
转换为0
。
因此,XOR可以通过以下方式完成:
false()
即。使用boolean((number($v1) + number($v2) + number($v3)) mod 2)
运算符添加最低有效位。是的,XPATH很麻烦。