juls_pro_37: XSLT 1.0 Duplikate entfernen und mit Ergebnis weiter arbeiten

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

  1. Hallo Julian,

    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.

    Um den mehrfachen Text nur 1x auszugeben, reicht der Zugriff auf das erste Vorkommen, dann direkt als Inhalt von Remarks ausgeben.

    Das zweite redundante Identity-Template kann übrigens weg, also ergänze:

    <xsl:template match="Remarks">
      <Remark>
        <xsl:value-of select="normalize-space(//Headertext[1]/Text)"/>
      </Remark>
    </xsl:template>
    

    Grüße,
    Thomas

    1. Natürlich ist <Remarks>…</Remarks> gemeint.

      1. Danke schon mal, aber das Ergebnis ist nicht vollständig:

        <Remarks>Skonto 1,5% - termin płatności 21 dni</Remarks>"

        Korrekt sollte sein:

        <Remarks>Skonto 1,5% - termin płatności 21 dni e-faktura: efaktury@onninen.pl test4</Remarks>

        Das Segment "Headertext.Text" beinhaltet mehrere unterschiedliche Texte.

        Und im Anschluss sollte das Segment "Headertext" komplett entfernt werden.

        LG Julian

        1. Danke schon mal, aber das Ergebnis ist nicht vollständig:

          <Remarks>Skonto 1,5% - termin płatności 21 dni</Remarks>"

          Korrekt sollte sein:

          <Remarks>Skonto 1,5% - termin płatności 21 dni e-faktura: efaktury@onninen.pl test4</Remarks>

          Auch gerade gesehen:

          <xsl:template match="Remarks">
            <Remarks>
              <xsl:value-of select="concat(normalize-space(//Headertext[1]/Text), ' ',
                                    normalize-space(//Headertext[2]/Text), ' ',
                                    normalize-space(//Headertext[3]/Text))"/>
            </Remarks>
          </xsl:template>
          
          

          Headertext kommt wegen dem leereen Template dafür gar nicht mehr vor.

          Grüße,
          Thomas

          1. thx, super super super!!! :)

            musste nur noch folg. ergänzen:

            <!--delete Headertext node--> <xsl:template match="Headertext" /