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

к сведению, что первые и последние -элементов имеют одинаковое значение в пределах. Теперь я хотел бы превратить этот 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

+0

Вы уверены? просто скопировал ваш точный XML с помощью моего XSLT и преобразовал его. У меня есть два с различным содержимым. Я вставил свой вывод в ответ. – kamituel

+0

Извините, моя вина ... Я как-то испортил свой XML, поэтому он содержал те же самые значения с самого начала на lol. Ваше решение работает как шарм. Большое вам спасибо. – gasparuff

Смежные вопросы