wake-up-neo.com

Um zwei Elemente (String-Typ) in XSLT zu vergleichen?

ich bin neu in XSLT, kann mir jemand bitte vorschlagen, wie man zwei Elemente aus XML als Zeichenfolge vergleicht. Ihre Werte sind:

<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

Zuallererst der bereitgestellte lange 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>

entspricht viel kürzerem Code:

<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"/>

Nun zu Ihrer Frage:

wie man zwei Elemente vergleicht, die von xml als String kommen

In Xpath 1.0 können Zeichenfolgen nur auf Gleichheit (oder Ungleichheit) verglichen werden, indem der Operator = Und die Funktion not() zusammen mit dem Operator = Verwendet werden.

$str1 = $str2

ergibt true() genau dann, wenn der String $str1 gleich dem String $str2 ist.

not($str1 = $str2)

ergibt true() genau dann, wenn der String $str1 ungleich dem String $str2 ist.

Es gibt auch den Operator !=. Es sollte im Allgemeinen vermieden werden, da es ein anormales Verhalten aufweist, wenn einer seiner Operanden eine Knotenmenge ist.

Nun sind die Regeln zum Vergleichen von zwei Elementknoten ähnlich:

$el1 = $el2

ergibt true() genau dann, wenn der String-Wert von $el1 gleich dem String-Wert von $el2 ist.

not($el1 = $el2)

wird zu true() ausgewertet, genau dann, wenn der Zeichenfolgenwert von $el1 nicht dem Zeichenfolgenwert von $el2 entspricht.

Wenn jedoch einer der Operanden von = Eine Knotenmenge ist, dann

 $ns = $str

wird genau dann zu true() ausgewertet, wenn sich mindestens ein Knoten in der Knotenmenge $ns1 befindet, dessen Zeichenfolgenwert der Zeichenfolge $str entspricht.

$ns1 = $ns2

wird genau dann zu true() ausgewertet, wenn sich mindestens ein Knoten in der Knotenmenge $ns1 befindet, dessen Zeichenfolgenwert gleich dem Zeichenfolgenwert eines Knotens aus $ns2 ist.

Daher der Ausdruck:

OU_NAME='OU_ADDR1'

wird nur dann zu true() ausgewertet, wenn mindestens ein untergeordnetes Element des aktuellen Knotens mit dem Namen OU_NAME vorhanden ist und dessen Zeichenfolgenwert die Zeichenfolge 'OU_ADDR1' ist.

Das ist offensichtlich nicht das, was du willst!

Höchstwahrscheinlich möchten Sie:

OU_NAME=OU_ADDR1

Dieser Ausdruck ergibt true, genau da ist mindestens ein OU_NAME - Kind des aktuellen Knotens und ein OU_ADDR1 - Kind des aktuellen Knotens mit demselben Zeichenfolgenwert.

Schließlich In XPath 2.0 können Zeichenfolgen auch mit den Wertevergleichsoperatoren lt, le, eq, gt verglichen werden. , ge und der von XPath 1.0 übernommene allgemeine Vergleichsoperator =.

Der Versuch, einen Wertevergleichsoperator auszuwerten, wenn eines oder beide seiner Argumente aus mehreren Elementen bestehen, führt zu einem Fehler.

35