2011-12-14 11 views
9

tengo un xml similar, los valores pueden serComprobación de todos los valores en el elemento son los mismos

<n1>value1</n1> 
<n1>value1</n1> 
<n1>value2</n1> 

tengo que comprobar si todos estos valores son iguales y si es la misma que iba a necesitar para asignarlo a otro elemento. Estoy usando XSLT v1.0.

Gracias,

+0

yo estaba tratando con-hermano precedente, pero podría hacerlo funcionar – Arun

Respuesta

0

asumir un documento de esta forma:

<root> 
    <n1>value1</n1> 
    <n1>value1</n1> 
    <n1>value1</n1> 
</root> 

La siguiente hoja de estilo sencillo determina si cada elemento n1 tiene el mismo valor:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
     <xsl:value-of select=" 
      concat('All same? ', count(/*/n1[.=/*/n1[1]])=count(/*/n1))"/> 
    </xsl:template> 
</xsl:stylesheet> 

de salida:

All same? true 

La clave de esta hoja de estilo es la expresión:

count(/*/n1[.=/*/n1[1]])=count(/*/n1)) 

... que compara el recuento de los n1 elementos cuyo valor es igual al valor del primer elemento n1 a la cuenta de todos los elementos n1. Estos recuentos serán iguales solo cuando cada nodo n1 tenga el mismo valor.

Esto se puede hacer un poco más fácil de leer, seleccionando el primer n1 en una variable llamada n:

count($n[.=$n[1]])=count($n) 

realizar condicionalmente algún tipo de acción basado en el resultado como este:

<xsl:template match="/"> 
    <xsl:variable name="all" select="count(/*/n1[.=/*/n1[1]])=count(/*/n1)"/> 
    <xsl:if test="$all">All same</xsl:if> 
    <xsl:if test="not($all)">Not all same</xsl:if> 
</xsl:template> 
+0

Buena respuesta, pero hay una más simple/más corta :) –

12

Buena pregunta, +1.

sólo tiene que utilizar:

not(/*/n1[1] != /*/n1) 

Suponiendo que todos los n1 elementos se seleccionan en una variable denominada $v, Esto se puede expresar en tan sólo 14 expresión XPath caracteres de duración:

not($v[1] != $v) 

Explicación 1:

Por definición:

/*/n1[1] != /*/n1 

es true() exactamente si existe un nodo en /*/n1 cuyo valor de cadena no es igual al valor de la cadena de /*/n1[1]

La negación lógica de esto:

not(/*/n1[1] != /*/n1) 

es true() iff no nodo en /*/n1 existe cuyo stri ng value no es igual al valor de cadena de /*/n1[1], es decir, si todos los nodos en /*/n1 tienen el mismo valor de aguijón.

Explicación 2:

Esto se sigue de un ley negación doble más general:

every x has property y 

es equivalente a:

There is no x that doesn't have property y 
+1

+1 para usar la cuantificación existencial según lo previsto. –

Cuestiones relacionadas