yannosch
Goto Top

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:

csv__

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="'&#x0a;'"/> 
			<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) &gt; 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) &gt; 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) &gt; 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) &gt; 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) &gt; 0"> 
					<xsl:value-of select="erpii:stripDelimiter($buyerAddress/AdditionalField2)"/> 
				</xsl:when>
				<!-- Kontakt-Telefon -->
				<xsl:when test="string-length($buyerContact/Phone) &gt; 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 &gt; 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) &gt; 0"> 
						<xsl:value-of select="$buyerAddress/AdditionalField3"/> 
					</xsl:when-->
					<xsl:when test="string-length($head/OrderParties/OrderConfirmationParty/EMail) &gt; 0"> 
						<xsl:value-of select="$head/OrderParties/OrderConfirmationParty/EMail"/> 
					</xsl:when>
					<xsl:when test="string-length($buyerContact/EMail) &gt; 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 &gt; 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="'&#x0d;&#x0a;'"/> 
			 
		</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 face-smile

liebe Grüße
Yannosch

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

133883
133883 05.09.2017 aktualisiert um 17:32:21 Uhr
Goto Top
Definiere eine weitere Variable vor der For-Each Schleife inkl. Zeilenumbruch im String:
<xsl:variable name="myheader" select="'Überschrift1;Überschrift2;ÜberschriftN&#xd;&#xa;'"/>   
und ebenfalls vor der Schleife setzt du den Header:
<xsl:value-of select="$myheader"/>   
Alternativ kannst du den Text auch direkt ohne Verweis auf eine extra Variable in das Template schreiben.

Gruß