2011-04-13 134 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中一般比较运算符=继承的比较。

当其中一个或两个参数是多个项目的序列导致错误时尝试评估值比较运算符。