XSLT开发问题:基于唯一TaxID属性对符合条件的area值求和计算
XSLT按唯一属性分组求和解决方案
方案1:XSLT 2.0及以上版本实现
XSLT 2.0 内置for-each-group分组语法,实现逻辑更简洁:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:template match="/InRoads/GeometryProject"> <!-- 按TaxID分组 --> <xsl:for-each-group select="HorizontalAlignment" group-by="@TaxID"> <!-- 计算当前组内Type=FEE的area总和 --> <xsl:variable name="totalFeeArea" select="sum(current-group()[@Type='FEE']/@area)" /> <!-- 取当前组的ExArea(同TaxID的ExArea值一致,取组内第一个节点即可) --> <xsl:variable name="exArea" select="current-group()[1]/@ExArea" /> <!-- 输出结果 --> <xsl:value-of select="concat('TaxID ', current-grouping-key(), ' remaining area = ', $exArea - $totalFeeArea, ' ')" /> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
方案2:XSLT 1.0版本实现
如果使用的是仅支持XSLT 1.0的旧处理器,可以用Muenchian分组法实现:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <!-- 定义按TaxID匹配HorizontalAlignment节点的key --> <xsl:key name="taxIdGroup" match="HorizontalAlignment" use="@TaxID" /> <xsl:template match="/InRoads/GeometryProject"> <!-- 遍历每个TaxID的首个节点,实现去重分组 --> <xsl:for-each select="HorizontalAlignment[generate-id() = generate-id(key('taxIdGroup', @TaxID)[1])]"> <xsl:variable name="currentTaxId" select="@TaxID" /> <!-- 计算当前TaxID对应分组内Type=FEE的area总和 --> <xsl:variable name="totalFeeArea" select="sum(key('taxIdGroup', $currentTaxId)[@Type='FEE']/@area)" /> <!-- 输出结果 --> <xsl:value-of select="concat('TaxID ', $currentTaxId, ' remaining area = ', @ExArea - $totalFeeArea, ' ')" /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
输出验证
两种方案运行后都将得到预期结果:
TaxID 123 remaining area = 1900 TaxID 456 remaining area = 4800 TaxID 789 remaining area = 7800
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

