XML➡Spreadsheet: Daten aus Header in den Zeilen

Hallo zusammen,

ich bekomme mehrere BMEcat-Kataloge von einem Lieferant, jeweils eins pro Depot.
Die Struktur sieht vereinfacht so aus:

Struktur
<HEADER>
    <CATALOG>
      <LANGUAGE>DE</LANGUAGE>
      <CATALOG_ID>MAINCAT</CATALOG_ID>
      <CATALOG_VERSION>1.0</CATALOG_VERSION>
      <CATALOG_NAME>Depot_1</CATALOG_NAME>
    </CATALOG>
    <SUPPLIER_IDREF type="supplier_specific">Depot_1</SUPPLIER_IDREF>
    <PARTIES>
      <PARTY>
        <PARTY_ID>Depot_1</PARTY_ID>
        <PARTY_ROLE>supplier</PARTY_ROLE>
      </PARTY>
      <PARTY>
        <PARTY_ID>Depot_1</PARTY_ID>
        <PARTY_ROLE>document_creator</PARTY_ROLE>
      </PARTY>
    </PARTIES>
    <DOCUMENT_CREATOR_IDREF>Depot_1</DOCUMENT_CREATOR_IDREF>
  </HEADER>
  <T_NEW_CATALOG>
    <PRODUCT>
      <SUPPLIER_PID>123</SUPPLIER_PID>
      (...)
    </PRODUCT>
    <PRODUCT>
      <SUPPLIER_PID>789</SUPPLIER_PID>
      (...)
    </PRODUCT>

Ich brauche für jedes Produkt (Supplier_PID) die Info, aus welchem Depot es stammt. Die Info möchte ich am liebsten von SUPPLIER_IDREF oder PARTY_ID entnehmen. Wenn ich allerdings die normalen Schleifen im XMLReader laufen lasse, klappt das nicht. Ich verstehe warum, aber weiß nicht, wie ich das Problem umgehen kann.
Aktuelles Ergebnis:

Depot SKU Beschreibung Preis
Depot1
123 Milch 3,50
789 Käse 7,80

Zielergebnis:

Depot SKU Beschreibung Preis
Depot1 123 Milch 3,50
Depot1 789 Käse 7,80
Depot2 654 Wurst 10,90

Die Suche im Forum und in den Cookbooks hat mich nicht weiter gebracht, also bin ich für jede Hilfe sehr dankbar. :shamrock:

Hallo @Entegra,

das Problem ist, dass sich das SUPPLIER_IDREF in einem anderen Element befindet als die Produkte. Du kannst dir den Wert aber in eine Variable speichern und dann pro PRODUCT in einer extra Spalte ausgeben. Das parsingTemplate des XMLReader Steps sollte dann in etwa so aussehen:

<#assign row = target.addRow()>

<#assign depot = xml["BMECAT"]["HEADER"]["SUPPLIER_IDREF"][0]! >

<#list xml["BMECAT"]["T_NEW_CATALOG"]["PRODUCT"] as p>
  <#assign row = target.addRow()>
  ${row.addCol("depot", depot)}
  ${addColumns(row, p)}
</#list>

Ergebnis:

VG Torsten

Danke! Genau das war die Lösung, die ich mir erhofft habe. Dein Vorschlag hat super geklappt! :slightly_smiling_face:

1 Like