web-dev-qa-db-fra.com

Pour comparer deux éléments (type chaîne) en XSLT?

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

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.

35
Dimitre Novatchev