我在特定节点中添加值并在条件检查中使用它时遇到问题。我输入的xml是:
<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">300</item>
</record>
Using xslt, I have to create an output which will look like:
<result>
<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">300</entry>
//requirement starts here
if sum of measure1 i.e 100 + measure2 i.e 200 + measure3 i.e 300 >=0
<entry name="Measure4">m1 + m2 + m3</entry>
otherwise if sum of measure1 + measure2 + measure3 < 0, the element should be
<entry name="measure5"> m1 + m2+ m3 </entry>
</result>
我尝试过递归模板调用来添加数字,但不知道如何在变量中获取输出并在条件检查中使用它。对于例如在上面的例子中,我想添加100,200和300并检查600&gt; = 0。它是真的,因此在输出xml中,我只想显示measure4。 如果总数是&lt; 0,我只想显示measure5而不是measure4。请帮帮我大师。
答案 0 :(得分:0)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<result>
<xsl:apply-templates select="record"/>
<xsl:variable name="sum" select="sum(record/item[@name = 'amount'])"/>
<xsl:variable name="n">
<xsl:choose>
<xsl:when test="$sum >= 0">
<xsl:text>Measure4</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>measure5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<entry name="{$n}">
<xsl:value-of select="$sum"/>
</entry>
</result>
</xsl:template>
<xsl:template match="record">
<entry name="{item[@name = 'measure']}">
<xsl:value-of select="item[@name = 'amount']"/>
</entry>
</xsl:template>
</xsl:stylesheet>
输入XML:
<root>
<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">300</item>
</record>
</root>
输出:
<result>
<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">300</entry>
<entry name="Measure4">600</entry>
</result>
答案 1 :(得分:0)
这个简短而简单的转换(无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
增加最后一个数字):< / p>
<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>