Это короткое и простое преобразование (без xsl:choose
, xsl:when
и xsl:otherwise
):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vSum" select="sum(/*/*/item[2])"/>
<xsl:variable name="vNewNum"
select="count(/*/record) + 2 - ($vSum >= 0)"/>
<xsl:template match="/*">
<xsl:apply-templates/>
<xsl:apply-templates select="*[1]" mode="cond"/>
</xsl:template>
<xsl:template match="record">
<entry name="{item[1]}">
<xsl:value-of select="item[2]"/>
</entry>
</xsl:template>
<xsl:template mode="cond" match="record">
<entry name="Measure{$vNewNum}">
<xsl:value-of select="$vSum"/>
</entry>
</xsl:template>
</xsl:stylesheet>
при применении к следующему документу XML (предоставленный фрагмент обернут в верхний элемент, чтобы сделать его правильно сформированным документом XML, а последнее число увеличилось на 1
):
<t>
<record>
<item name="measure">Measure1</item>
<item name="amount">100</item>
</record>
<record>
<item name="measure">Measure2</item>
<item name="amount">200</item>
</record>
<record>
<item name="measure">Measure3</item>
<item name="amount">301</item>
</record>
</t>
дает желаемый, правильный результат :
<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">301</entry>
<entry name="Measure4">601</entry>
когда в приведенном выше XML мы меняем последнее число на отрицательное, так что вся сумма теперь равна -1
:
<t>
<record>
<item name="measure">Measure1</item>
<item name="amount">100</item>
</record>
<record>
<item name="measure">Measure2</item>
<item name="amount">200</item>
</record>
<record>
<item name="measure">Measure3</item>
<item name="amount">-301</item>
</record>
</t>
результат теперь снова правильный и требуемый :
<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">-301</entry>
<entry name="Measure5">-1</entry>