XSLT 1.0 Duplikate entfernen und mit Ergebnis weiter arbeiten
juls_pro_37
- xml
- xsl
0 ThomasM0 ThomasM0 juls_pro_370 ThomasM
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
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
Natürlich ist <Remarks>…</Remarks>
gemeint.
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
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
thx, super super super!!! :)
musste nur noch folg. ergänzen:
<!--delete Headertext node--> <xsl:template match="Headertext" /