Verschachtelte XML ausgeben als Spreadsheet

Hallo Liebes Forum,

ich lade mir per FTPDownlaod eine XML Datei herunter, die ca. diesen Aufbau hat:

<PRODUKTE>
	<ARTIKEL>
		<NAME>xxx</NAME>
		...
		<ATTRIBUT>
			<NAME>XX</NAME>
			<ATTRIBUT>xxx</ATTRIBUT>
		</ATTRIBUT>
		<ATTRIBUT>
			<NAME>XX</NAME>
			<ATTRIBUT>xxx</ATTRIBUT>
		</ATTRIBUT>
		<ATTRIBUT>
			<NAME>XX</NAME>
			<ATTRIBUT>xxx</ATTRIBUT>
		</ATTRIBUT>
	
	</ARTIKEL>
	<ARTIKEL>
    ...
  </ARTIKEL>
</PRODUKTE>

Über folgendes transformationTempalte lasse ich mir das Spreadsheet generieren:

<#assign row = target.addRow()>
<#list xml["PRODUKTE"]["ARTIKEL"] as article>
  <#assign row = target.addRow()>
  ${addColumns(row, article)}
</#list>

Bis jetzt funktioniert alles gut, mit einer Ausnahme. Und zwar wird mir im Spreadsheet in der Spalte „ARTIKEL_ATTRIBUT“ nur der Inhalt des letzten Attributs angezeigt mit den XML Tags außen rum.

Ich habe bereits recherchiert und hier einen Beitrag gefunden, dessen Lösung alle Kindelement des als eigene Spalte anlegt. Dadurch sieht mein Template dann so aus:

<#assign row = target.addRow()>
<#list xml["PRODUKTE"]["ARTIKEL"] as article>
  <#assign row = target.addRow()>	

  <#list article["ATTRIBUT"] as t>
          ${row.addCol("ATT_NAME_" + t?index, t["NAME"])}
          ${row.addCol("ATT_WERT_" + t?index, t["ATTRIBUT"])}
  </#list>

${addColumns(row, article, '', {'columns':['ATTRIBUT'], 'mode':'exclude'})}

</#list>

Dadurch legt er mir dann je Attribute 2 Spalten an mit einer Indexierung.

Allerdings würde ich gerne nur eine Spalte „Attribute“ haben, die den Inhalt ungefähr so ausgibt:

{attribut_name, attribut_attribut},{attribut_name, attribut_attribut}...

Die Ausgabe muss nicht genauso sein, wichtig ist mir nur, dass alle Attribute in einer Spalte stehen und man die zusammengehörigen Werte erkennt.

Gibt es hier eine Funktion a la „updateCol“ oder eine erstmal leere Spalte zu erstellen und dann Werte hinzuzufügen? Oder auch gerne eine andere Alternative.

Beste Grüße,
Franziska

Hallo Franziska,

versuch’s mal mit dem folgenden Code.

<#assign row = target.addRow()>
<#list xml["PRODUKTE"]["ARTIKEL"] as article>
<#assign row = target.addRow()>	

<#assign attribute_list = []>
<#list article["ATTRIBUT"] as t>
  <#assign attribute_list = attribute_list + [t["NAME"]?string + ":" + t["ATTRIBUT"]?string]>
</#list>

${addColumns(row, article, '', {'columns':['ATTRIBUT'], 'mode':'exclude'})}
${row.addCol("Attribute", attribute_list?join(";"))}
</#list>

Der Ansatz ist schon richtig. Nur statt in der Schleife immer wieder addCol aufzurufen, wird nur eine Liste der Attribut-Werte-Paare erstellen. Danach dann einmal addCol aufrufen, um die Liste in eine Spalte zu schreiben.

Gruß
Gustav

2 Likes

Hallo @gustavfriedeheim ,

das hat super funktioniert :smiley: vielen Dank!