Transformation XML zu CSV mittels XSL
Hallo zusammen,
vielleicht findet sich hier jemand der sich gut mit XSL-Transformationen auskennt.
Ich muss aus einer XML eine CSV machen. Eine grundsätzlich vorhandene XSL-Transformation habe ich sogar schon.
Nur sollte über dem Ergebnis welches ich erhalte noch die Spaltenbezeichnung [Am besten von mir selbst wählbar] stehen.
Aktuell sieht die CSV Datei, die rauskommt folgendermaßen aus:
Schön wäre es wenn nun die Spalten Überschriften/Header hätten. Spricht - dass die Informationen erst ab Zeile 2 Anfangen und Ich die "Überschriften" selbst in der Transformation bestimmen kann.
Die XSL-Datei sieht wie folgt aus:
Reicht das als Info?
GGF. kann ich euch noch die XML zur verfügung stellen - diese müsste allerding komplett unkenntlich gemacht werden - was einen größeren Aufwand bedeutet... vielleicht reicht das ja schon.
Wäre wirklich sehr glücklich wenn mir jemand weiterhelfen könnte
liebe Grüße
Yannosch
vielleicht findet sich hier jemand der sich gut mit XSL-Transformationen auskennt.
Ich muss aus einer XML eine CSV machen. Eine grundsätzlich vorhandene XSL-Transformation habe ich sogar schon.
Nur sollte über dem Ergebnis welches ich erhalte noch die Spaltenbezeichnung [Am besten von mir selbst wählbar] stehen.
Aktuell sieht die CSV Datei, die rauskommt folgendermaßen aus:
Schön wäre es wenn nun die Spalten Überschriften/Header hätten. Spricht - dass die Informationen erst ab Zeile 2 Anfangen und Ich die "Überschriften" selbst in der Transformation bestimmen kann.
Die XSL-Datei sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Erzeugt (CSV) aus XML.Dokument 'Dispatchnotification'
Anmerkungen:
- es entsteht eine Zeile je Sendungsposition
- bei Nachnahmesendungen wird beim ersten Paket der Sendung der volle Nachnahmebetrag eingesetzt
- Referenz1 ist die Lieferscheinnummer
- Referenz2 ist die Id der Transporteinheit
-->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2004/07/xpath-functions"
xmlns:xdt="http://www.w3.org/2004/07/xpath-datatypes"
xmlns:erpii="http://www.ebootis.de/erpII/xslt">
<!-- Format: csv; Kodierung: ASCII/ANSI -->
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:decimal-format NaN="0" decimal-separator="," grouping-separator="."/>
<!-- ### globale Variablen ### -->
<!-- Trennzeichen -->
<xsl:variable name="delimiter" select="';'"/>
<!-- ######################### -->
<xsl:template match="/">
<xsl:apply-templates select="//Dispatchnotification/Shipments"/>
</xsl:template>
<xsl:template match="Shipments">
<xsl:variable name="head" select="../DispatchnotificationHeader"/>
<xsl:for-each select="Shipment">
<!-- aufsteigend nach TransporteinheitId -->
<xsl:sort select="Id" order="ascending"/>
<!-- 1) Versandart -->
<xsl:value-of select="substring($head/DispatchTypeInfo/ExternalId, 1, 30)"/>
<xsl:value-of select="$delimiter"/>
<!-- 2) Anzahl Pakete (immer 1: 1 Transporteinheit = 1 Paket) -->
<xsl:value-of select="'1'"/>
<xsl:value-of select="$delimiter"/>
<!-- 3) Gewicht [kg] -->
<xsl:value-of select="format-number(Weight, '0,00')"/>
<xsl:value-of select="$delimiter"/>
<!-- 4) Referenznr. 1 (Belegnummer) -->
<xsl:value-of select="$head/DispatchnotificationId"/>
<xsl:value-of select="$delimiter"/>
<!-- 5) Referenznr. 2 (Id der Transporteinheit) -->
<!--xsl:value-of select="Id"/-->
<xsl:value-of select="erpii:stripDelimiter(//Dispatchnotification/ItemList/Item[1]/OrderReference/OrderId)"/>
<xsl:value-of select="$delimiter"/>
<!-- 6) Sendungs-ID (Belegnummer) -->
<xsl:value-of select="$head/DispatchnotificationId"/>
<xsl:value-of select="$delimiter"/>
<xsl:variable name="LF" select="'
'"/>
<xsl:variable name="address" select="$head/OrderParties/DeliveryParty/Address"/>
<xsl:variable name="buyerAddress" select="$head/OrderParties/BuyerParty/Address"/>
<xsl:variable name="buyerContact" select="$head/OrderParties/BuyerParty/Contact"/>
<xsl:variable name="altName" select="erpii:stripDelimiter($address/AlternateName)"/>
<xsl:variable name="isUseAltName" as="xs:boolean" select="string-length($altName) > 0"/>
<!-- 7) Firma (Pflicht) -->
<!-- Industrial: ggf. Zeile 1 aus alt. Name -->
<xsl:choose>
<xsl:when test="$isUseAltName">
<xsl:choose>
<xsl:when test="contains($altName, $LF)"><xsl:value-of select="substring-before($altName, $LF)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="erpii:stripDelimiter($altName)" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:value-of select="erpii:stripDelimiter($address/Name)"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 8) Name -->
<!-- Industrial: ggf. Zeile 2 aus alt. Name -->
<xsl:choose>
<xsl:when test="$isUseAltName">
<xsl:variable name="temp" select="substring-after($altName, $LF)"/>
<xsl:choose>
<xsl:when test="contains($temp, $LF)"><xsl:value-of select="substring-before($temp, $LF)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$temp"/></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:value-of select="erpii:stripDelimiter($address/Name2)"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 9) Zu Händen -->
<!-- Industrial: -->
<xsl:choose>
<!-- aus Zusatzfeld1 oder Kontakt-Name -->
<xsl:when test="string-length($buyerAddress/AdditionalField1) > 0">
<xsl:value-of select="erpii:stripDelimiter($buyerAddress/AdditionalField1)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(erpii:stripDelimiter($buyerContact/ContactFirstName), ' ', erpii:stripDelimiter($buyerContact/ContactName))"/>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- Industrial: Spalte 10/11 vertauscht (btw: Street2 ist faktisch immer leer) -->
<!-- 10) Adresse1 (Pflicht) -->
<!-- Industrial: ggf. aus Namenszusatz -->
<xsl:choose>
<xsl:when test="string-length($address/NameExtension) > 0"><xsl:value-of select="translate(erpii:stripDelimiter($address/NameExtension), $LF, ' ')"/></xsl:when>
<xsl:otherwise><xsl:value-of select="erpii:stripDelimiter($address/Street2)"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 11) Adresse2 -->
<xsl:value-of select="erpii:stripDelimiter($address/Street)"/>
<xsl:value-of select="$delimiter"/>
<!-- 12) Land (Pflicht) -->
<xsl:choose>
<xsl:when test="string-length($head/DispatchTypeInfo/ReferenceCountry) > 0">
<xsl:value-of select="$head/DispatchTypeInfo/ReferenceCountry"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$address/Country"/>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 13) Region (abhängig vom Land Pflicht) -->
<xsl:value-of select="erpii:stripDelimiter($address/Area)"/>
<xsl:value-of select="$delimiter"/>
<!-- 14) PLZ (Pflicht) -->
<xsl:value-of select="erpii:stripDelimiter($address/Zip)"/>
<xsl:value-of select="$delimiter"/>
<!-- 15) Ort (Pflicht) -->
<xsl:value-of select="erpii:stripDelimiter($address/City)"/>
<xsl:value-of select="$delimiter"/>
<!-- 16) Telefon -->
<xsl:choose>
<!-- Zusatzfeld1 -->
<xsl:when test="string-length($buyerAddress/AdditionalField2) > 0">
<xsl:value-of select="erpii:stripDelimiter($buyerAddress/AdditionalField2)"/>
</xsl:when>
<!-- Kontakt-Telefon -->
<xsl:when test="string-length($buyerContact/Phone) > 0">
<xsl:value-of select="erpii:stripDelimiter($buyerContact/Phone)"/>
</xsl:when>
<!-- Nr. des Absenders bei Vers.Wert über 520 oder Versand per Express-Nachnahme -->
<xsl:when test="InsuredValue > 520 or substring($head/DispatchTypeInfo/ExternalId, 1, 4)='NP,E'">
<xsl:text>+496122726600</xsl:text>
</xsl:when>
<!--xsl:when test="$address/Phone[@Type='office']">
<xsl:value-of select="$address/Phone[@Type='office']"/>
</xsl:when>
<xsl:when test="$address/Phone[@Type='mobile']">
<xsl:value-of select="$address/Phone[@Type='mobile']"/>
</xsl:when-->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 17) Referenznummer Adresse -->
<xsl:value-of select="$delimiter"/>
<!-- *** ab hier rein optionaler Bereich -->
<!-- 18-20) Nachnahme -->
<xsl:choose>
<!-- wird nur versorgt, wenn das Produktkennzeichen Nachnahme (NN) erkannt wird -->
<xsl:when test="contains($head/DispatchTypeInfo/ExternalId, 'NN')">
<!-- 18) Nachnahmebetrag -->
<xsl:choose>
<!-- für das erste Paket wird der volle Nachnahmebetrag gesetzt, für alle nachfolgenden Betrag 0! -->
<xsl:when test="position() = 1">
<xsl:value-of select="format-number($head/TxGrossValue, '0,00')"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="'0,00'"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$delimiter"/>
<!-- 19) Nachnahmewährung -->
<xsl:value-of select="$head/PriceCurrency"/>
<xsl:value-of select="$delimiter"/>
<!-- 20) Inkasso-Art, fix -->
<xsl:value-of select="'Bar'"/>
<xsl:value-of select="$delimiter"/>
</xsl:when>
<xsl:otherwise>
<!-- keine Nachnahme -->
<xsl:value-of select="concat($delimiter, $delimiter, $delimiter)"/>
</xsl:otherwise>
</xsl:choose>
<!-- 21) Verwendungszweck -->
<!-- Industrial: Positionsnummer -->
<xsl:value-of select="erpii:stripDelimiter(Id)"/>
<xsl:value-of select="$delimiter"/>
<!-- 22-24) Proaktive Benachrichtigung -->
<xsl:variable name="email">
<xsl:choose>
<!--xsl:when test="string-length($buyerAddress/AdditionalField3) > 0">
<xsl:value-of select="$buyerAddress/AdditionalField3"/>
</xsl:when-->
<xsl:when test="string-length($head/OrderParties/OrderConfirmationParty/EMail) > 0">
<xsl:value-of select="$head/OrderParties/OrderConfirmationParty/EMail"/>
</xsl:when>
<xsl:when test="string-length($buyerContact/EMail) > 0">
<xsl:value-of select="$buyerContact/EMail"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$head/OrderParties/BuyerParty/Address/EMail"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<!-- per Email? -->
<xsl:when test="$email">
<!-- Benachrichtigungstyp: E=Email, S=SMS, T=Telefon -->
<xsl:text>E</xsl:text>
<xsl:value-of select="$delimiter"/>
<!-- Kontaktdaten1 -->
<xsl:value-of select="erpii:stripDelimiter($email)"/>
<xsl:value-of select="$delimiter"/>
<!-- Benachrichtigungsereignis:
1 = Einrollung, 2 = Nicht-Zustellung, 3 = Einrollung, Nicht-Zustellung,
4 = Zustellung, 5 = Einrollung, Zustellung, 6 = Nicht-Zustellung, Zustellung,
7 = bei allen o.g. Ereignissen -->
<xsl:text>1</xsl:text>
<xsl:value-of select="$delimiter"/>
</xsl:when>
<!-- keine Benachrichtigung -->
<xsl:otherwise>
<xsl:value-of select="concat($delimiter, $delimiter, $delimiter)"/>
</xsl:otherwise>
</xsl:choose>
<!-- 25-26) blank -->
<xsl:value-of select="concat($delimiter, $delimiter)"/>
<!-- 27) Zusatzfeld 4 -->
<xsl:value-of select="erpii:stripDelimiter($buyerAddress/AdditionalField4)"/>
<xsl:value-of select="$delimiter"/>
<!-- 28) Zusatzfeld 3 (Gebäude/Raum/Abteilung) -->
<xsl:value-of select="erpii:stripDelimiter($buyerAddress/AdditionalField3)"/>
<xsl:value-of select="$delimiter"/>
<!-- 29) blank -->
<xsl:value-of select="$delimiter"/>
<!-- 30-32) nur bei Höherversicherung -->
<!--
<xsl:choose>
<xsl:when test="InsuredValue > 520">
<xsl:value-of select="InsuredValue"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="$head/PriceCurrency"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="'Steinmetzwerkzeug und Zubehör'"/>
<xsl:value-of select="$delimiter"/>
</xsl:when>
<xsl:otherwise>
-->
<!-- keine Höherversicherung -->
<xsl:value-of select="concat($delimiter, $delimiter, $delimiter)"/>
<!--
</xsl:otherwise>
</xsl:choose>
-->
<!-- 33-45) Spalten werden nicht bestückt -->
<xsl:value-of select="concat(
$delimiter, $delimiter, $delimiter, $delimiter, $delimiter, $delimiter, $delimiter, $delimiter, $delimiter, $delimiter,
$delimiter, $delimiter)"/>
<!-- 46) Exportabwicklung: Währung -->
<xsl:value-of select="$head/PriceCurrency"/>
<!-- CRLF -->
<xsl:value-of select="'
'"/>
</xsl:for-each>
</xsl:template>
<!--
Entfernt Trennzeichen aus den Nutzdaten
-->
<xsl:function name="erpii:stripDelimiter">
<xsl:param name="p_str"/>
<xsl:value-of select="replace($p_str, $delimiter, '')"/>
</xsl:function>
</xsl:stylesheet>
Reicht das als Info?
GGF. kann ich euch noch die XML zur verfügung stellen - diese müsste allerding komplett unkenntlich gemacht werden - was einen größeren Aufwand bedeutet... vielleicht reicht das ja schon.
Wäre wirklich sehr glücklich wenn mir jemand weiterhelfen könnte
liebe Grüße
Yannosch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 348247
Url: https://administrator.de/forum/transformation-xml-zu-csv-mittels-xsl-348247.html
Ausgedruckt am: 23.12.2024 um 18:12 Uhr
1 Kommentar
Definiere eine weitere Variable vor der For-Each Schleife inkl. Zeilenumbruch im String:
und ebenfalls vor der Schleife setzt du den Header:
Alternativ kannst du den Text auch direkt ohne Verweis auf eine extra Variable in das Template schreiben.
Gruß
<xsl:variable name="myheader" select="'Überschrift1;Überschrift2;ÜberschriftN
'"/>
<xsl:value-of select="$myheader"/>
Gruß