2013-03-06 64 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