2013-05-29 32 views
0

我有下面的XML文件,這是從一個Oracle數據庫導出:http://pastebin.com/0yPcc7HTXSLT無法弄清楚如何正確組

我需要將其轉換爲以下結構:

<?xml version="1.0" encoding="UTF-8"?> 
<ROWSET> 
    <KUNDE> 
     <KUNDENNR>59957</KUNDENNR> 
     <ANSPRECHPARTNERS> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>3</ANSPRECHNR> 
      <FUNKTION>lfd. Kontakt,     </FUNKTION> 
      <VORNAME>Some       </VORNAME> 
      <NACHNAME>Dude      </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>123456789</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>1</ANSPRECHNR> 
      <FUNKTION>Sachbearbeitung    </FUNKTION> 
      <VORNAME>Another      </VORNAME> 
      <NACHNAME>Dudarina     </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>2</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     </ANSPRECHPARTNERS> 
    </KUNDE> 
</ROWSET> 

我已經嘗試了幾個小時的不同事情,但我無法找到正確的方法。這是我的XSLT文件看起來像:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="rowsByKDNR" match="ROW" use="concat(KUNDENNR, '+', ANSPRECHNR)"></xsl:key> 

    <xsl:template match="ROWSET"> 

     <ROWSET> 
      <xsl:for-each-group select="ROW" group-by="KUNDENNR"> 
       <KUNDE> 
        <xsl:copy-of select="KUNDENNR" /> 
        <ANSPRECHPARTNERS> 
         <xsl:for-each select="current-group()[count(. | key('rowsByMonth', concat(KUNDENNR, '+', ANSPRECHNR))[1]) = 1]"> 
          <ANSPRECHPARTNER> 
           <xsl:copy-of select="ANSPRECHNR" /> 
           <xsl:copy-of select="FUNKTION" /> 
           <xsl:copy-of select="VORNAME" /> 
           <xsl:copy-of select="NACHNAME" /> 
           <xsl:copy-of select="ABTEILUNG" /> 
           <xsl:copy-of select="EMAIL" /> 
           <xsl:copy-of select="TELEFON" /> 
           <PREISLISTEN> 
            <xsl:for-each select="key('rowsByKDNR', concat(KUNDENNR, '+', ANSPRECHNR))"> 
              <xsl:copy-of select="PREISLISTE" /> 
            </xsl:for-each> 
           </PREISLISTEN> 
           <SPESEN> 
            <xsl:for-each select="key('rowsByKDNR', concat(KUNDENNR, '+', ANSPRECHNR))"> 
             <SPESE> 
              <xsl:value-of select="SPESEN" /> 
             </SPESE> 
            </xsl:for-each> 
           </SPESEN> 
          </ANSPRECHPARTNER> 
         </xsl:for-each> 
        </ANSPRECHPARTNERS> 
       </KUNDE> 
      </xsl:for-each-group> 

     </ROWSET> 
    </xsl:template></xsl:stylesheet> 

但是這給了我下面的結果:在PREISLISTENSPESEN

<?xml version="1.0" encoding="UTF-8"?> 
<ROWSET> 
    <KUNDE> 
     <KUNDENNR>59957</KUNDENNR> 
     <ANSPRECHPARTNERS> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>3</ANSPRECHNR> 
      <FUNKTION>lfd. Kontakt,     </FUNKTION> 
      <VORNAME>Some       </VORNAME> 
      <NACHNAME>Dude      </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>123456789</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>1</ANSPRECHNR> 
      <FUNKTION>Sachbearbeitung    </FUNKTION> 
      <VORNAME>Another      </VORNAME> 
      <NACHNAME>Dudarina     </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>2</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     </ANSPRECHPARTNERS> 
    </KUNDE> 
</ROWSET> 

元素纔出現過於頻繁。我做錯了什麼,爲了使它工作,我需要改變什麼?

預先感謝您

+0

