【问题标题】:To compare two elements(string type) in XSLT?在 XSLT 中比较两个元素(字符串类型)?
【发布时间】:2011-08-04 16:32:17
【问题描述】:

我是 XSLT 的新手,谁能建议我如何将来自 xml 的两个元素作为字符串进行比较,它们的值是:

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

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0


    【解决方案1】:

    首先是提供的长代码

        <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
    

    当字符串 $str1 等于字符串 $str2 时,计算为 true()

    not($str1 = $str2)
    

    当字符串 $str1 不等于字符串 $str2 时,计算为 true()

    还有!= 运算符。通常应该避免它,因为只要它的操作数之一是节点集,它就会出现异常行为。

    现在,比较两个元素节点的规则是相似的

    $el1 = $el2
    

    $el1 的字符串值等于$el2 的字符串值时,计算为true()

    not($el1 = $el2)
    

    $el1 的字符串值不等于$el2 的字符串值时,计算为true()

    但是,如果= 的操作数之一是节点集,则

     $ns = $str
    

    当节点集中至少有一个节点$ns1,其字符串值等于字符串$str时,计算为true()

    $ns1 = $ns2
    

    当节点集$ns1中至少有一个节点,其字符串值等于来自$ns2的某个节点的字符串值时,计算为true()

    因此,表达式

    OU_NAME='OU_ADDR1'
    

    仅当当前节点至少有一个名为 OU_NAME 且其字符串值为字符串 'OU_ADDR1' 的子元素时,才计算为 true()

    这显然不是你想要的!

    很可能你想要:

    OU_NAME=OU_ADDR1
    

    此表达式的计算结果为true,恰好有至少一个当前节点的OU_NAME 子节点和一个当前节点的OU_ADDR1 子节点具有相同的字符串值。

    最后,在 XPath 2.0 中,还可以使用值比较运算符 ltleeqgtge 和从 XPath 继承的值比较运算符1.0通用比较运算符=.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2013-02-08
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多