2011-06-27 21 views

Respuesta

15

Utilice esta XPath 1.0 expresión:

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

Siempre trate de evitar la != operador, porque tiene un significado inesperado/comportamiento cuando uno o ambos de sus argumentos son conjuntos de nodos.

En XSLT 2.0 o XQuery 1.0 se puede escribir esto como una función y luego usar solo la función en cualquier expresión XPath. A continuación se muestra una definición de función 2.0 XSLT para xor y un pequeño ejemplo del uso de esta función:

<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> 

cuando se aplica esta transformación en cualquier documento XML (no se utiliza), el, resultado correcto querido se produce:

xor(true , true) = false 
xor(true , false) = true 
xor(false , true) = true 
xor(false , false) = false 
+0

+1 buen ejemplo de las características de XPath 2.0 y de una demostración que demuestra a fondo la funcionalidad. (Y evitar comparaciones existenciales difíciles.) – LarsH

4

No, pero se puede emular:

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

gracias ¿verdad si existe en xpath2.0? –

+1

No existe ni en XPath 2.0. – Erlock

+2

@Christophe: Esto funciona si suponemos que 'a' y' b' son valores booleanos únicos. Si cualquiera de los dos es un conjunto de nodos, tenga cuidado con las comparaciones existenciales. Una forma más segura sería '(ao b) y no (a y b)'. – LarsH

0

number($boolean_var) convierte true()-1 y false() a 0. (Tenga en cuenta que true solo aborda un nodo !!)

boolean($numeric_var) convierte 1-true() y 0 a false().

Por lo tanto, XOR se puede lograr por:

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

es decir, adición menos significativo bits usando el operador mod 2. Sí, XPATH es engorroso.

Cuestiones relacionadas