如何在XSLT中比较两个节点的值?
在XSLT中比较XML节点值的方法
首先咱们先把你提供的XML示例修正一下,原代码里有语法错误(多了一个闭合的</criteria>标签),我调整成了合法的结构,方便后续演示:
<root> <test> <criteria nom="DR"> <abbr>DR</abbr> <value>0.123456</value> </criteria> <criteria nom="MOTA"> <abbr>MOTA</abbr> <value>0.132465</value> </criteria> </test> <test> <criteria nom="DR"> <abbr>DR</abbr> <value>0.111111</value> </criteria> <criteria nom="MOTA"> <abbr>MOTA</abbr> <value>0.144444</value> </criteria> </test> </root>
接下来分两种常见场景讲怎么在XSLT里比较节点值:
1. 比较同一个<test>节点下的不同<criteria>值
比如要比较单个<test>里DR和MOTA的数值大小,你可以先定位到目标<test>,再通过nom属性精准找到对应的<criteria>,然后用number()函数把字符串类型的<value>转成数值,再用比较运算符(<、>、=等)进行判断。
示例XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes"/> <xsl:template match="/root"> <!-- 遍历每个test节点 --> <xsl:for-each select="test"> <xsl:variable name="dr-value" select="number(criteria[@nom='DR']/value)"/> <xsl:variable name="mota-value" select="number(criteria[@nom='MOTA']/value)"/> <xsl:text>当前test中:</xsl:text> <xsl:if test="$dr-value < $mota-value"> <xsl:text>DR值(<xsl:value-of select="$dr-value"/>)小于MOTA值(<xsl:value-of select="$mota-value"/>)</xsl:text> </xsl:if> <xsl:if test="$dr-value > $mota-value"> <xsl:text>DR值(<xsl:value-of select="$dr-value"/>)大于MOTA值(<xsl:value-of select="$mota-value"/>)</xsl:text> </xsl:if> <xsl:if test="$dr-value = $mota-value"> <xsl:text>DR值和MOTA值相等</xsl:text> </xsl:if> <xsl:text> </xsl:text> <!-- 换行 --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
注意:在XSLT里要把<写成<,>写成>,避免和XML标签语法冲突。
2. 比较不同<test>节点下的同类型<criteria>值
比如要比较第一个<test>的DR值和第二个<test>的DR值,你可以通过索引定位不同的<test>节点,再获取对应的值进行比较:
示例XSLT代码片段:
<xsl:template match="/root"> <xsl:variable name="first-dr" select="number(test[1]/criteria[@nom='DR']/value)"/> <xsl:variable name="second-dr" select="number(test[2]/criteria[@nom='DR']/value)"/> <xsl:text>第一个test的DR值:<xsl:value-of select="$first-dr"/> </xsl:text> <xsl:text>第二个test的DR值:<xsl:value-of select="$second-dr"/> </xsl:text> <xsl:if test="$first-dr > $second-dr"> <xsl:text>第一个test的DR值更大</xsl:text> </xsl:if> </xsl:template>
关键注意点
- 一定要用
number()函数转换<value>的内容:XML里的文本默认是字符串类型,直接比较字符串会按字符顺序判断(比如"0.2"会比"0.123"小,因为字符'1'<'2'),转成数值后才会按数学规则比较。 - 利用
@nom属性定位节点:这样即使<criteria>的顺序发生变化,也能精准找到目标节点,避免出错。
内容的提问来源于stack exchange,提问作者Greg Symsym
相关产品推荐
相关产品推荐

