2013-05-29 2 views
0

I가 오라클-DB에서 내 보낸 다음 XML 파일 :XSLT 방법 그룹에 알아낼 수 없습니다 제대로

<?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> 
: 나는 다음과 같은 구조로 변환 할 필요가 http://pastebin.com/0yPcc7HT

나는 여러 시간 동안 여러 가지 일을 시도했지만, 올바르게 수행하는 법을 알 수 없습니다. 이건 내 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> 

요소가 너무 자주 나타납니다. 내가 잘못하고있는 것은 무엇이고 그것을 작동시키기 위해 무엇을 바꾸어야합니까?

당신은 XSLT 2.0 프로세서와 for-each-group을 사용할 수 있습니다 가정, 사전에 모든

+0

이 게시 된 스타일 시트가 원하는 게 무엇을 다음과 같은 결과를 만들어? –

+0

아니요, 'Spesen'과'Preislisten '의 요소가 여러 번 나타나기 때문에 – gasparuff

답변

1

먼저 주셔서 감사합니다, 나는 단순히 중첩 for-each-group 지침을 필요로하는 것처럼, 키와 Muenchian 그룹 귀찮게하지 않을 것입니다. 색슨 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

당신의 솔루션은 매력처럼 작동합니다. 정말 고마워요! XSLT 1.0을 사용하려면 XSL을 어떻게 수정해야합니까? – gasparuff

+0

XSLT 1.0 솔루션을 설명 할 시간이 없습니다. 다중 레벨 Muenchian 그룹화 예제는 http://www.biglist.com/lists/xsl-list/archives/200101/msg00070.html을 참조하십시오. –