XML - 使用XSLT将标记组合到子项

时间:2013-03-06 10:12:00

标签: xml xslt

我有一个如下所示的XML:

<?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>

请注意,第一个和最后一个元素具有相同的值。现在我想用XSLT将XML转换为以下结构:

<?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的新手,并希望寻求帮助。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用XSLT分组,这是一个XSLT 2.0功能。

诀窍是使用&lt; xsl:for-each-group&gt;元件。

请注意,以下代码不完整 - 您需要&lt; copy-of ...&gt;您需要的所有节点。

<?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,其中有一些使用for-each-group的好例子。