2011-04-13 19 views
14

Soy nuevo en XSLT, puede alguien por favor me sugieren cómo comparar dos elementos procedentes de XML como una cadena sus valores son:Para comparar dos elementos (tipo de cadena) en XSLT?

<OU_NAME>Vision Operations</OU_NAME> --XML code 
<OU_ADDR1>90 Fifth Avenue</OU_ADDR1> --XML code 

<xsl:choose> 
    <xsl:when test="OU_NAME='OU_ADDR1'"> --comparing two elements coming from XML 
     <!--remove if adrees already contain operating unit name 
      <xsl:value-of select="OU_NAME"/> <fo:block/>--> 
     <xsl:if test="OU_ADDR1 !='' "> 
      <xsl:value-of select="OU_ADDR1"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="LE_ADDR2 !='' "> 
      <xsl:value-of select="OU_ADDR2"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="LE_ADDR3 !='' "> 
      <xsl:value-of select="OU_ADDR3"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="OU_TOWN_CITY !=''"> 
      <xsl:value-of select="OU_TOWN_CITY"/>, 
      <fo:leader leader-pattern="space" leader-length="2.0pt"/> 
     </xsl:if> 
     <xsl:value-of select="OU_REGION2"/> 
     <fo:leader leader-pattern="space" leader-length="3.0pt"/> 
     <xsl:value-of select="OU_POSTALCODE"/> 
     <fo:block/> 
     <xsl:value-of select="OU_COUNTRY"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="OU_NAME"/> 
     <fo:block/> 
     <xsl:if test="OU_ADDR1 !='' "> 
      <xsl:value-of select="OU_ADDR1"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="LE_ADDR2 !='' "> 
      <xsl:value-of select="OU_ADDR2"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="LE_ADDR3 !='' "> 
      <xsl:value-of select="OU_ADDR3"/> 
      <fo:block/> 
     </xsl:if> 
     <xsl:if test="OU_TOWN_CITY !=''"> 
      <xsl:value-of select="OU_TOWN_CITY"/>, 
      <fo:leader leader-pattern="space" leader-length="2.0pt"/> 
     </xsl:if> 
     <xsl:value-of select="OU_REGION2"/> 
     <fo:leader leader-pattern="space" leader-length="3.0pt"/> 
     <xsl:value-of select="OU_POSTALCODE"/> 
     <fo:block/> 
     <xsl:value-of select="OU_COUNTRY"/> 
    </xsl:otherwise> 
</xsl:choose> 

Respuesta

30

En primer lugar, el código de tiempo proporcionado:

<xsl:choose> 
     <xsl:when test="OU_NAME='OU_ADDR1'"> --comparing two elements coming from XML    
      <!--remove if adrees already contain operating unit name <xsl:value-of select="OU_NAME"/> <fo:block/>--> 
      <xsl:if test="OU_ADDR1 !='' "> 
       <xsl:value-of select="OU_ADDR1"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR2 !='' "> 
       <xsl:value-of select="OU_ADDR2"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR3 !='' "> 
       <xsl:value-of select="OU_ADDR3"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="OU_TOWN_CITY !=''"> 
       <xsl:value-of select="OU_TOWN_CITY"/>, 
       <fo:leader leader-pattern="space" leader-length="2.0pt"/> 
      </xsl:if> 
      <xsl:value-of select="OU_REGION2"/> 
      <fo:leader leader-pattern="space" leader-length="3.0pt"/> 
      <xsl:value-of select="OU_POSTALCODE"/> 
      <fo:block/> 
      <xsl:value-of select="OU_COUNTRY"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="OU_NAME"/> 
      <fo:block/> 
      <xsl:if test="OU_ADDR1 !='' "> 
       <xsl:value-of select="OU_ADDR1"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR2 !='' "> 
       <xsl:value-of select="OU_ADDR2"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR3 !='' "> 
       <xsl:value-of select="OU_ADDR3"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="OU_TOWN_CITY !=''"> 
       <xsl:value-of select="OU_TOWN_CITY"/>, 
       <fo:leader leader-pattern="space" leader-length="2.0pt"/> 
      </xsl:if> 
      <xsl:value-of select="OU_REGION2"/> 
      <fo:leader leader-pattern="space" leader-length="3.0pt"/> 
      <xsl:value-of select="OU_POSTALCODE"/> 
      <fo:block/> 
      <xsl:value-of select="OU_COUNTRY"/> 
     </xsl:otherwise> 
    </xsl:choose> 

