2013-03-06 97 views
0

我有一個XML,看起來像這樣:XML - 結合標籤兒童XSLT

<?xml version="1.0"?>                                 
<ROWSET>                                    
<ROW>                                     
    <KUNDENNR>63564</KUNDENNR>                               
    <JAHR>2012</JAHR>                                 
    <MONAT>2</MONAT>                                  
    <NAME>John Doe</NAME>                              
    <NETTO>504,66</NETTO>                                
    <DB_BASIS>21,56</DB_BASIS>                               
    <EKECHT>482,56</EKECHT>                                
    <NAME1>Some Name</NAME1>                              
    <NAME2>BA 31 (BÜRO GGR 1)</NAME2>                             
    <LAND>AT</LAND>                                  
    <PLZ>1082</PLZ>                                  
    <ORT>Wien</ORT>                                  
    <ADM>Henry Ford</ADM>                               
    <KUNDENKLASSE>A</KUNDENKLASSE>                              
    <UEBERKUNDE>Some Value</UEBERKUNDE>                            
    <HANDLING>22,577179011</HANDLING>                             
    <SOLLFRACHT>22,68</SOLLFRACHT>    
    <DG_BASIS_P>-10,763888888888888888888888888888888889</DG_BASIS_P>                     
</ROW> 
<ROW>                                     
    <KUNDENNR>63564</KUNDENNR>                               
    <JAHR>2011</JAHR>                                 
    <MONAT>1</MONAT>                                  
    <NAME>John Doe</NAME>                              
    <NETTO>502,66</NETTO>                                
    <DB_BASIS>21,56</DB_BASIS>                               
    <EKECHT>482,56</EKECHT>                                
    <NAME1>Some Name</NAME1>                              
    <NAME2>BA 31 (BÜRO GGR 1)</NAME2>                             
    <LAND>AT</LAND>                                  
    <PLZ>1082</PLZ>                                  
    <ORT>Wien</ORT>                                  
    <ADM>Henry Ford</ADM>                               
    <KUNDENKLASSE>A</KUNDENKLASSE>                              
    <UEBERKUNDE>Some value</UEBERKUNDE>                            
    <HANDLING>22,577179011</HANDLING>                             
    <SOLLFRACHT>22,68</SOLLFRACHT>    
    <DG_BASIS_P>-10,538888888888888888889</DG_BASIS_P>                     
</ROW> 
</ROWSET> 

注意,第一個和最後-elements內具有相同的值。現在我想給XML轉換成以下結構XSLT:

<?xml version="1.0"?>                                 
<ROWSET>                                    
<KUNDE> 
    <KUNDENNR>63564</KUNDENNR>                               
    <NAME>John Doe</NAME>  
    <NAME1>Some Name</NAME1>                              
    <NAME2>BA 31 (B RO GGR 1)</NAME2>                             
    <LAND>AT</LAND>                                  
    <PLZ>1082</PLZ>                                  
    <ORT>Wien</ORT>                                  
    <ADM>Henry Ford</ADM>                               
    <KUNDENKLASSE>A</KUNDENKLASSE>  
    <UEBERKUNDE>Some Value</UEBERKUNDE>                            
    <ROW>                                     
     <JAHR>2012</JAHR>                                 
     <MONAT>2</MONAT>                                  
     <NETTO>504,66</NETTO>                                
     <DB_BASIS>21,56</DB_BASIS>                               
     <EKECHT>482,56</EKECHT>                                
     <HANDLING>22,577179011</HANDLING>                             
     <SOLLFRACHT>22,68</SOLLFRACHT>                              
     <DG_BASIS_P>4,27218325209051638727063765703642056038</DG_BASIS_P>                     
    </ROW> 
    <ROW> 
     <JAHR>2012</JAHR>                                 
     <MONAT>1</MONAT>                                  
     <NETTO>502,66</NETTO>                                
     <DB_BASIS>21,56</DB_BASIS>                               
     <EKECHT>482,56</EKECHT>                               
     <HANDLING>22,577179011</HANDLING>                              
     <SOLLFRACHT>22,68</SOLLFRACHT>                              
     <DG_BASIS_P>-10,538888888888888888889</DG_BASIS_P>                     
    </ROW> 
</KUNDE> 
</ROWSET> 

XML是從數據庫導出並讓我得到它變成一個更好的結構,這是必要的。我用XSLT嘗試了幾個不同的東西,但我是XSLT的新手,希望能夠尋求幫助。

預先感謝您。

回答

0

您可以使用XSLT分組,這是一個XSLT 2.0功能。

訣竅是使用< xsl:for-each-group >元素。

請注意,以下代碼不完整 - 您需要<副本...... >您需要的所有節點。

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

    <xsl:template match="ROWSET"> 
    <ROWSET> 
     <xsl:for-each-group select="ROW" group-by="KUNDENNR"> 
     <KUNDE> 
      <!-- this is the common part --> 
      <xsl:copy-of select="NAME1" /> 
      <xsl:copy-of select="UEBERKUNDE" /> 

      <!-- iterate over every ROW in the group --> 
      <xsl:for-each select="current-group()"> 
      <ROW> 
       <xsl:copy-of select="JAHR" /> 
       <xsl:copy-of select="MONAT" /> 
      </ROW> 
      </xsl:for-each> 

     </KUNDE> 
     </xsl:for-each-group> 
    </ROWSET> 
    </xsl:template> 
</xsl:stylesheet> 

鑑於你的XML文檔和上面的XSLT,輸出將是:

<?xml version="1.0" encoding="UTF-8"?> 
<ROWSET> 
    <KUNDE> 
     <NAME1>Some Name</NAME1> 
     <UEBERKUNDE>Some Value</UEBERKUNDE> 
     <ROW> 
     <JAHR>2012</JAHR> 
     <MONAT>2</MONAT> 
     </ROW> 
     <ROW> 
     <JAHR>2011</JAHR> 
     <MONAT>1</MONAT> 
     </ROW> 
    </KUNDE> 
</ROWSET> 

您還可以閱讀this article具有使用,每個組的一些很好的例子。

+0

感謝您的快速響應。你的解決方案似乎看起來是正確的,但我注意到我在內獲得了相同的結果:-(這意味着我得到了兩次,但內容完全相同。 – gasparuff 2013-03-06 10:48:45

+0

你確定嗎?只是複製你的確切的XML與我的XSLT並將其轉換它我有兩個不同的內容我已經粘貼我的輸出到答案 – kamituel 2013-03-06 11:08:01

+0

對不起,我的錯......我搞砸了我的XML,所以它包含從一開始就相同的值lol。你的解決方案就像一個魅力,非常感謝你。 – gasparuff 2013-03-06 11:08:09