使用XSLT key函数获取单一值及订单总价计算优化问题
调整后的XSLT代码及问题解决说明
示例订单XML数据
<order> <product> <field name="productid">productid-1</field> <field name="price">10</field> <field name="qty">2</field> </product> <product> <field name="productid">productid-3</field> <field name="price">20</field> </product> <product> <field name="productid">productid-5-xl</field> <field name="price">30</field> <field name="qty">3</field> </product> </order>
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 可选:若需保留key函数则保留此定义,否则可移除 --> <xsl:key name="productField" match="field" use="concat(generate-id(..), '-', @name)"/> <xsl:template match="/order"> <total_amount> <xsl:value-of select="sum(product/calculateItemTotal(.))"/> </total_amount> </xsl:template> <xsl:template name="calculateItemTotal"> <xsl:param name="item"/> <!-- 提取价格并转换为数值 --> <xsl:variable name="unitPrice" select="number($item/field[@name='price']/text())"/> <!-- 提取数量:存在则取文本值,无此字段则默认1 --> <xsl:variable name="quantity"> <xsl:choose> <xsl:when test="$item/field[@name='qty']"> <xsl:value-of select="number($item/field[@name='qty']/text())"/> </xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- 返回单个产品的总价 --> <xsl:value-of select="$unitPrice * $quantity"/> </xsl:template> </xsl:stylesheet>
问题修复细节
解决key函数返回整个节点的问题
直接通过field[@name='qty']/text()提取字段的文本值,并用number()转换为数值类型,确保计算时使用的是纯数值而非节点对象。如果必须使用key函数,可修改为number(key('productField', concat(generate-id($item), '-qty'))/text()),同样能获取到正确的数值。处理无qty字段的默认值
用<xsl:choose>分支判断qty字段是否存在,不存在时直接返回默认值1,避免因缺少字段导致计算中断或结果错误。适配带类型后缀的产品ID
价格和数量的提取逻辑依赖于field的name属性,与productid的具体格式无关,无论产品ID是productid-3还是productid-5-xl,都能正确匹配到对应的价格和数量字段,无需额外修改。
内容的提问来源于stack exchange,提问作者adam78
相关产品推荐
相关产品推荐