es equivalente a esto, el código mucho más corto:

<xsl:if test="not(OU_NAME='OU_ADDR1)'"> 
       <xsl:value-of select="OU_NAME"/> 
     </xsl:if> 
      <xsl:if test="OU_ADDR1 !='' "> 
       <xsl:value-of select="OU_ADDR1"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR2 !='' "> 
       <xsl:value-of select="OU_ADDR2"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="LE_ADDR3 !='' "> 
       <xsl:value-of select="OU_ADDR3"/> 
       <fo:block/> 
      </xsl:if> 
      <xsl:if test="OU_TOWN_CITY !=''"> 
       <xsl:value-of select="OU_TOWN_CITY"/>, 
       <fo:leader leader-pattern="space" leader-length="2.0pt"/> 
      </xsl:if> 
      <xsl:value-of select="OU_REGION2"/> 
      <fo:leader leader-pattern="space" leader-length="3.0pt"/> 
      <xsl:value-of select="OU_POSTALCODE"/> 
      <fo:block/> 
      <xsl:value-of select="OU_COUNTRY"/> 

Ahora, a su pregunta:

cómo comparar dos elementos próximos de XML como una cadena

En XPath 1.0 cuerdas pueden compararse sólo para la igualdad (o desigualdad), usando el operador = y la función not() junto con el operador =.

$str1 = $str2 

evalúa a true() exactamente cuando la cadena $str1 es igual a la cadena $str2.

not($str1 = $str2) 

evalúa a true() exactamente cuando la cadena $str1 no es igual a la cadena $str2.

También existe el operador !=. Por lo general, debe evitarse porque tiene un comportamiento anómalo cuando uno de sus operandos es un conjunto de nodos.

Ahora, las reglas para la comparación de dos nodos de elemento son similares:

$el1 = $el2 

evalúa a true() exactamente cuando el valor de cadena de $el1 es igual al valor de cadena de $el2.

not($el1 = $el2) 

evalúa a true() exactamente cuando el valor de cadena de $el1 no es igual al valor de la cadena de $el2.

Sin embargo, si uno de los operandos de = es un conjunto de nodos, a continuación,

$ns = $str 

evalúa a true() exactamente cuando hay al menos un nodo en el conjunto de nodos $ns1, cuya cadena de valor es igual a la cadena $str

$ns1 = $ns2 

evalúa a true() exactamente cuando hay al menos un nodo en el conjunto de nodos $ns1, cuyo valor de cadena es igual a el valor de cadena de algún nodo de $ns2

Por lo tanto, la expresión:

OU_NAME='OU_ADDR1' 

evalúa a true() sólo cuando hay al menos un hijo elemento del nodo actual que se nombra OU_NAME y cuyo valor de cadena es la cadena 'OU_ADDR1'.

Esto obviamente no es lo que quieres!

Lo más probable es que desee:

OU_NAME=OU_ADDR1 

Esta expresión se evalúa como true exactamente hay al menos un OU_NAME hijo del nodo actual y uno OU_ADDR1 hijo del nodo actual con el mismo valor de cadena.

Finalmente, en XPath 2.0, las cadenas se pueden comparar también el uso de los operadores de comparación valor lt, le, eq, gt, ge y la heredada de XPath 1.0 operador de comparación general =.

Intentar evaluar un operador de comparación de valores cuando uno o ambos de sus argumentos es una secuencia de más de un elemento resulta en un error.