转换文件:值的总和 - 接受或拒绝

时间:2013-05-09 10:07:55

标签: xslt

我对xslt很新。我一直在寻找如何解决我的问题,但似乎我找不到我想要的东西。

我需要改变的是: 总计金额1,金额2,金额3,金额4 那么这个总数必须小于或等于可以处理的OriginalAmount(true),否则大于应该被拒绝的OriginalAmount(false)。如何解决这个问题?

这是XML:

  <OriginalAmount>1.2100</OriginalAmount>

  <Amount1>1.0000</Amount1>
  <Amount2>0.0000</Amount2>
  <Amount3>1.0000</Amount3>
  <Amount4>0.0000</Amount4>

您认为在xslt或C#中编写代码会更容易,您最好的建议是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用以下方式汇总金额:

<xsl:variable name="amountSum" select="sum(root/*[substring(name(), 1, 6) = 'Amount'])"/>

root/*[substring(name(), 1, 6) = 'Amount']是一个选择器,用于选择名称以“金额”开头的所有元素 - 即它选择:Amount1Amount2,...

在以下情况下会更容易:

  • 元素名称相同(例如Amount),总和为:<xsl:variable name="amountSum" select="sum(Amount)"/>
  • 某些父级中的所有元素都可以求和,总和为:<xsl:variable name="amountSum" select="sum(parentElement/*)"/>(这对parentElement中的所有元素求和)

然后你可以比较这些值:

<xsl:if test="OriginalAmount > $amountSum">.. sum is smaller ..</xsl:if>(最好在比较时使用&gt;代替>

请参阅live example

源XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <OriginalAmount>2.2100</OriginalAmount>

  <Amount1>1.0000</Amount1>
  <Amount2>0.0000</Amount2>
  <Amount3>1.0000</Amount3>
  <Amount4>0.0000</Amount4>
</root>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="/">
        <xsl:variable name="amountSum" select="sum(root/*[substring(name(), 1, 6) = 'Amount'])"/>
        <xsl:value-of select="$amountSum"/>
        <xsl:choose>
            <xsl:when test="root/OriginalAmount &gt; $amountSum">greater</xsl:when>
            <xsl:otherwise>less</xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>