2011-06-27 6 views

cevap

15

kullanın bu XPath 1.0 ifade:

Daima
x 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), '&#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> 

, 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 
+0

+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

4

Hayır ama bunu taklit edebilir:

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

xpath2.0'da var mıdır? –

+1

XPath 2.0'da yok. – Erlock

+2

@Christophe: "a" ve "b" nin tek bir boole değerleri olduğunu varsayarsak bu çalışır. Eğer biri nodet ise, varolan karşılaştırmalara dikkat edin. Daha güvenli bir form, (a veya b) ve (a ve b) değil. – LarsH

0

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)1false() 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.