You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 &lt; $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 &gt; $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>&#10;</xsl:text> <!-- 换行 -->
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

注意:在XSLT里要把<写成&lt;,>写成&gt;,避免和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"/>&#10;</xsl:text>
  <xsl:text>第二个test的DR值:<xsl:value-of select="$second-dr"/>&#10;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:22:47