XPath1.0'da özel bir OR 'XOR var mı?XPath'da özel bir OR 'XOR var mı?
cevap
kullanın bu XPath 1.0 ifade:
Daimax and not(y) or y and not(x)
beklenmeyen bir anlamı vardır, çünkü !=
operatörü kaçınıyorum/argümanlarından biri veya her ikisi de node-set olduğunda davranış.
XSLT 2.0 veya XQuery 1.0'da, bunu bir işlev olarak yazabilir ve daha sonra yalnızca herhangi bir XPath ifadesindeki işlevi kullanabilirsiniz. Bu dönüşüm bir XML belgesi (kullanılmaz) uygulanır
<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>
, istedik doğru sonucu üretilir: Aşağıdaki xor
için bir XSLT 2.0 fonksiyon tanımlama ve bu işlevi kullanarak küçük bir örnek
xor(true , true) = false
xor(true , false) = true
xor(false , true) = true
xor(false , false) = false
Hayır ama bunu taklit edebilir:
(a or b) and (a != b)
number($boolean_var)
true()
0
için 1
ve false()
dönüştürür. (true
tek başına bir düğüm adresleri unutmayın !!)
boolean($numeric_var)
1
false()
için true()
ve 0
dönüştürür. mod 2
operatörü kullanılarak
boolean((number($v1) + number($v2) + number($v3)) mod 2)
yani, en anlamlı bit ek:
Bu nedenle, XOR ile gerçekleştirilebilir. Evet, XPATH hantal.
+1 XPath 2.0 özelliklerine ve işlevselliği tam olarak gösteren bir demoya iyi örnek. (Ve zorlu varoluşsal karşılaştırmalardan kaçınmak.) – LarsH