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

XSLT条件判断异常:仅@name=Width的span需加类却全局生效

问题分析与修复

你的代码问题出在if条件使用了全局绝对路径,它会检查整个XML文档中是否存在任意一个item的@name为"Width"——只要这个节点存在,所有循环生成的<span>都会执行if语句,覆盖class属性,导致所有元素都被加上lens_width类。

修复方案

假设你的XML结构大致如下(values和items同级,且value与item按位置一一对应):

<shop>
  <page>
    <projector>
      <product>
        <dictionary>
          <items>
            <item name="Width"/>
            <item name="Height"/>
          </items>
          <values>
            <value>120</value>
            <value>80</value>
          </values>
        </dictionary>
      </product>
    </projector>
  </page>
</shop>

方式1:修正条件的相对路径

将if条件改为匹配当前循环的value对应位置的item,确保只给对应Width的value添加类:

<xsl:for-each select="values/value">
  <span>
    <!-- 基础类名 + 条件添加额外类 -->
    <xsl:attribute name="class">
      dictionary__value_txt
      <xsl:if test="../../items/item[position() = current()/position()]/@name = 'Width'"> lens_width</xsl:if>
    </xsl:attribute>
    <!-- 输出value的内容(你原来的代码漏了这部分) -->
    <xsl:value-of select="."/>
  </span>
</xsl:for-each>

方式2:用属性值模板简化写法

XSLT支持直接在属性中写条件表达式,代码更简洁:

<xsl:for-each select="values/value">
  <span class="dictionary__value_txt{
    if ../../items/item[position() = current()/position()]/@name = 'Width' 
    then ' lens_width' 
    else ''
  }">
    <xsl:value-of select="."/>
  </span>
</xsl:for-each>

关键说明

  • 绝对路径/shop/...会全局查找节点,而相对路径../../items/item是基于当前value节点的位置向上回溯,确保只匹配对应位置的item。
  • 如果你的XML中value和item不是按位置对应,而是通过其他关联(比如id),只需要把条件中的position()判断换成对应的关联逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:20:18