0

我有一个如下所示的 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 的新手,并希望寻求帮助。

先感谢您。

4

1 回答 1

0

您可以使用 XSLT 分组,这是 XSLT 2.0 的一个特性。

诀窍是使用 <xsl:for-each-group> 元素。

请注意,以下代码并不完整——您需要 <copy-of ...> 您需要的所有节点。

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

您还可以阅读这篇文章,其中有一些使用 for-each-group 的好例子。

于 2013-03-06T10:37:04.107 回答