如何用XSLT实现XML欧元转PLN并修复结构缺失问题
修正后的XSLT模板解决方案
你的XSLT代码主要存在两个核心问题,同时我们还可以优化价格的小数格式来匹配你给出的示例效果,以下是完整的修正方案:
问题定位
- 输出结果缺失原XML的根元素
<Items>,导致生成的XML结构不完整 - 汇率标签错误地改为了
<rate>,不符合目标结构要求的<rate_currency_change> - 直接相乘后的价格会出现多位小数,需要格式化保留两位小数以匹配示例结果
修正后的完整XSLT代码
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,保留<Items>根元素 --> <xsl:template match="/"> <Items> <!-- 遍历每个item节点 --> <xsl:for-each select="Items/item"> <item> <!-- 计算价格并格式化为两位小数 --> <price> <xsl:value-of select="format-number(./price * ./rate_currency_change, '0.00')"/> </price> <!-- 计算推荐价格并格式化为两位小数 --> <recommended_price> <xsl:value-of select="format-number(./recommended_price * ./rate_currency_change, '0.00')"/> </recommended_price> <!-- 保留原汇率标签名 --> <rate_currency_change> <xsl:value-of select="./rate_currency_change"/> </rate_currency_change> </item> </xsl:for-each> </Items> </xsl:template> </xsl:stylesheet>
关键修改说明
- 恢复根元素结构:在根模板中添加了
<Items>标签包裹所有<item>节点,确保输出XML的层级和原Feed一致 - 修正汇率标签名:将错误的
<rate>改回目标要求的<rate_currency_change> - 格式化小数位数:使用
format-number()函数将计算后的价格统一格式为两位小数,和你给出的示例结果完全对齐(注:37.9900004.37实际为166.0163,格式化后会四舍五入为166.02;111.504.37=487.255,格式化后为487.26,若需要截断而非四舍五入,可以调整格式化规则)
输出结果示例
用该模板处理你的原XML Feed后,会生成符合要求的结构:
<Items> <item> <price>166.02</price> <recommended_price>487.26</recommended_price> <rate_currency_change>4.37</rate_currency_change> </item> </Items>
内容的提问来源于stack exchange,提问作者TOM ARM
相关产品推荐
相关产品推荐