並張貼樣式表,你想要什麼? –

+0

不,因爲'Spesen'和'Preislisten'中的元素多次出現 – gasparuff

回答

1

首先,假設你可以使用XSLT 2.0處理器和for-each-group,我不會與鍵和Muenchian分組的麻煩,會按照需要,我只是窩for-each-group說明。

此基礎上,當撒克遜9.5應用樣式表

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

    <xsl:template match="ROWSET"> 

    <ROWSET> 
     <xsl:for-each-group select="ROW" group-by="KUNDENNR"> 
     <KUNDE> 
      <xsl:copy-of select="KUNDENNR" /> 
      <ANSPRECHPARTNERS> 
      <xsl:for-each-group select="current-group()" group-by="ANSPRECHNR"> 
       <ANSPRECHPARTNER> 
       <xsl:copy-of select="ANSPRECHNR, FUNKTION, VORNAME, NACHNAME, 
                ABTEILUNG, EMAIL, TELEFON" /> 
       <PREISLISTEN> 
        <xsl:for-each-group select="current-group()" group-by="PREISLISTE"> 
        <xsl:copy-of select="PREISLISTE"/> 
        </xsl:for-each-group> 
       </PREISLISTEN> 
       <SPESEN> 
        <xsl:for-each-group select="current-group()" group-by="SPESEN"> 
        <SPESE> 
         <xsl:value-of select="current-grouping-key()" /> 
        </SPESE> 
        </xsl:for-each-group> 
       </SPESEN> 
       </ANSPRECHPARTNER> 
      </xsl:for-each-group> 
      </ANSPRECHPARTNERS> 
     </KUNDE> 
     </xsl:for-each-group> 

    </ROWSET> 
    </xsl:template> 

</xsl:stylesheet> 

給你鏈接到它的輸入產生以下結果

<?xml version="1.0" encoding="UTF-8"?> 
<ROWSET> 
    <KUNDE> 
     <KUNDENNR>59957</KUNDENNR> 
     <ANSPRECHPARTNERS> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>3</ANSPRECHNR> 
      <FUNKTION>lfd. Kontakt,     </FUNKTION> 
      <VORNAME>Some       </VORNAME> 
      <NACHNAME>Dude      </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>123456789</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     <ANSPRECHPARTNER> 
      <ANSPRECHNR>1</ANSPRECHNR> 
      <FUNKTION>Sachbearbeitung    </FUNKTION> 
      <VORNAME>Another      </VORNAME> 
      <NACHNAME>Dudarina     </NACHNAME> 
      <ABTEILUNG>Einkauf      </ABTEILUNG> 
      <EMAIL>[email protected]</EMAIL> 
      <TELEFON>2</TELEFON> 
      <PREISLISTEN> 
       <PREISLISTE>Katalog      </PREISLISTE> 
       <PREISLISTE>Y OO       </PREISLISTE> 
       <PREISLISTE>Kopierpapier "A"    </PREISLISTE> 
       <PREISLISTE>Aktion Internet    </PREISLISTE> 
       <PREISLISTE>Tinte Toner "H"    </PREISLISTE> 
       <PREISLISTE>News Internet     </PREISLISTE> 
      </PREISLISTEN> 
      <SPESEN> 
       <SPESE>Sonderbeschaffungskosten  </SPESE> 
       <SPESE>MM-Zuschlag55 3.6    </SPESE> 
      </SPESEN> 
     </ANSPRECHPARTNER> 
     </ANSPRECHPARTNERS> 
    </KUNDE> 
</ROWSET> 
+0

您的解決方案像魅力一樣工作,非常感謝!我如何修改XSL以使其與XSLT 1.0協同工作? – gasparuff

+0

我沒有時間詳細說明XSLT 1.0解決方案,請參閱http://www.biglist.com/lists/xsl-list/archives/200101/msg00070.html以獲取多級Muenchian分組示例。 –