2013-05-09 53 views
0

我對xslt非常陌生。我一直在尋找如何解決我的問題,但似乎我找不到我在找什麼。轉換文件:值的總和 - 接受或拒絕

我需要變換是: 和的總amount1,AMOUNT2,AMOUNT3的,amount4 然後該總必須小於或等於OriginalAmount可被處理(真),否則大於OriginalAmount應該被拒絕(假)。如何解決這個問題呢?

這裏是XML:

<OriginalAmount>1.2100</OriginalAmount> 

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

你認爲它會更容易在XSLT或C#編寫代碼,什麼是你最好的建議?

回答

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> 
+0

由於它看起來不錯,但到底是什麼[子(名(),1,6)是什麼意思?我有很多元素名稱(產品,creditdebitflag等),如何調用這些特定的元素名稱? – user1358072 2013-05-09 11:09:26

+0

substring(name(),1,6)獲取元素名稱的前六個字符 - >從「Answer5」獲得「答案」。這是因爲需要不同名稱的總和元素。我會將其添加到答案中。 – lopisan 2013-05-09 11:15:49