juls_pro_37: XSLT 1.0 Duplikate entfernen und mit Ergebnis weiter arbeiten

Beitrag lesen

Hallo,

stehe wieder vor einer Herausforderung:

Es gehört die Vervielfachung von "Headertext.Text" entfernt und das Ergebnis soll anschließend den bestehenden Knoten "Invoice-Header.Remarks" überschreiben.

Anschließend soll auch noch der gesamte Knoten "Headertext" entfernt werden.

XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Document-Invoice>
  <Invoice-Header>
    <InvoiceNumber>test</InvoiceNumber>
    <Remarks>1</Remarks>
</Invoice-Header> 
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext>
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext>
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext>
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext>
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext>
  <Headertext>
    <Text>
Skonto 1,5% - termin płatności 21 dni</Text>
  </Headertext>
  <Headertext>
    <Text>e-faktura: efaktury@onninen.pl</Text>
  </Headertext>
  <Headertext>
    <Text>test4</Text>
  </Headertext> 
  <Invoice-Parties>
    <Buyer>
      <ILN>123456</ILN>     
    </Buyer>
    <Payer />   
  </Invoice-Parties>
</Document-Invoice>

XSLT:




<xsl:stylesheet version="1.0" 
xmlns:xsl=http://www.w3.org/1999/XSL/Transform 
xmlns:exsl=http://exslt.org/common extension-element-prefixes="exsl">

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:strip-space elements="*" />
  
    <xsl:key name="header_text" match="Headertext" use="Text"/>
<xsl:template match="Headertext[generate-id() != generate-id(key('header_text', Text)[1])]" />
  

  <!-- 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="Invoice-Header/Remarks">    
    <Remarks>
		<xsl:for-each select="//Headertext[generate-id() != generate-id(key('header_text', Text)[1])]">
            <xsl:value-of select="."/>
                <xsl:if test="position() != last()">
                <xsl:text> </xsl:text>
				</xsl:if>
        </xsl:for-each>
                </Remarks>
  </xsl:template> 

<!-- delete empty nodes -->
<xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
</xsl:template>


<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>

</xsl:stylesheet>

Korrekt:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Document-Invoice>
  <Invoice-Header>
    <InvoiceNumber>test</InvoiceNumber>
    <Remarks>Skonto 1,5% - termin płatności 21 dni e-faktura: efaktury@onninen.pl test4</Remarks>  
</Invoice-Header> 
  <Invoice-Parties>
    <Buyer>
      <ILN>123456</ILN>     
    </Buyer>
    <Payer />   
  </Invoice-Parties>   
</Document-Invoice>

LG Julian

akzeptierte Antworten