je suis nouveau sur XSLT, quelqu'un peut-il me suggérer comment comparer deux éléments provenant de xml en tant que chaîne leurs valeurs sont:
<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>
Tout d'abord, le code long fourni:
<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>
équivaut à cela, code beaucoup plus court:
<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"/>
Maintenant, à votre question:
comment comparer deux éléments provenant de xml en tant que chaîne
Dans Xpath 1.0, les chaînes ne peuvent être comparées que pour l'égalité (ou l'inégalité), en utilisant l'opérateur =
Et la fonction not()
avec l'opérateur =
.
$str1 = $str2
correspond à true()
exactement lorsque la chaîne $str1
est égale à la chaîne $str2
.
not($str1 = $str2)
correspond à true()
exactement lorsque la chaîne $str1
n'est pas égale à la chaîne $str2
.
Il y a aussi l'opérateur !=
. Il doit généralement être évité car il présente un comportement anormal chaque fois que l'un de ses opérandes est un ensemble de nœuds.
Maintenant, les règles de comparaison de deux nœuds d'éléments sont similaires:
$el1 = $el2
correspond à true()
exactement lorsque la valeur de chaîne de $el1
est égale à la valeur de chaîne de $el2
.
not($el1 = $el2)
correspond à true()
exactement lorsque la valeur de chaîne de $el1
n'est pas égale à la valeur de chaîne de $el2
.
Cependant, si l'un des opérandes de =
Est un ensemble de nœuds, alors
$ns = $str
correspond à true()
exactement quand il y a au moins un nœud dans l'ensemble de nœuds $ns1
, dont la valeur de chaîne est égale à la chaîne $str
$ns1 = $ns2
correspond à true()
exactement quand il y a au moins un nœud dans l'ensemble de nœuds $ns1
, dont la valeur de chaîne est égale à la valeur de chaîne d'un nœud de $ns2
Par conséquent, l'expression:
OU_NAME='OU_ADDR1'
est évalué à true()
uniquement lorsqu'il existe au moins un élément enfant du nœud actuel nommé OU_NAME
et dont la valeur de chaîne est la chaîne 'OU_ADDR1'.
Ce n'est évidemment pas ce que vous voulez!
Vous voulez très probablement:
OU_NAME=OU_ADDR1
Cette expression est évaluée à true
exactement il y a au moins un enfant OU_NAME
Du nœud actuel et un enfant OU_ADDR1
Du nœud actuel avec la même valeur de chaîne.
Enfin, dans XPath 2.0, les chaînes peuvent également être comparées à l'aide des opérateurs de comparaison de valeurs lt
, le
, eq
, gt
, ge
et l'héritier de l'opérateur de comparaison générale XPath 1.0 =
.
Essayer d'évaluer un opérateur de comparaison de valeurs lorsque l'un de ses arguments ou les deux est une séquence de plusieurs éléments entraîne une erreur.