juls_pro_37: XSLT-Gruppierung (keine Duplikate)

Hallo,

benötige bitte eure Hilfe, leider bekomme ich das nicht hin.

Hier ein Auszug aus meinem XML-File:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
...
      <HeaderText>
        <Qualifier>AAI</Qualifier>
        <Text>AAI10854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>DEL</Qualifier>
        <Text>DEL0854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>AAI</Qualifier>
        <Text>AAI10854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>DEL</Qualifier>
        <Text>DEL0854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>AAI</Qualifier>
        <Text>AAI10854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>DEL</Qualifier>
        <Text>DEL0854</Text>
      </HeaderText>
      ...
      <LineItem>
        <Lines>
          ...
          <LineText>
            <Qualifier>AAA</Qualifier>
            <Text>AAA1-0927</Text>
          </LineText>
          <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>LIN1-0927</Text>
          </LineText>
          <LineText>
            <Qualifier>AAA</Qualifier>
            <Text>AAA1-0927</Text>
          </LineText>
        </Lines>
      </LineItem>
      ...

Korrekt wäre jedoch:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
...
      <HeaderText>
        <Qualifier>AAI</Qualifier>
        <Text>AAI10854</Text>
      </HeaderText>
      <HeaderText>
        <Qualifier>DEL</Qualifier>
        <Text>DEL0854</Text>
      </HeaderText>     
      ...
      <LineItem>
        <Lines>
          ...
          <LineText>
            <Qualifier>AAA</Qualifier>
            <Text>AAA1-0927</Text>
          </LineText>
          <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>LIN1-0927</Text>
          </LineText>         
        </Lines>
      </LineItem>
      ...

Kann man das mittels XSLT lösen?

VIELEN DANK!

LG Julian

