Hallo,
es müssten so in etwa wie im Beispiel aussehen:
<XMLTag>
<#list spreadsheet@SearchMasterDatastore_1.getRows() as row>
${row.get("spaltenname")!}
</#list>
<#list spreadsheet@SearchMasterDatastore_2.getRows() as row>
${row.get("spaltenname")!}
</#list>
</XMLTag>
Die umschließenden XML Tags müssten dann vor und nach den Freemarker-Blöcken gesetzt werden.
Die inneren XML Tags müssten für jeden Datastore innerhalb jedes <#list></#list> Blockes gleich für die entsprechenden Spalten geschrieben werden.
${row.get("spaltenname")!} greift auf die Spalte der durchlaufenden Zeilen zu. Damit sollte sich die XML erfolgreich erstellen lassen.
EIn anderer weg wäre alle SearchDatastore Steps mit einem mit einem SpreadsheedAppend zu einem Spreadsheet zusammenzufügen und im TextHTMLWriter nur auf das eine Spreadsheet zuzugreifen.
Viele Grüße,
Rocco
Verschiedene Loop-Variablen sind nicht nötig da sie nur Innerhalb der Schleife Gültigkeit haben.
Probieren Sie mal diese Vorlage Hierarchische XML oder JSON Datei aus Spreadsheet erzeugen (komplexeres Beispiel). Die hat genau ein solches Beispiel mit Auftragspositionen.
Die Grundstruktur ist ungefähr so:
<?xml version="1.0" encoding="UTF-8"?>
<PurchaseOrders>
<#list spreadsheet@SearchMasterDatastore_1.getRows() as row>
<#if (row.children()?? && row.children()?size > 0) >
<Name>${row.get("shipping_address_given_name")!} ${row.get("shipping_address_family_name")!}</Name>
<Street>${row.get("shipping_address_address1")!}</Street>
<City>${row.get("shipping_address_city")!}</City>
<Zip>${row.get("shipping_address_zip")!}</Zip>
<Country>${row.get("shipping_address_country")!}</Country>
<Items>
<#list row.children() as ch>
<Item PartNumber="${ch['line_items_sku']!}">
<ProductName><![CDATA[${ch['line_items_title']!}]]></ProductName>
<Quantity>${ch['line_items_quantity']!}</Quantity>
<Price>${ch['line_items_price']!}</Price>
<Currency>${row.get("currency")!}</Currency>
</Item>
</#list>
</Items>
</PurchaseOrder>
</#if>
</#list>
</PurchaseOrders>
Wichtig ist:
- nur ein einziger SearchDatastore mit showChildren=false (das ist wichtig: Aus dem SearchDatastore dürfen nur die Auftragskopfdaten rauskommen. Auf die Auftragspositionen kann man trotzdem zugreifen per zweiter Schleife row.children()) Das klingt zwar etwas unlogisch, liegt aber daran, dass man hier Spreadsheet und Freemarker Script kombiniert. Im Spreadsheet (das was man in der Vorschau sieht), darf nur die Kopfzeile rauskommen. Per Skript kommt man dann aber auch an die Children-Zeilen, um diese auszugeben).
- dies unter der Annahme, dass die Datastore als Master-Child Datastores verknüft sind
Ja, diese aggregierten Werte über Children ist schon recht komplex. Es gibt sicher mehrere Wege.
Einer davon wäre innerhalb des Freemarker-Scripts mit Hilfsvariablen zu arbeiten. Hier mal ein Beispiel des invoiceAmount auf Order-Ebene (siehe <#assign>).
Die Idee ist: Man muss hier quasi mehrfach über die children iterieren. Ja das kostet etwas performance, sollte sich aber in Grenzen halten, wenn man nicht tausende Items pro Order hat.
<#list spreadsheet@SearchMasterDatastore_1.getRows() as row>
<#assign invoiceAmount = 0 />
<#if (row.children()?? && row.children()?size > 0) >
<#list row.children() as ch>
<#assign invoiceAmount += ch.get("itemAmount")?number />
</#list>
<InvoiceAmount>${invoiceAmount}</InvoiceAmount>
<#list row.children() as ch>
... und hier jetzt alle xml-tags der Children, wie sie vorher auch schon da waren.
</#list>
</#if>
</#list>