2011-04-13 54 views
14

我是新來的XSLT,任何一個可以請建議我如何比較兩個元素從XML來作爲字符串的值是:要比較XSLT中的兩個元素(字符串類型)嗎?

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

回答

30

首先,所提供的長碼

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

等效於此,短得多的代碼

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

現在,你的問題:

如何來比較XML來 作爲字符串兩個元素

在XPath 1.0字符串只能相等(或等於)使用的運營商相比, =和功能not()連同運營商=

$str1 = $str2 

評估爲true()恰好當字符串$str1是等於字符串$str2

not($str1 = $str2) 

評估爲true()什麼時候該字符串$str1不等於字符串$str2

還有!=運營商。它通常應該避免,因爲每當它的一個操作數是一個節點集時它就會發生異常行爲。現在

,用於比較兩個元件節點規則類似於

$el1 = $el2 

評估爲true()準確時的$el1字符串值等於$el2字符串值。

not($el1 = $el2) 

評估爲true()準確時的$el1字符串值不等於的$el2字符串值。

然而,如果=操作數中的一個是節點集合,然後

$ns = $str 

評估爲true()恰好當在節點設定$ns1至少一個節點,其字符串值等於到字符串$str

$ns1 = $ns2 

評估爲true()恰好當在節點設定$ns1至少一個節點,其字符串值等於從$ns2

因此一些節點的字符串值,表達式

OU_NAME='OU_ADDR1' 

評估爲true()僅當存在名爲OU_NAME當前節點中的至少一個元素的孩子,並且其字符串值是字符串'OU_ADDR1'。

這顯然不是你想要的!

最大的可能是你想要的:

OU_NAME=OU_ADDR1 

這個表達式true究竟有當前節點的至少一個OU_NAME孩子,用相同的字符串值,當前節點的一個OU_ADDR1孩子。

最後,XPath 2.0中,字符串也可使用值比較運算符ltleeqgtge和從XPath 1.0中一般比較運算符=繼承的比較。

當其中一個或兩個參數是多個項目的序列導致錯誤時嘗試評估值比較運算符。