XSLT以递归方式添加数字并在条件检查中使用它

时间:2011-12-09 01:42:52

标签: xslt recursion

我在特定节点中添加值并在条件检查中使用它时遇到问题。我输入的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。请帮帮我大师。

2 个答案:

答案 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:choosexsl:whenxsl: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>