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

XSLT技术问询:如何比较XML不同节点的属性值并输出提示

解决XSLT中节点属性值比较的问题

嘿,刚入门XSLT遇到属性比较的需求太正常了,我来给你拆解怎么实现你要的逻辑~

首先先明确你的需求:要遍历每个<product>节点,把它的id属性和它下属<special>节点的id_product属性做比较,然后根据结果输出提示。先把你给的示例XML贴出来方便对照:

<groupe> 
  <product id='05'> 
    <item> 
      <special id_product = '022'> </special> 
    </item> 
  </product> 
  <product id='05'> 
    <item> 
      <special id_product = '022'> </special> 
    </item> 
  </product> 
</groupe>

下面是实现这个逻辑的XSLT代码,我会逐段解释:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 设置输出为文本格式,带缩进 -->
  <xsl:output method="text" indent="yes"/>

  <!-- 匹配根节点下的<groupe>,作为处理入口 -->
  <xsl:template match="/groupe">
    <!-- 遍历每个<product>节点,逐个处理 -->
    <xsl:for-each select="product">
      <!-- 定义变量存储当前product的id属性值 -->
      <xsl:variable name="prodId" select="@id"/>
      <!-- 定义变量存储当前product下special的id_product属性值 -->
      <xsl:variable name="specialProdId" select="item/special/@id_product"/>

      <!-- 分支判断:比较两个属性值 -->
      <xsl:choose>
        <xsl:when test="$prodId = $specialProdId">
          <xsl:text>Product ID </xsl:text>
          <xsl:value-of select="$prodId"/>
          <xsl:text> 与 Special 的 id_product </xsl:text>
          <xsl:value-of select="$specialProdId"/>
          <xsl:text> 相等!&#10;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>Product ID </xsl:text>
          <xsl:value-of select="$prodId"/>
          <xsl:text> 与 Special 的 id_product </xsl:text>
          <xsl:value-of select="$specialProdId"/>
          <xsl:text> 不相等!&#10;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

代码关键部分解释:

  • 遍历节点:用<xsl:for-each select="product">循环处理每个产品,确保每个<product>都能被单独检查
  • 变量存储属性:把要比较的两个属性值存在变量里,让代码更清晰,也方便后续复用
  • 条件判断:用<xsl:choose>做分支,test="$prodId = $specialProdId"就是核心的比较逻辑——XSLT里直接用=就能做字符串比较;如果需要数值比较,可以改成number($prodId) = number($specialProdId)
  • 输出格式:用<xsl:text>输出固定文本,&#10;是换行符,让每条提示单独占一行,可读性更好

如果你的XML里存在一个<product>下有多个<special>的情况,只需要在<product>的循环里再加一层<xsl:for-each select="item/special">,逐个遍历每个special节点即可。

内容的提问来源于stack exchange,提问作者sacamoto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:44:13