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>
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.