基于相同band区间匹配多类Rate金额的XSLT处理问题
解决方案
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 按band值给Rate节点分组,方便快速查找同区间的不同类型记录 --> <xsl:key name="rateGroupByBand" match="Rate" use="band"/> <xsl:template match="/"> <!-- 输出表头 --> <xsl:text>区间 | Life金额 | Add金额 </xsl:text> <xsl:text>------------------------ </xsl:text> <!-- 遍历每个唯一的band分组(去重处理) --> <xsl:for-each select="Rates/Rate[generate-id() = generate-id(key('rateGroupByBand', band)[1])]"> <xsl:variable name="currentBand" select="band"/> <!-- 输出当前区间 --> <xsl:value-of select="$currentBand"/> <xsl:text> | </xsl:text> <!-- 抓取当前区间下Life类型的金额 --> <xsl:value-of select="key('rateGroupByBand', $currentBand)[type='Life']/amount"/> <xsl:text> | </xsl:text> <!-- 抓取当前区间下Add类型的金额 --> <xsl:value-of select="key('rateGroupByBand', $currentBand)[type='Add']/amount"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
核心改进点
- 分组去重:通过
generate-id()对比,确保每个band只处理一次,解决你之前重复显示Life金额的问题。 - 精准筛选:利用定义的
xsl:key,快速定位同区间下的Life/Add类型节点,直接提取对应金额,不会混取其他类型的数据。 - 高效查找:
xsl:key相当于给band建了索引,比循环遍历整个XML找同区间节点效率更高,尤其是数据量大的时候。
适配说明
如果你的输入XML结构不是Rates下直接挂Rate(比如有更深层级或命名空间),只需调整match和select里的节点路径即可。例如XML是<Root><RateList><Rate>...</Rate></RateList></Root>,就把select="Rates/Rate"改成select="Root/RateList/Rate"。
内容的提问来源于stack exchange,提问作者User501
相关产品推荐
相关产品推荐

