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
相关产品推荐
相关产品推荐

