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.