2011-01-14 31 views
0

我有包含結構如下記錄的XML文件:XML,XPATH增加值

<xml> 
    <payment contractType="1"> 
    <income type="0"> 
     <gr code="1" amount="1506.00"/> 
     <gr code="4" amount="35.00"/> 
     <gr code="10" amount="288.14"/> 
     <de code="3011300" amount="138.72"/> 
     <de code="3081100" amount="48"/> 
     <de code="3082400" amount="110"/> 
    </income> 
    <netAmount1 value="765.00"/> 
    <netAmount2 value="765.00"/> 
    </payment> 
<payment contractType="1"> 
    <income type="0"> 
     <gr code="1" amount="506.00"/> 
     <gr code="4" amount="35.00"/> 
     <gr code="10" amount="0"/> 
     <de code="3011300" amount="1.28"/> 
     <de code="3081100" amount="48"/> 
     <de code="3082400" amount="120"/> 
    </income> 
    <netAmount1 value="635.00"/> 
    <netAmount2 value="635.00"/> 
    </payment> 
</xml> 

每個文件都有付款方式的多條記錄,我想最終的XML通過將所有含有一個付款 記錄對於每differrent碼值的金額值 的XML的結果上面

<xml> 
    <payment contractType="1"> 
    <income type="0"> 
     <gr code="1" amount="2512.00"/> 
     <gr code="4" amount="70.00"/> 
     <gr code="10" amount="288.14"/> 
     <de code="3011300" amount="140"/> 
     <de code="3081100" amount="96"/> 
     <de code="3082400" amount="230"/> 
    </income> 
    <netAmount1 value="1400.00"/> 
    <netAmount2 value="1400.00"/> 
    </payment> 
</xml> 

我覺得XPath的可用於這一點,但我從來沒有使用過它,可能會有人告訴我一些Java(或其他)代碼爲了這?

+1

忘了添加「以下結構」? –

回答

1

XPath的好例子:http://www.w3schools.com/XPath/xpath_examples.asp考慮到你的例子,你會很容易得到它的基礎上。例子是基於JavaScript
並潛入您的會徽,我認爲您需要的是xslt轉換,創建另一個基於給定的xml文件。 Here也是類似的例子,很簡單。要計算<gr>金額彙總,你需要以執行類似的東西:

sum(//gr/@amount) 

UPDATE: 好了,就決定玩了一下這一點。我做了什麼:

1)採取的Eclipse IDE
2)XML文件
3創建項目)創建的XSL文件這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 

     <totalpayment> 

      <xsl:value-of select='sum(//@amount)'/> 

     </totalpayment> 

    </xsl:template> 
</xsl:stylesheet> 

4)對XSL文件,右擊並執行「運行方式.../XSL轉換」
5)選擇工作區XML文件,你會得到結果:

<?xml version="1.0" encoding="UTF-8"?><totalpayment>2126.5099999999998</totalpayment> 
  • 裏面的標籤,你會得到總金額(是的,不精確,只讀了總和和xslt得到如何提高計算得到確切的總和)。

我不知道結果結構應該是什麼,所以剛創建了一個例子如何得到任何東西,現在你可以玩。

一點解釋: sum(//@amount) - 它需要具有屬性量的所有標記和計算量的總和值

UPDATE2,根據輸入/輸出例子

嘗試此XSLT轉換出:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="names" match="//*" use="local-name(.)" /> 

    <xsl:template match="/"> 
     <payment contractType="1"> 
      <income type="0"> 
       <xsl:for-each select="//@code[not(.=preceding::*//@code)]"> 
        <xsl:variable name="tagname"> 
         <xsl:value-of select="name(//*[@code=current()])" /> 
        </xsl:variable> 

        <xsl:element name="{$tagname}"> 
         <xsl:attribute name="code"> 
          <xsl:value-of select="current()" /> 
         </xsl:attribute> 
         <xsl:attribute name="amount"> 
          <xsl:value-of select="sum(//*[@code=current()]/@amount)" /><br /> 
         </xsl:attribute> 
        </xsl:element> 
       </xsl:for-each> 

       <xsl:for-each select="//*[generate-id(.) = generate-id(key('names', local-name(.))) and starts-with(name(),'netAmount')]"> 
        <xsl:variable name="tagname"> 
         <xsl:value-of select="name()" /> 
        </xsl:variable> 

        <xsl:element name="{name()}"> 
         <xsl:attribute name="value"> 
          <xsl:value-of select="sum(//*[name()=$tagname]/@value)"></xsl:value-of> 
         </xsl:attribute> 
        </xsl:element> 
       </xsl:for-each> 

      </income> 
     </payment> 
    </xsl:template> 
</xsl:stylesheet> 

我剛剛用xml執行了這個xsl,你得到了相同的結果:

<?xml version="1.0" encoding="UTF-8"?> 
<payment contractType="1"> 
<income type="0"> 
<gr code="1" amount="2012"/> 
<gr code="4" amount="70"/> 
<gr code="10" amount="288.14"/> 
<de code="3011300" amount="140"/> 
<de code="3081100" amount="96"/> 
<de code="3082400" amount="230"/> 
<netAmount1 value="1400"/> 
<netAmount2 value="1400"/> 
</income> 
</payment> 

除了價值<gr code="1" amount="2512.00"/> - 我不知道爲什麼2512.00。

我不知道這個xslt是否已經可以使用,或者它不是一般的,但我希望這是一個好的開始!

+0

非常感謝你..當你談論Eclipse時,你的意思是簡單的Java版本?另一件事是,我不希望所有金額的總和,但根據代碼屬性的每個金額的總和... – Vassilis

+0

我使用Eclipse IDE的Java EE開發人員,可能值得一提(可以是差異),http:///www.eclipse.org/downloads/關於你的結果 - 請編輯你的問題,並把結果放在你顯示的xml中,這樣我們就可以看到你想要執行的轉換的正確結果 – Maxym

+0

ok對於示例 – Vassilis