akzeptierte Antworten

  1. Hallo juls_pro_37,

    Korrekt wäre jedoch:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    ...
          <HeaderText>
            <Qualifier>AAI</Qualifier>
            <Text>AAI10854</Text>
          </HeaderText>
          <HeaderText>
            <Qualifier>DEL</Qualifier>
            <Text>DEL0854</Text>
          </HeaderText>     
          ...
          <LineItem>
            <Lines>
              ...
              <LineText>
                <Qualifier>AAA</Qualifier>
                <Text>AAA1-0927</Text>
              </LineText>
              <LineText>
                <Qualifier>LIN</Qualifier>
                <Text>LIN1-0927</Text>
              </LineText>         
            </Lines>
          </LineItem>
          ...
    

    Kann man das mittels XSLT lösen?

    Vom unvollständigen XML-Dokument ausgehend – root als Wurzelelement gewählt – kommt man so zur gezeigten Ausgabe mittels Gruppierung unter XSLT 2.0:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
    
      <xsl:template match="root">
        <out>
          <xsl:for-each-group select="HeaderText" group-by="Qualifier">
            <xsl:for-each select="current-group()">
              <xsl:if test="position() = 1">
                <xsl:copy-of select="."/>
              </xsl:if>
            </xsl:for-each>
          </xsl:for-each-group>
    
          <LineItem>
            <Lines>
              <xsl:for-each-group select="LineItem/Lines/LineText" group-by="Qualifier">
                <xsl:for-each select="current-group()">
                  <xsl:if test="position() = 1">
                    <xsl:copy-of select="."/>
                  </xsl:if>
                </xsl:for-each>
              </xsl:for-each-group>
            </Lines>
          </LineItem>
        </out>
    
      </xsl:template>
    
    </xsl:stylesheet>
    
    

    Grüße,
    Thomas

    1. Hi Thomas,

      danke schon mal für deine Antwort. Leider kann ich das XSLT so nicht ganz verarbeiten.

      Hilft dir das u.s. erweiterte XML weiter? xmls-version 1.0. -> kann ich da das von dir vorgeschlagene xslt 2.0 verwenden?

      <?xml version="1.0" encoding="utf-8" standalone="yes"?>
      <SALESINVOICE>
        <Interchange>
          <Recipient></Recipient>
          <Sender></Sender>
          <HeaderInformation>
            <OrigInvoiceNumber>4´1</OrigInvoiceNumber>
            <InvoiceType>INVOIC</InvoiceType>
            <HeaderText>
              <Qualifier>AAI</Qualifier>
              <Text>AAI10854</Text>
            </HeaderText>
            <HeaderText>
              <Qualifier>DEL</Qualifier>
              <Text>DEL0854</Text>
            </HeaderText>
            <HeaderText>
              <Qualifier>AAI</Qualifier>
              <Text>AAI10854</Text>
            </HeaderText>
            <HeaderText>
              <Qualifier>DEL</Qualifier>
              <Text>DEL0854</Text>
            </HeaderText>
            <HeaderText>
              <Qualifier>AAI</Qualifier>
              <Text>AAI10854</Text>
            </HeaderText>
            <HeaderText>
              <Qualifier>DEL</Qualifier>
              <Text>DEL0854</Text>
            </HeaderText>      
            <LineItem>
              <Lines>
                <OrderLineNum>1</OrderLineNum>   
                <GTINNumber>1234567891234</GTINNumber>
                <GTINDescription>Testartikel</GTINDescription>          
                <LineText>
                  <Qualifier>AAA</Qualifier>
                  <Text>AAA1-0927</Text>
                </LineText>
                <LineText>
                  <Qualifier>LIN</Qualifier>
                  <Text>LIN1-0927</Text>
                </LineText>
                <LineText>
                  <Qualifier>AAA</Qualifier>
                  <Text>AAA1-0927</Text>
                </LineText>
              </Lines>
            </LineItem>      
          </HeaderInformation>
        </Interchange>
      </SALESINVOICE>
      

      Danke nochmals, lg Julian

      1. Hallo juls_pro_37,

        Hilft dir das u.s. erweiterte XML weiter? xmls-version 1.0. -> kann ich da das von dir vorgeschlagene xslt 2.0 verwenden?

        Mir hilft es zumindest zum Erezugen der Ausgabe:

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        
          <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
        
          <!-- Identity-Template für die nicht explizit benannten Elemente -->
          <xsl:template match="@* | node()">
            <xsl:copy>
              <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
          </xsl:template>
        
          <xsl:template match="HeaderInformation">
            <HeaderInformation>
              <xsl:copy-of select="HeaderText[1]/preceding-sibling::*"/>
              <xsl:for-each-group select="HeaderText" group-by="Qualifier">
                <xsl:for-each select="current-group()">
                  <xsl:if test="position() = 1">
                    <xsl:copy-of select="."/>
                  </xsl:if>
                </xsl:for-each>
              </xsl:for-each-group>
              <xsl:apply-templates select="LineItem"/>
            </HeaderInformation>
          </xsl:template>
        
          <xsl:template match="LineItem">
            <LineItem>
              <Lines>
                <xsl:copy-of select="Lines/LineText[1]/preceding-sibling::*"/>
                <xsl:for-each-group select="Lines/LineText" group-by="Qualifier">
                  <xsl:for-each select="current-group()">
                    <xsl:if test="position() = 1">
                      <xsl:copy-of select="."/>
                    </xsl:if>
                  </xsl:for-each>
                </xsl:for-each-group>
              </Lines>
            </LineItem>
          </xsl:template>
        
        </xsl:stylesheet>
        
        

        XML-Ergebnis:

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SALESINVOICE>
           <Interchange>
              <Recipient/>
              <Sender/>
              <HeaderInformation>
                 <OrigInvoiceNumber>4´1</OrigInvoiceNumber>
                 <InvoiceType>INVOIC</InvoiceType>
                 <HeaderText>
                    <Qualifier>AAI</Qualifier>
                    <Text>AAI10854</Text>
                 </HeaderText>
                 <HeaderText>
                    <Qualifier>DEL</Qualifier>
                    <Text>DEL0854</Text>
                 </HeaderText>
                 <LineItem>
                    <Lines>
                       <OrderLineNum>1</OrderLineNum>
                       <GTINNumber>1234567891234</GTINNumber>
                       <GTINDescription>Testartikel</GTINDescription>
                       <LineText>
                          <Qualifier>AAA</Qualifier>
                          <Text>AAA1-0927</Text>
                       </LineText>
                       <LineText>
                          <Qualifier>LIN</Qualifier>
                          <Text>LIN1-0927</Text>
                       </LineText>
                    </Lines>
                 </LineItem>
              </HeaderInformation>
           </Interchange>
        </SALESINVOICE>
        
        

        Grüße,
        Thomas

        1. Hi Thomas,

          soweit so gut, konnte das File unter transformer korrekt ausgeben, nachdem ich bei <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/> das standalone entfernte.

          Stehe nun vor dem Problem, dass ich die XSLT-Version 1.0 verwende und hier habe ich ein Problem mit dem for-each-group.

          Gibt es hierfür auch eine Lösung, mit der du mir helfen kannst?

          DANKE, lg Julian

          1. Hallo Zum Profil von Benutzer juls_pro_37 juls_pro_37,

            Hi Thomas,

            soweit so gut, konnte das File unter transformer korrekt ausgeben, nachdem ich bei <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/> das standalone entfernte.

            Stehe nun vor dem Problem, dass ich die XSLT-Version 1.0 verwende und hier habe ich ein Problem mit dem for-each-group.

            Gibt es hierfür auch eine Lösung, mit der du mir helfen kannst?

            Lösung wäre mit dem so genannten Muenchian Grouping machbar (xsl:key, generate-id() & Co.), wobei man sich das 11 Jahre nach XSLT 2.0 nicht mehr antun möchte.

            Wenn Du einen freien XSLT-Prozessor für 2.0/3.0 benötigst, dann nimm Saxon-HE.

            java -jar saxon9he.jar -s:name.xml -xsl:name.xsl -o:name.out

            Grüße,
            Thomas

            1. Hi Thomas,

              danke für deine Hilfe.

              Das dachte ich mir, habe ich auch nach meiner Recherche entdeckt. -> Nur leider war ich erfolglos bei der Umsetzung der Muenchian Grouping und eine Umstellung auf XSLT 2.0 ist noch fraglich…

              LG Julian

              1. Hallo juls_pro_37,

                -> Nur leider war ich erfolglos bei der Umsetzung der Muenchian Grouping und eine Umstellung auf XSLT 2.0 ist noch fraglich…

                Ok, habe das nochmal mit XSLT 1.0 umgesetzt:

                <?xml version="1.0" encoding="UTF-8"?>
                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                
                  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
                
                  <xsl:key name="header_text" match="HeaderText" use="Qualifier"/>
                  <xsl:key name="line_text" match="LineText" use="Qualifier"/>
                
                  <!-- Identity-Template für die nicht explizit benannten Elemente -->
                  <xsl:template match="@* | node()">
                    <xsl:copy>
                      <xsl:apply-templates select="@* | node()"/>
                    </xsl:copy>
                  </xsl:template>
                
                  <xsl:template match="HeaderInformation">
                    <HeaderInformation>
                      <xsl:copy-of select="HeaderText[1]/preceding-sibling::*"/>
                      <xsl:for-each select="HeaderText[generate-id() =
                                            generate-id(key('header_text', Qualifier)[1])]">
                        <xsl:variable name="akt_key" select="Qualifier"/>
                        <xsl:variable name="akt_group" select="key('header_text', $akt_key)"/>
                        <xsl:for-each select="$akt_group">
                          <xsl:if test="position() = 1">
                            <xsl:copy-of select="."/>
                          </xsl:if>
                        </xsl:for-each>
                      </xsl:for-each>
                      <xsl:apply-templates select="LineItem"/>
                    </HeaderInformation>
                  </xsl:template>
                
                  <xsl:template match="LineItem">
                    <LineItem>
                      <Lines>
                        <xsl:copy-of select="Lines/LineText[1]/preceding-sibling::*"/>
                        <xsl:for-each select="Lines/LineText[generate-id() =
                                              generate-id(key('line_text', Qualifier)[1])]">
                          <xsl:variable name="akt_key" select="Qualifier"/>
                          <xsl:variable name="akt_group" select="key('line_text', $akt_key)"/>
                          <xsl:for-each select="$akt_group">
                            <xsl:if test="position() = 1">
                              <xsl:copy-of select="."/>
                            </xsl:if>
                          </xsl:for-each>
                        </xsl:for-each>
                      </Lines>
                    </LineItem>
                  </xsl:template>
                
                </xsl:stylesheet>
                

                Und es gilt natürlich wieder … 😎

                Grüße,
                Thomas

                1. DANKE!!!!!!!!!!! funktioniert einwandfrei! :) hast mir schon richtig geholfen!!

                  Hab jetzt nur noch das Thema, dass mir weitere Knoten aus meinem XML nicht mehr ausgegeben werden. (Diese hab ich dir ja auch nicht gemeldet)

                  Kann ich dir das vollständige XML (z.B. per Mail?) senden?

                  Bzw. wie ist das, wenn ich später mal das XML mit weiteren Knoten befülle?

                  Mein Wunsch ist es, dass unter HeaderText und LineText keine Duplikate angeführt werden, das restliche XML soll unverändert bleiben.

                  LG Julian

                2. Hi Thomas,

                  leider sieht mein XML nach Anleitung der XSLT-Lösung folg. aus:

                  <?xml version="1.0" encoding="utf-8"?><SALESINVOICE>
                    <Interchange>
                      <Recipient></Recipient>
                      <Sender></Sender>
                      <CreationDate></CreationDate>
                      <Test></Test>
                      <Interchange_Control_Number></Interchange_Control_Number>
                      <HeaderInformation><OrigInvoiceNumber></OrigInvoiceNumber><InvoiceType></InvoiceType><InvoiceDate></InvoiceDate><InvoiceNumber></InvoiceNumber><PurchOrderReference /><CustomerOrderReference></CustomerOrderReference><SalesOrderReference></SalesOrderReference><SalesOrderDate></SalesOrderDate><PackingslipId></PackingslipId><DeliveryDate></DeliveryDate><Currency></Currency><TaxExempt></TaxExempt><OurAccountNum /><HeaderText>
                          <Qualifier>AAI</Qualifier>
                          <Text>AAI10854</Text>
                        </HeaderText><HeaderText>
                          <Qualifier>DEL</Qualifier>
                          <Text>DEL0854</Text>
                        </HeaderText><LineItem><Lines><OrderLineNum></OrderLineNum><Promotion /><PackingslipId></PackingslipId><DeliveryDate /><GTINNumber></GTINNumber><GTINDescription></GTINDescription><SupplierArticleNumber></SupplierArticleNumber><BuyerArticleNumber /><Quantity></Quantity><PriceUnit></PriceUnit><FixedPrice></FixedPrice><SalesPrice></SalesPrice><SalesPriceNet /><DiscAmount></DiscAmount><DiscPercent></DiscPercent><SalesLinePercent1></SalesLinePercent1><SalesLinePercent2></SalesLinePercent2><MultiLnDisc></MultiLnDisc><MultiLnPercent></MultiLnPercent><LineAmount></LineAmount><SumLineDisc></SumLineDisc><DeliveredQuantity></DeliveredQuantity><VatBaseAmount></VatBaseAmount><VatPercentage></VatPercentage><Measure_Unit></Measure_Unit><LineText>
                              <Qualifier>AAA</Qualifier>
                              <Text>AAA1-0927</Text>
                            </LineText><LineText>
                              <Qualifier>LIN</Qualifier>
                              <Text>LIN1-0927</Text>
                            </LineText></Lines></LineItem></HeaderInformation>
                    </Interchange>
                  </SALESINVOICE>
                  

                  Jetzt fehlen mir einige meiner Knoten im XML, die Duplikate wurden jedoch korrekterweise entfernt.

                  Was hab ich hier falsch gemacht?

                  Hier das vollständige XML:

                  <?xml version="1.0" encoding="utf-8" standalone="yes"?>
                  <SALESINVOICE>
                    <Interchange>
                      <Recipient></Recipient>
                      <Sender></Sender>
                      <CreationDate></CreationDate>
                      <Test></Test>
                      <Interchange_Control_Number></Interchange_Control_Number>
                      <HeaderInformation>
                        <OrigInvoiceNumber></OrigInvoiceNumber>
                        <InvoiceType></InvoiceType>
                        <InvoiceDate></InvoiceDate>
                        <InvoiceNumber></InvoiceNumber>
                        <PurchOrderReference></PurchOrderReference>
                        <CustomerOrderReference></CustomerOrderReference>
                        <SalesOrderReference></SalesOrderReference>
                        <SalesOrderDate></SalesOrderDate>
                        <PackingslipId></PackingslipId>
                        <DeliveryDate></DeliveryDate>
                        <Currency></Currency>
                        <TaxExempt></TaxExempt>
                        <OurAccountNum></OurAccountNum>
                        <HeaderText>
                          <Qualifier>AAI</Qualifier>
                          <Text>AAI10854</Text>
                        </HeaderText>
                        <HeaderText>
                          <Qualifier>DEL</Qualifier>
                          <Text>DEL0854</Text>
                        </HeaderText>
                        <HeaderText>
                          <Qualifier>AAI</Qualifier>
                          <Text>AAI10854</Text>
                        </HeaderText>
                        <HeaderText>
                          <Qualifier>DEL</Qualifier>
                          <Text>DEL0854</Text>
                        </HeaderText>
                        <HeaderText>
                          <Qualifier>AAI</Qualifier>
                          <Text>AAI10854</Text>
                        </HeaderText>
                        <HeaderText>
                          <Qualifier>DEL</Qualifier>
                          <Text>DEL0854</Text>
                        </HeaderText>
                        <Contact>
                          <Contact></Contact>
                          <ContactPhone></ContactPhone>
                          <ContactMail></ContactMail>
                        </Contact>
                        <TermsOfPayment>
                          <PaymTermDescription></PaymTermDescription>
                          <DueDate></DueDate>
                        </TermsOfPayment>
                        <CashDiscountConditions>
                          <CashDiscountConditions></CashDiscountConditions>
                          <CashDiscPercent></CashDiscPercent>
                          <CashDiscDate></CashDiscDate>
                        </CashDiscountConditions>
                        <WeightAndVolume>
                          <NetWeight></NetWeight>
                          <UnifOfWeight></UnifOfWeight>
                        </WeightAndVolume>
                        <SupplierAddressInformation>
                          <EANcode></EANcode>
                          <Name></Name>
                          <Street></Street>
                          <ZipCode></ZipCode>
                          <City></City>
                          <Country></Country>
                          <CoRegNum></CoRegNum>
                          <VATNum></VATNum>
                          <PlaceOfJurisdiction></PlaceOfJurisdiction>
                          <WeeeNumber></WeeeNumber>
                        </SupplierAddressInformation>
                        <BuyerAddressInformation>
                          <EANcode></EANcode>
                          <Name></Name>
                          <Street></Street>
                          <ZipCode></ZipCode>
                          <City></City>
                          <Country></Country>
                          <VATNum></VATNum>
                          <InternalNumber></InternalNumber>
                        </BuyerAddressInformation>
                        <InvoiceAddressInformation>
                          <EANcode></EANcode>
                          <Name></Name>
                          <Street></Street>
                          <ZipCode></ZipCode>
                          <City></City>
                          <Country></Country>
                          <VATNum></VATNum>
                          <InternalNumber></InternalNumber>
                        </InvoiceAddressInformation>
                        <DeliveryAddressInformation>
                          <EANcode></EANcode>
                          <Name></Name>
                          <Street></Street>
                          <ZipCode></ZipCode>
                          <City></City>
                          <Country></Country>
                          <State></State>
                          <VATNum></VATNum>
                          <InternalNumber></InternalNumber>
                        </DeliveryAddressInformation>
                        <TransportDetails>
                          <DeliveryMode></DeliveryMode>
                          <DeliveryTerms></DeliveryTerms>
                          <DeliveryReason></DeliveryReason>
                        </TransportDetails>
                        <LineItem>
                          <Lines>
                            <OrderLineNum></OrderLineNum>
                            <Promotion></Promotion>
                            <PackingslipId></PackingslipId>
                            <DeliveryDate></DeliveryDate>
                            <GTINNumber></GTINNumber>
                            <GTINDescription></GTINDescription>
                            <SupplierArticleNumber></SupplierArticleNumber>
                            <BuyerArticleNumber></BuyerArticleNumber>
                            <Quantity></Quantity>
                            <PriceUnit></PriceUnit>
                            <FixedPrice></FixedPrice>
                            <SalesPrice></SalesPrice>
                            <SalesPriceNet></SalesPriceNet>
                            <DiscAmount></DiscAmount>
                            <DiscPercent></DiscPercent>
                            <SalesLinePercent1></SalesLinePercent1>
                            <SalesLinePercent2></SalesLinePercent2>
                            <MultiLnDisc></MultiLnDisc>
                            <MultiLnPercent></MultiLnPercent>
                            <LineAmount></LineAmount>
                            <SumLineDisc></SumLineDisc>
                            <DeliveredQuantity></DeliveredQuantity>
                            <VatBaseAmount></VatBaseAmount>
                            <VatPercentage></VatPercentage>
                            <Measure_Unit></Measure_Unit>
                            <LineText>
                              <Qualifier>AAA</Qualifier>
                              <Text>AAA1-0927</Text>
                            </LineText>
                            <LineText>
                              <Qualifier>LIN</Qualifier>
                              <Text>LIN1-0927</Text>
                            </LineText>
                            <LineText>
                              <Qualifier>AAA</Qualifier>
                              <Text>AAA1-0927</Text>
                            </LineText>
                          </Lines>
                        </LineItem>
                        <Totals>
                          <InvoiceTotal></InvoiceTotal>
                          <NetAmount></NetAmount>
                          <VATAmount></VATAmount>
                          <DiscountAmount></DiscountAmount>
                          <AllowanceOrChargeAmount></AllowanceOrChargeAmount>
                          <DueDate></DueDate>
                          <VAT>
                            <VATS>
                              <Percentage></Percentage>
                              <Type></Type>
                              <BaseAmount></BaseAmount>
                              <VATAmount></VATAmount>
                            </VATS>
                          </VAT>
                        </Totals>
                      </HeaderInformation>
                    </Interchange>
                  </SALESINVOICE>
                  

                  XSLT:

                  <?xml version="1.0" encoding="UTF-8"?>
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                  
                    <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
                  
                    <xsl:key name="header_text" match="HeaderText" use="Text"/>
                    <xsl:key name="line_text" match="LineText" use="Text"/>
                  
                    <!-- Identity-Template für die nicht explizit benannten Elemente -->
                    <xsl:template match="@* | node()">
                      <xsl:copy>
                        <xsl:apply-templates select="@* | node()"/>
                      </xsl:copy>
                    </xsl:template>
                  
                    <xsl:template match="HeaderInformation">
                      <HeaderInformation>
                        <xsl:copy-of select="HeaderText[1]/preceding-sibling::*"/>
                        <xsl:for-each select="HeaderText[generate-id() =
                                              generate-id(key('header_text', Text)[1])]">
                          <xsl:variable name="akt_key" select="Text"/>
                          <xsl:variable name="akt_group" select="key('header_text', $akt_key)"/>
                          <xsl:for-each select="$akt_group">
                            <xsl:if test="position() = 1">
                              <xsl:copy-of select="."/>
                            </xsl:if>
                          </xsl:for-each>
                        </xsl:for-each>
                        <xsl:apply-templates select="LineItem"/>
                      </HeaderInformation>
                    </xsl:template>
                  
                    <xsl:template match="LineItem">
                      <LineItem>
                        <Lines>
                          <xsl:copy-of select="Lines/LineText[1]/preceding-sibling::*"/>
                          <xsl:for-each select="Lines/LineText[generate-id() =
                                                generate-id(key('line_text', Text)[1])]">
                            <xsl:variable name="akt_key" select="Text"/>
                            <xsl:variable name="akt_group" select="key('line_text', $akt_key)"/>
                            <xsl:for-each select="$akt_group">
                              <xsl:if test="position() = 1">
                                <xsl:copy-of select="."/>
                              </xsl:if>
                            </xsl:for-each>
                          </xsl:for-each>
                        </Lines>
                      </LineItem>
                    </xsl:template>
                  
                  </xsl:stylesheet>
                  

                  LG Julian

                  1. Hallo Julian,

                    Jetzt fehlen mir einige meiner Knoten im XML, die Duplikate wurden jedoch korrekterweise entfernt.

                    Was hab ich hier falsch gemacht?

                    Das ist schon ein ziemlicher Stunt, sich in Deinen Code zu frickeln. Mein Ansatz konnte nicht genannte Teile der Struktur auch nicht berücksichtigen.

                    So sollte es passen (erzeugt bei fünf von neun entfernten Vierzeilern HeaderText bzw. LineText genau 20 Zeilen weniger):

                    <?xml version="1.0" encoding="UTF-8"?>
                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                    
                      <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
                    
                      <xsl:key name="header_text" match="HeaderText" use="Text"/>
                      <xsl:key name="line_text" match="LineText" use="Text"/>
                    
                      <!-- Identity-Template für die nicht explizit benannten Elemente -->
                      <xsl:template match="@* | node()">
                        <xsl:copy>
                          <xsl:apply-templates select="@* | node()"/>
                        </xsl:copy>
                      </xsl:template>
                    
                      <xsl:template match="HeaderInformation">
                        <HeaderInformation>
                          <xsl:copy-of select="HeaderText[1]/preceding-sibling::*"/>
                          <xsl:for-each select="HeaderText[generate-id() =
                                                generate-id(key('header_text', Text)[1])]">
                            <xsl:variable name="akt_key" select="Text"/>
                            <xsl:variable name="akt_group" select="key('header_text', $akt_key)"/>
                            <xsl:for-each select="$akt_group">
                              <xsl:if test="position() = 1">
                                <xsl:copy-of select="."/>
                              </xsl:if>
                            </xsl:for-each>
                          </xsl:for-each>
                          <xsl:copy-of select="HeaderText[last()]/following-sibling::*[following-sibling::LineItem]"/>
                          <xsl:apply-templates select="LineItem"/>
                          <xsl:copy-of select="LineItem/following-sibling::*"/>
                        </HeaderInformation>
                      </xsl:template>
                    
                      <xsl:template match="LineItem">
                        <LineItem>
                          <Lines>
                            <xsl:copy-of select="Lines/LineText[1]/preceding-sibling::*"/>
                            <xsl:for-each select="Lines/LineText[generate-id() =
                                                  generate-id(key('line_text', Text)[1])]">
                              <xsl:variable name="akt_key" select="Text"/>
                              <xsl:variable name="akt_group" select="key('line_text', $akt_key)"/>
                              <xsl:for-each select="$akt_group">
                                <xsl:if test="position() = 1">
                                  <xsl:copy-of select="."/>
                                </xsl:if>
                              </xsl:for-each>
                            </xsl:for-each>
                          </Lines>
                        </LineItem>
                      </xsl:template>
                    
                    </xsl:stylesheet>
                    
                    

                    Grüße,
                    Thomas

                    1. 1000 DANK!!!!!!! hab die Anpassung eingespielt und die Datei sieht auf den ersten Blick vollständig aus. Werde ich morgen nochmals im Detail ansehen. VIELEN VIELEN DANK!!

                      Noch für mich zum Verständnis. Sollte ich mein XML noch anpassen, sprich weitere Knoten hinzufügen, muss ich dann in deinem XSLT etwas beachten/ergänzen?

                      DANKE

                      LG Julian

                      1. Hallo Julian,

                        Noch für mich zum Verständnis. Sollte ich mein XML noch anpassen, sprich weitere Knoten hinzufügen, muss ich dann in deinem XSLT etwas beachten/ergänzen?

                        Wenn diese auf den verwendeten Geschwisterachsen (preceding-/following-sibling) liegen, werden weitere Knoten mit ihren Kindknoten auch verarbeitet. Würden explizit adressierte Knoten wie LineItem weitere übergeordnete Elemente erhalten, müssten Abfragen angepasst werden.

                        Grüße,
                        Thomas

                        1. Danke für eine Hilfe und Erklärung! Bin dir echt sehr dankbar! 😀

                          Eine hoffentlich "Kleinigkeit" ist mir noch aufgefallen. Konkret geht es um den Knoten LineItem bzw. Lines.

                          Dies sollte so aussehen: (bei mehreren Artikelpositionen wird "Lines" unter "LineItem" mehrmals ausgegeben, je nachdem wie viele Positionen enthalten sind)

                          <?xml version="1.0" encoding="utf-8" standalone="yes"?>
                          <SALESINVOICE>
                            <Interchange>
                              <Recipient></Recipient>
                              <Sender></Sender>
                              <CreationDate></CreationDate>
                              <Test></Test>
                              <Interchange_Control_Number></Interchange_Control_Number>
                              <HeaderInformation>
                                <OrigInvoiceNumber></OrigInvoiceNumber>
                                <InvoiceType></InvoiceType>
                                <InvoiceDate></InvoiceDate>
                                <InvoiceNumber></InvoiceNumber>
                                <PurchOrderReference></PurchOrderReference>
                                <CustomerOrderReference></CustomerOrderReference>
                                <SalesOrderReference></SalesOrderReference>
                                <SalesOrderDate></SalesOrderDate>
                                <PackingslipId></PackingslipId>
                                <DeliveryDate></DeliveryDate>
                                <Currency></Currency>
                                <TaxExempt></TaxExempt>
                                <OurAccountNum></OurAccountNum>
                                <HeaderText>
                                  <Qualifier>AAI</Qualifier>
                                  <Text>AAI-Header-0848</Text>
                                </HeaderText>
                                <HeaderText>
                                  <Qualifier>DEL</Qualifier>
                                  <Text>DEL-Header-0848</Text>
                                </HeaderText>     
                                <Contact>
                                  <Contact></Contact>
                                  <ContactPhone></ContactPhone>
                                  <ContactMail></ContactMail>
                                </Contact>
                                <TermsOfPayment>
                                  <PaymTermDescription></PaymTermDescription>
                                  <DueDate></DueDate>
                                </TermsOfPayment>
                                <CashDiscountConditions>
                                  <CashDiscountConditions></CashDiscountConditions>
                                  <CashDiscPercent></CashDiscPercent>
                                  <CashDiscDate></CashDiscDate>
                                </CashDiscountConditions>
                                <WeightAndVolume>
                                  <NetWeight></NetWeight>
                                  <UnifOfWeight></UnifOfWeight>
                                </WeightAndVolume>
                                <SupplierAddressInformation>
                                  <EANcode></EANcode>
                                  <Name></Name>
                                  <Street></Street>
                                  <ZipCode></ZipCode>
                                  <City></City>
                                  <Country></Country>
                                  <CoRegNum></CoRegNum>
                                  <VATNum></VATNum>
                                  <PlaceOfJurisdiction></PlaceOfJurisdiction>
                                  <WeeeNumber></WeeeNumber>
                                </SupplierAddressInformation>
                                <BuyerAddressInformation>
                                  <EANcode></EANcode>
                                  <Name></Name>
                                  <Street></Street>
                                  <ZipCode></ZipCode>
                                  <City></City>
                                  <Country></Country>
                                  <VATNum></VATNum>
                                  <InternalNumber></InternalNumber>
                                </BuyerAddressInformation>
                                <InvoiceAddressInformation>
                                  <EANcode></EANcode>
                                  <Name></Name>
                                  <Street></Street>
                                  <ZipCode></ZipCode>
                                  <City></City>
                                  <Country></Country>
                                  <VATNum></VATNum>
                                  <InternalNumber></InternalNumber>
                                </InvoiceAddressInformation>
                                <DeliveryAddressInformation>
                                  <EANcode></EANcode>
                                  <Name></Name>
                                  <Street></Street>
                                  <ZipCode></ZipCode>
                                  <City></City>
                                  <Country></Country>
                                  <State></State>
                                  <VATNum></VATNum>
                                  <InternalNumber></InternalNumber>
                                </DeliveryAddressInformation>
                                <TransportDetails>
                                  <DeliveryMode></DeliveryMode>
                                  <DeliveryTerms></DeliveryTerms>
                                  <DeliveryReason></DeliveryReason>
                                </TransportDetails>
                                <LineItem>
                                  <Lines>
                                    <OrderLineNum>1</OrderLineNum>
                                    <Promotion></Promotion>
                                    <PackingslipId></PackingslipId>
                                    <DeliveryDate></DeliveryDate>
                                    <GTINNumber></GTINNumber>
                                    <GTINDescription></GTINDescription>
                                    <SupplierArticleNumber></SupplierArticleNumber>
                                    <BuyerArticleNumber></BuyerArticleNumber>
                                    <Quantity></Quantity>
                                    <PriceUnit></PriceUnit>
                                    <FixedPrice></FixedPrice>
                                    <SalesPrice></SalesPrice>
                                    <SalesPriceNet></SalesPriceNet>
                                    <DiscAmount></DiscAmount>
                                    <DiscPercent></DiscPercent>
                                    <SalesLinePercent1></SalesLinePercent1>
                                    <SalesLinePercent2></SalesLinePercent2>
                                    <MultiLnDisc></MultiLnDisc>
                                    <MultiLnPercent></MultiLnPercent>
                                    <LineAmount></LineAmount>
                                    <SumLineDisc></SumLineDisc>
                                    <DeliveredQuantity></DeliveredQuantity>
                                    <VatBaseAmount></VatBaseAmount>
                                    <VatPercentage></VatPercentage>
                                    <Measure_Unit></Measure_Unit>
                                    <LineText>
                                      <Qualifier>AAA</Qualifier>
                                      <Text>AAA1-0848</Text>
                                    </LineText>
                                    <LineText>
                                      <Qualifier>LIN</Qualifier>
                                      <Text>LIN1-0848</Text>
                                    </LineText>
                                  </Lines>
                                  <Lines>
                                    <OrderLineNum>2</OrderLineNum>
                                    <Promotion></Promotion>
                                    <PackingslipId></PackingslipId>
                                    <DeliveryDate></DeliveryDate>
                                    <GTINNumber></GTINNumber>
                                    <GTINDescription></GTINDescription>
                                    <SupplierArticleNumber></SupplierArticleNumber>
                                    <BuyerArticleNumber></BuyerArticleNumber>
                                    <Quantity></Quantity>
                                    <PriceUnit></PriceUnit>
                                    <FixedPrice></FixedPrice>
                                    <SalesPrice></SalesPrice>
                                    <SalesPriceNet></SalesPriceNet>
                                    <DiscAmount></DiscAmount>
                                    <DiscPercent></DiscPercent>
                                    <SalesLinePercent1></SalesLinePercent1>
                                    <SalesLinePercent2></SalesLinePercent2>
                                    <MultiLnDisc></MultiLnDisc>
                                    <MultiLnPercent></MultiLnPercent>
                                    <LineAmount></LineAmount>
                                    <SumLineDisc></SumLineDisc>
                                    <DeliveredQuantity></DeliveredQuantity>
                                    <VatBaseAmount></VatBaseAmount>
                                    <VatPercentage></VatPercentage>
                                    <Measure_Unit></Measure_Unit>
                                    <LineText>
                                      <Qualifier>AAA</Qualifier>
                                      <Text>AAA2-0848</Text>
                                    </LineText>
                                    <LineText>
                                      <Qualifier>LIN</Qualifier>
                                      <Text>LIN2-0848</Text>
                                    </LineText>
                                  </Lines>
                                </LineItem>
                                <Totals>
                                  <InvoiceTotal></InvoiceTotal>
                                  <NetAmount></NetAmount>
                                  <VATAmount></VATAmount>
                                  <DiscountAmount></DiscountAmount>
                                  <AllowanceOrChargeAmount></AllowanceOrChargeAmount>
                                  <DueDate></DueDate>
                                  <VAT>
                                    <VATS>
                                      <Percentage></Percentage>
                                      <Type></Type>
                                      <BaseAmount></BaseAmount>
                                      <VATAmount></VATAmount>
                                    </VATS>
                                  </VAT>
                                </Totals>
                              </HeaderInformation>
                            </Interchange>
                          </SALESINVOICE>
                          

                          Nach einfügen deines XSLTs, wird das jedoch zusammengefasst unter "Lines": (hier nur der Ausschnitt) - zu sehen bei "OrderLineNum" 1 bzw. 2 bedeutet, dass es sich um 2 Artikel handelt..

                          <LineItem>
                          				<Lines>
                          					<OrderLineNum>1</OrderLineNum>
                          					<Promotion />
                          					<PackingslipId></PackingslipId>
                          					<DeliveryDate />
                          					<GTINNumber></GTINNumber>
                          					<GTINDescription></GTINDescription>
                          					<SupplierArticleNumber></SupplierArticleNumber>
                          					<BuyerArticleNumber />
                          					<Quantity></Quantity>
                          					<PriceUnit></PriceUnit>
                          					<FixedPrice></FixedPrice>
                          					<SalesPrice></SalesPrice>
                          					<SalesPriceNet />
                          					<DiscAmount></DiscAmount>
                          					<DiscPercent></DiscPercent>
                          					<SalesLinePercent1></SalesLinePercent1>
                          					<SalesLinePercent2></SalesLinePercent2>
                          					<MultiLnDisc></MultiLnDisc>
                          					<MultiLnPercent></MultiLnPercent>
                          					<LineAmount></LineAmount>
                          					<SumLineDisc></SumLineDisc>
                          					<DeliveredQuantity></DeliveredQuantity>
                          					<VatBaseAmount></VatBaseAmount>
                          					<VatPercentage></VatPercentage>
                          					<Measure_Unit></Measure_Unit>
                          					<OrderLineNum>2</OrderLineNum>
                          					<Promotion />
                          					<PackingslipId></PackingslipId>
                          					<DeliveryDate />
                          					<GTINNumber></GTINNumber>
                          					<GTINDescription></GTINDescription>
                          					<SupplierArticleNumber></SupplierArticleNumber>
                          					<BuyerArticleNumber />
                          					<Quantity></Quantity>
                          					<PriceUnit></PriceUnit>
                          					<FixedPrice></FixedPrice>
                          					<SalesPrice></SalesPrice>
                          					<SalesPriceNet />
                          					<DiscAmount></DiscAmount>
                          					<DiscPercent></DiscPercent>
                          					<SalesLinePercent1></SalesLinePercent1>
                          					<SalesLinePercent2></SalesLinePercent2>
                          					<MultiLnDisc></MultiLnDisc>
                          					<MultiLnPercent></MultiLnPercent>
                          					<LineAmount></LineAmount>
                          					<SumLineDisc></SumLineDisc>
                          					<DeliveredQuantity></DeliveredQuantity>
                          					<VatBaseAmount></VatBaseAmount>
                          					<VatPercentage></VatPercentage>
                          					<Measure_Unit></Measure_Unit>
                          					<LineText>
                          						<Qualifier>AAA</Qualifier>
                          						<Text>AAA1-0848</Text>
                          					</LineText>
                          					<LineText>
                          						<Qualifier>LIN</Qualifier>
                          						<Text>LIN1-0848</Text>
                          					</LineText>
                          					<LineText>
                          						<Qualifier>AAA</Qualifier>
                          						<Text>AAA2-0848</Text>
                          					</LineText>
                          					<LineText>
                          						<Qualifier>LIN</Qualifier>
                          						<Text>LIN2-0848</Text>
                          					</LineText>
                          				</Lines>
                          			</LineItem>
                          			<Totals>
                          				<InvoiceTotal></InvoiceTotal>
                          				<NetAmount></NetAmount>
                          				<VATAmount></VATAmount>
                          				<DiscountAmount></DiscountAmount>
                          				<AllowanceOrChargeAmount></AllowanceOrChargeAmount>
                          				<DueDate></DueDate>
                          				<VAT>
                          					<VATS>
                          						<Percentage></Percentage>
                          						<Type></Type>
                          						<BaseAmount></BaseAmount>
                          						<VATAmount></VATAmount>
                          					</VATS>
                          				</VAT>
                          			</Totals>
                          

                          LG Julian

                          1. Hallo Julian,

                            Eine hoffentlich "Kleinigkeit" ist mir noch aufgefallen. Konkret geht es um den Knoten LineItem bzw. Lines.

                            Sorry, aber meine Geduld ist jetzt erschöpft. Du hast systematisch wesentliche Teile der Struktur verändert, was auch die Transformation zunehmend verkompliziert hat. Wenn ich jetzt neu versuche, die Daten zu interpretieren, kommt etwas heraus, was dann morgen wieder nicht passt.

                            Grüße,
                            Thomas

                            1. okay, danke trotzdem für deine super Unterstützung!

                              (die Struktur wurde nicht verändert, hatte im Text-XML nur 1 Artikel anstatt mehrere eingebaut - hatte nicht daran gedacht, dass es Probleme machen könnte, da es sich um denselben Knoten handelt).

                              Hast mir bis hierhin sehr geholfen 😀

                              LG Julian

                            2. Hallo,

                              noch eine Frage, wenn der HeaderText vorhanden ist, funktioniert deine Lösung wunderbar. -> Wenn der Knoten HeaderText aber nicht vorhanden ist, wird das XML-Output nicht mehr korrekt dargestellt.

                              Gibt es da noch eine zusätzliche Prüfung, dass die Lösung mit den Duplikaten nur angewendet wird, wenn der Knoten HeaderText vorhanden? Ansonsten soll die XML-Struktur unverändert bleiben?

                              LG Julian