ich versuche aktuell ein Skript zu bauen, dass XML Daten ausließt -> und dann zuordnet mittels eines Wertes in der XML welches Layout Template gezogen werden soll:
In XML steht SpaltenAnzahlTabelle="3" also soll das Indesign Layout mit der 3-Spaltigen Tabelle verwendet werden.
Noch besser wäre natürlich das Tabellen automatisch generiert werden ohne die Zuweisung eines Templates. Also sprich das in der XML geprüft wird wie viele Unterelemente ein Element hat (Bsp. Element>Unterelement1,Unterelement2,Unterelement3) in diesem Fall müsste eine 3-Spaltige Tabelle angelegt werden und diese dann mit den Daten der XML gefüllt werden.
Ich hab zwar bereits ein Tutorial gefunden das die Ansätze für solch ein Skript mitbringt, jedoch wird die Spaltenbreite händisch gesetzt statt das die restliche Spaltenbreite automatisch mit der übrigen Platz verwendet wird.
Kommt denn deine XML-Tabelle schon als InDesign-Tabelle im Dokument an und es scheitert an der Zuweisung der Spaltenbreite? Oder funktioniert die Transformation der XML-Struktur nicht richtig?
Hilfreich wäre ein Bespieldokument mit dem man nachvollziehen kann, wo du jetzt stehst und wo du genau hinwillst.
Es geht darum das die Tabellen immer die Volle Breite des Dokumentes einnehmen wie im Bild zu sehen.
Dazu soll wenn möglich Anhand eines Wertes in der XML oder per JS abgefragt werden
ob das Item der XML "ITEM_PRICE" 3 oder 4 mal innerhalb von "PRODUCT_GROUP" exisitiert und anhand dessen dann das template A mit 4 oder Tempalte B mit 3 Spalten zuweist.
Ich hoffe das es nun verständlicher ist.
Anbei mein bisheriger Code. Ich habe bisher Probleme dabei die Tabelle zu generieren. Die Daten kommen rein aus der XML und sollen mittels der XSL Formatiert werden.
ich hab dir ein Beispiel einer Transformation angehängt. Sehe ich das richtig, dass in den XML-Daten noch 1 bzw. 2 PRODUCT_GROUP-Elemente gefehlt haben? Diese sind in den XML-Dateien im Anhang ergänzt.
Die Unterscheidung ob 3 oder 4 Preis-Spalten erfolgt über die Anzahl der PRODUCT_GROUP-Elemente:
Um die korrekte Reihenfolge in der InDesign-Tabelle zu bekommen, werden die ITEM_PRICE-Elemente anhand der Anzahl ihrer vorangehenden Geschwister sortiert:
Mit dem Attribut aid:ccolwidth kannst du die Breite (in Punkt) an die Zelle (z.B. im Tabellenkopf) mitgeben. Ich würde das aber mit JavaScript dann im InDesign-Dokument machen. Damit bist du flexibler, denke ich.
Alle XML-Elemente mit Tabellen ermitteln:
Dann in diesen die Tabelle:
Und anhand der Breite des Textrahmens, in dem sie sich die Tabelle befindet, die Spaltenpreite berechnen.
Wow vielen Dank, das hilft mir wirklich schon viel weiter.
Nur verstehe ich nicht genau, wie ich die Code Snippets in meine JSX einbette. Mein JS-Verständnis hält sich bisher noch in Grenzen. Meine bisherigen Versuche, habe nur Fehler verursacht.
Ist es auch möglich, mehrere PRODUCT_GROUPS zu haben und anhand der ANZAHL der PRODUCT_GROUP die Tabelle mit 3 oder 4 Spalten zu ziehen?
Habe noch nicht ganz verstanden wie das Funktioniert.
Prinzipiell ja, kommt darauf an, wie die Inhalte dann im InDesign-Dokument landen sollen, momentan wird dafür eine eigene Tabelle erstellt.
Das kommt jetzt darauf an, wie dein InDesign-Dokument genau aufgebaut ist.
Dann würde ich das aber eher auch im Zuge der Transformation der XML-Daten erledigen. Vorher in InDesign die Spaltenbreiten der Tabellenspalten für 3 bzw. 4 Preisspalten ermitteln (in Punkt) und dann mit dem Attribut aid:ccolwidth übergeben.
Ich habe die XML und die XSL etwas angepasst. Leider spuckt es mir jetzt nicht mehr die Tabelle aus.
Mein neues Ziel ist es, statt mehrere PRODUCT_GROUPS, nur ein PRODUCT_GROUPS Element mit vielen untergeordneten PRODUCT_GROUP Elementen zu haben.
Die Tabelle soll dann anhand des Wertes der bei PRODUCT_GROUP hinterlegt ist (template="3") das jeweilige Tabellen-Template mit 3-, 4- oder 5-Spalten zuordnen. Zu dem könnte es gut sein das die Reihenfolge der PRODUCT GROUPS variiert, d.h. mal kommen 2x 3-Spaltige dann 5x 4-Spaltige, dann 1x 5-Spaltig, dann wieder 4x 3-Spaltige.
Ich habe bereits die XML angepasst und auch versucht 3 verschiedene Templates für die jeweiligen Spalten Anzahl anzulegen ( Tabelle-3,Tabelle-4,Tabelle-5), scheitere jedoch daran die Abfrage korrekt an die IF-Condition die dann das Template zuordnet zu übergeben.
Wenn ich bei "num-of-price-columns" folgende Codes Eintrage erhalte ich immer einen Fehler. Ich vermute das ich einen Fehler bei der String to Number Konvertierung habe, komme aber nach ewigem Recherchieren auf kein Ergebnis, was mich langsam frustiert.
Ursprünglich war es das hier: Das sah dann so aus -> https://ibb.co/q18BkB4
Ich möchte lediglich abfragen ob der "template" Wert beispielsweise 3, 4 oder 5 hat wie oben beschrieben, und dieser Wert soll dann an die IF-Condition übergeben werden.
Habe ich vllt einen logischen Fehler in meiner XSL? Ich komme einfach nicht drauf.
Vielen Dank nochmal für die Hilfe, bin begeistert von diesem Forum wie schnell man hier Hilfe bzw. Lösungen erhält.
Wenn du die Elemente zählen willst, verwende count() nicht number().
Mach dir nochmal Gedanken, wie du deine XML-Daten aufbaust. Offenbar hast du darauf Einfluss? Momentan wirkt das auf mich eher erratisch. Und wie du die 3-, 4- oder 5-spaltigen Tabellen dann in Indesign zusammenfügen möchtest.
Aber prinzipiell kannst du schon mit einem Prädikat im xPath-Ausdruck, wie beispielsweise PRODUCT_GROUP[@template='3'], die unterschiedlichen PRODUCT_GROUP-Elemente mit ihren Kindelementen zusammenfassen und dann über getrennte Templates in der Transformation verarbeiten.
also ich bin mittlerweile recht weit gekommen, habe verstanden wie ich die Breite der jeweiligen spalten auf die Gesamtbreite berechne.
Auch das er sich das jeweilige template zieht.
Das einzige das jetzt noch nicht klappt ist sozusagen die Schleife. Sobald ich Beispielsweise eine zusätzliche Produktgruppe anlege mit 3-Spalten kommt immer ein Fehler das das table element nicht gültig ist oder in der falsche Reihenfolge angezeigt wird.
Zur aktuellen XML:
Die Reihenfolge des template Wertes ist jetzt grad -> 3,3,3 -> 4,4,4,4 -> 5,5,5,5,5 -> 3,3,3 = Fehler Bei dieser Reihenfolge geht es problemlos -> 3,3,3 -> 4,4,4,4 -> 5,5,5,5,5 = Funktioniert
Sobald ich eine weitere Tabelle erstellen möchte bzw. Anhänge kommt der Fehler -> https://ibb.co/vZ2QFYg
Wie kann ich den eine schleife programmieren die immer alle weiteren PRODUCT_GROUP Elemente prüft?
Danke nochmal für die bisherige Hilfe.
Anbei die aktuelle XSL:
Die aktuelle XML:
(Dieser Beitrag wurde von msassanelli am 21. Okt 2021, 13:39 geändert)
probiere mal das Stylesheet im Anhang. Es ist eine Möglichkeit, wie man so etwas lösen könnte. Man nimmt immer einen Teil der Elemente am Anfang weg und schickt die restlichen nochmal in das Template.
Ich finde trotzdem, du machst dir das Leben unnötig schwer mit deiner XML-Struktur. Woher kommen denn eigentlich die Daten?
vielen liebe Dank nochmal für die großzügige Hilfe.
Das war schon so gut wie die Lösung meines Problems.
Habe die XSL nochmal angepasst und nun die Spaltenbreite für die jeweiligen Tabellen gesetzt. Funktioniert jetzt tadellos.
Meine vorerst letzte Frage ist nun:
Wie kann ich nun jede Tabelle die erstellt wird (sei es 3,4 oder 5-Spatlig) auf einer neuen Seite platzieren.
Den JS Code Ansatz habe ich ja bereits zum platzieren der XML.
Dieser JS Code spuckt mir die allererste Tabelle aus und platziert Sie in meinem Dokument. Wie oben erwähnt möchte ich jede Tabelle einzeln auslesen und jeweils auf einer Seite platzieren. Also denke ich das nach jedem Durchlauf eine neue Seite generiert bzw. erstellt werden soll.
Bisher sieht das ganze dann so aus wenn ich das folgende Skript ausführe. ---> https://ibb.co/Lh3ZP2r
Mittlerweile habe ich einen Loop Programmiert der die einzelne Tabelle auf einer Seite platziert(Links oder Rechts) jedoch nur wenn ich eine gewisse Anzahl an Seiten vorher händisch gesetzt habe, Bsp. 10 Tabellen, vorher muss ich mind. 10 Seiten anlegen sonst wird der loop nur einmal ausgeführt.
Ich versuche nun mittels XPathExpression in JS die Anzahl der "Tabelle" Elemente auszulesen, dies funktioniert auch wenn ich die Anzahl der Elemente die dem "FIRMA" Element unterliegen. Hierzu spuckt es mir "1" aus wenn ich nach "SERIE" oder "PRODUKTGRUPPEN" suche. Sobald ich jedoch eine Ebene tiefer gehen möchte spuckt es nur noch "0" aus obwohl die Elemente defintiv vorhanden sind (siehe XML Export)
Bin grade wie am verzweifeln, weshalb ich das Elemente in seiner Ebene nicht erreichen kann.
Vielen dank nochmals.
Das hier ist die XML die ich auch InDesign exportiert habe. Vorher habe ich natürlich beim importieren die XSL ausgewählt.
Da sich deine Tabellen in einem Absatz mit eigenem Absatzformat befinden, könntest du in diesem unter Umbruchoptionen -> nächste Seite festlegen, dass diese Absätze jeweils auf einer neuen Seite beginnen und mit einem Textfluss arbeiten. (Eventuell auch mit automatischem Textfluss und einem primären Textrahmen.)
Du erwischt hier das SERIE-Element und mit deinem xPath-Ausdruck adressierst du dann nur Tabellen als direkte Kinder des SERIE-Elements. Mit item(1) sollte es klappen.
Oder ein relativer xPath-Ausdruck vom root-Element aus
unabhängig von der Hierarchiestufe (nicht so effizient)
bin nun wieder dazu gekommen an diesem Projekt weiter zu arbeiten.
Soweit funktioniert die Erstellung der Tabellen im Loop und generiert wird auch pro Tabelle eine neue Seite.
Vielen dank für die Hilfe das ich an diesen Punkt gekommen.
Jetzt gerade stecke ich wieder an einer blöden Stelle fest und verstehe nicht wie ich weiter komme.
Ich möchte den Skalierungs Wert aus meiner XML lesen. Ich weiß das ich bereits bei var skalierungsFaktor, das richtige Element anspreche, bekomme jedoch nicht den eigentlich Wert ausgespuckt. Wichtig für mich wäre zu wissen wie erhalte ich das Attribut und wie den Wert des Elements?
Vielen Dank schonmal für die Hilfe. Zum nächsten 1. des Monats muss auf jeden Fall die Premium Mitgliedschaft her. Dieses Forum ist zu gut. Danke nochmal.
danke wiedermal. Das gleiche hatte ich gestern auch probiert gehabt aber hatte nicht funktioniert warum auch immer. Jedenfalls, funktioniert
soweit, jedoch mit erhalte ich nur das Objekt. nicht den eigentlichen Wert. Habe es auch mit probiert führte aber zu keinem Ergebnis. Was mache ich hier wieder falsch?