要比较XSLT中的两个元素(字符串类型)?

| 我是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>
    
已邀请:
首先,提供的长代码:
    <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
等于字符串ѭ9equal时,精确计算得出7ѭ。
not($str1 = $str2)
当字符串
$str1
与字符串
$str2
不相等时,精确计算为
true()
。 还有the14ѭ运算符。通常应避免使用它,因为只要它的一个操作数是节点集,它就具有异常行为。 现在,比较两个元素节点的规则相似:
$el1 = $el2
$el1
的字符串值等于
$el2
的字符串值时,恰好将计算结果为7ѭ。
not($el1 = $el2)
$el1
的字符串值不等于
$el2
的字符串值时,将精确地计算为
true()
。 但是,如果“ 3”的操作数之一是节点集,则
 $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中,还可以使用值比较运算符
lt
le
eq
gt
ge
和从XPath 1.0通用比较运算符
=
继承来比较字符串。 当一个或两个自变量的一个或多个自变量序列超过一个项目时,尝试评估值比较运算符将导致错误。     

要回复问题请先登录注册