Anzeige
Tutorialbeschreibung

1. Teil: XML & InDesign Scripting is the key

1. Teil: XML & InDesign Scripting is the key

Dieses Tutorial soll euch zeigen, wie man mithilfe von JavaScript (InDesignskript) und XSL-Transformation XML-Daten in InDesign automatisch verarbeiten kann.

Im ersten Teil werde ich euch schrittweise erklären, wie man mit einem InDesignskript für jedes XML-Element ein Textfeld erstellt und es mit dem entsprechenden Inhalt befüllt.


Mithilfe des Skriptes und der XSL-Transformation ist es möglich, den Inhalt vollkommen automatisch entsprechend eures Layouts zu platzieren und zu formatieren.


Beispiel

Folgende Aufgabenstellung nehme ich als Beispiel heran:

Uns liegen XML-Daten aus einem Warenwirtschaftssystem vor, aus denen wir einen druckfähigen Katalog erstellen sollen. Thema: Bekleidung.

Folgende Vorkenntnisse sind für das Tutorial wünschenswert:

• InDesign: Musterseiten, Absatz-, Zeichen-, Tabellen-, Objektformate, XML-Import
• InDesignscript- bzw. JavaScript-Grundkenntnisse
• XML- und XSLT-Grundkenntnisse


Enthaltene Dateien:

Idml (mit CS6 erstellt) mit allen Absatz- und Objektformaten, XML.

Bitte ladet für das Tutorial die Arbeitsdateien herunter. Die Skripte habe ich auch hier komplett gepostet, jedoch fehlt eine Beschreibung sämtlicher Absatz-, Tabellen- und Objektformate.

Unterteilen werde ich das gesamte Tutorial in 3 Teile, die nach und nach folgen:

1. Import einer XML-Datei sowie Platzieren des Inhaltes per Skript

2. Struktur der XML-Datei und XSL-Transformation

3. Automatisch neue Seiten erstellen und Verwendung von evaluateXpathexpression


 

Schritt 1

Ich werde euch gleich zeigen, wie einfach es ist, mit einem InDesignskript XML-Elemente auszulesen und sie entsprechend zu platzieren.

Kurzer Ausblick:
Auf der Adobe-Seite findet man eine englischsprachige Dokumentation über InDesign Scripting: http://www.adobe.com/devnet/indesign/documentation.html.

Am Ende der Dokumentation „Scripting Guide CS6“ findet man ein Kapitel über “XML-Rules“. Hier wird gezeigt, wie man mit dem sogenannten rule Prozessor xml einliest. Wir aber wollen einen anderen Weg gehen.


Folgende XML-Datei liegt uns vor:

*********  erste_daten.xml ***********************************
<?xml version=“1.0“ encoding=“UTF-8“?>
<Bekleidung>
	<produkt>
		<h1>T-shirt</h1>
		 <li>Leicht zu tragen</li>
		 <li>Färbt nicht ab</li>
		 <li>Fair Trade</li>
		 <lieferumfang>T-Shirt</lieferumfang>
	</produkt>
</Bekleidung>
***********************************************************************

Später werden wir diese XML-Datei noch erweitern.

Wir öffnen die Datei tutorial_xml.idml und importieren die XML-Datei über Datei>XML importieren. Dabei die XML-Importoptionen anzeigen lassen. Bitte alles deaktivieren.

Bilder



Am rechten Bildrand sollte jetzt die Struktur der importierten XML-Datei zu sehen sein. Falls nicht, über Ansicht>Struktur>einblenden.

Bilder



Gehen wir gleich ans Eingemachte und erstellen ein Skript. Führt zum Erstellen eines neuen Skriptes bitte folgende Punkte durch:

Menü Ansicht>Fenster>Hilfsprogramme>Skripte (falls das Skript-Fenster noch nicht angezeigt wird).

Im Fenster Skripte jetzt rechter Mausklick auf Benutzer und Im Explorer anzeigen auswählen.

Bilder



Im geöffneten Explorer-Fenster jetzt den Ordner "Skript Panel" öffnen und dort eine neue Text-Datei erstellen.

Diese gleich umbenennen in "firststep.jsx".

Ihr solltet die Datei jetzt in InDesign im Skript-Fenster bei Benutzer sehen. Rechter Mausklick auf das Skript und Skript bearbeiten auswählen.

Bei mir wird jetzt das Skript standardmäßig im ExtendSkript Toolkit geöffnet. Funktioniert aber ebenfalls in einem Texteditor.

Zum Verständnis ein paar Spielereien, wie man auf die XML-Datei zugreift. (Achtung: Groß- und Kleinschreibung beachten).

*************** firststep.jsx ***************************************
var myDocument = app.documents.item(0);
main();
function main() {
    alert (myDocument.xmlElements.itemByName("Bekleidung").xmlElements.length);
}
*************************************************************************************


Ergebnis: 1

Vorausgesetzt, ihr habt die "erste_daten.xml" in eure InDesign-Datei xml_tutorial importiert.

Das Skript gibt uns „1“ aus. Unser Element Bekleidung hat also ein Kindelement.

Wir ändern nun das Skript wie folgt:

*************** firststep.jsx ********************************************
var myDocument = app.documents.item(0);
main();
function main() {
    alert (myDocument.xmlElements.itemByName("produkt").xmlElements.length);
}
*************************************************************************************

Wir erhalten eine Fehlermeldung.

 
Es befindet sich auf der Ebene kein Element <produkt>, deshalb müssen wir eine Ebene nach unten gehen.

myDocument.xmlElements.item(0).xmlElements.itemByName("produkt").xmlElements.length);

*************** firststep.jsx **********************************************
var myDocument = app.documents.item(0);
main();
function main() {
    alert (myDocument.xmlElements.item(0).xmlElements.itemByName("produkt").xmlElements.length);
}
**************************************************************************************


Ergebnis: 5

Das Element Produkt hat also 5 Kindelemente.

Ebenfalls gültig wäre folgende Schreibweise:

myDocument.xmlElements[0].xmlElements.itemByName("produkt").xmlElements.length


Wie bekomme ich aber jetzt heraus, wie viele Kindelemente mit dem Tag <li> das Element Produkt hat?

Hierzu müssen wir evaluateXPathExpression nutzen.

*************** firststep.jsx *************************************************
var myDocument = app.documents.item(0);
var root = myDocument.xmlElements[0].xmlElements[0];

var anzahl_li = root.evaluateXPathExpression("li");
main();
function main() {
    alert (anzahl_li.length);
}
**************************************************************************************


 

Ergebnis „3“

evaluateXPathExpression ist für die weitere Aufgabenstellung noch sehr wichtig.

Im nächsten Schritt werden wir mit InDesignskript ein Textfeld erstellen und den Inhalt des Elementes <produkt>  in das Textfeld einfügen.

Wir erstellen eine neue Skript-Datei second_step.jsx:

*************** second_step.jsx *******************************************
var myDocument = app.documents.item(0);
var sitenumber = 1;

var inhalt= myDocument.xmlElements.item(0).xmlElements.item(0);
 
 set_textfeld(inhalt);
  
  function set_textfeld(inhalt){
    var myPage = myDocument.pages.item(sitenumber);
    var myTextFrame = myPage.textFrames.add();
    myTextFrame.sendToBack();
  
    inhalt.placeXML(myTextFrame);
    
    myTextFrame.geometricBounds = myGetBounds();
    return 
   }

function myGetBounds( ){
    myPage = myDocument.pages.item(sitenumber);  
    if(myPage.side == PageSideOptions.rightHand ){
          var myX1 = 227; var myX2 = 350;
    } else {
        var myX1 = 70; var myX2 = 193; 
            }    
        
    var myY1 = 40;
    var myY2 = myY1+80;
    return [myY1, myX1, myY2, myX2];
}
*************************************************************************************


 

Achtung:

Bevor ihr das Skript startet, müsst ihr drei Dinge beachten:

• Das InDesign-Dokument xml_tutorial besteht aus zwei Seiten. (Titel + linke Seite).
• Auf der zweiten Seite (links) befinden sich noch keine Felder; ausgenommen die auf der Musterseite angelegten.
• Die XML-Datei erste_Daten.xml ist importiert.

Das Skript erstellt ein Textfeld und platziert die XML-Daten, ohne die Absätze zu formatieren.

Jetzt zu den einzelnen Schritten.

Wir übergeben die Daten des gesamten XML-Elementes <produkt> an die Variable var inhalt.

var inhalt= myDocument.xmlElements.item(0).xmlElements.item(0);

Wir starten die Funktion set_textfeld().

Die Seite, auf der ich mein Textfeld platziere, soll die zweite Seite sein (0= erste Seite, 1= zweite Seite ...).

var myPage = myDocument.pages.item(sitenumber);

Wir erstellen auf Seite 2 ein Textfeld und ordnen es ganz nach hinten.

var myTextFrame = myPage.textFrames.add();

Wir platzieren die Daten der Variable Inhalt in das Textfeld.

inhalt.placeXML(myTextFrame);

Als Nächstes starten wir die Funktion myGetBounds(). Diese weist den vier Linien des Textfeldes entsprechende Koordinaten zu, nachdem überprüft wurde, ob es sich um eine linke oder rechte Seite handelt.

geometricBounds [Linie oben; Linie links; Linie unten; Linie rechts]

Tja, das ist eigentlich schon der Knackpunkt. Textfeld erstellen und XML-Daten einfügen.

 
Wir können jetzt die Anzahl der XML-Elemente auslesen und die Daten platzieren. Mit einer Schleife lassen sich so ganz einfach alle XML-Elemente auslesen und platzieren.

Hierzu aber im zweiten und dritten Teil mehr sowie zur automatischen Formatierung von Absätzen und Tabellen. Zudem gibt es zwei verschiedene Möglichkeiten, die Textfeldgröße an den Inhalt anzupassen.


Hilfreiche Links

http://de.selfhtml.org/xml/darstellung/xsltelemente.htm
http://www.w3schools.com/xsl/
http://jongware.mit.edu/idcs6js/



DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Indesbeginner
  • 29.07.2017 - 20:10

Das ist ein sehr guter Einstieg Danke :-)

Portrait von Philip GiRo
  • 08.11.2015 - 18:33

Tolles Tutorial !!
Genau das habe ich gesucht...

Nur habe ich gleich Fragen... :-)

Warum kann ich den Inhalt einer XML immer nur an eine Textrahmen-Objekt mittels placeXMLübergeben.
Etwas wie inhalt2.placeXML(mySecondTextFrame); funktioniert nicht, oder besser gesagt, es wird immer die letzte Zeile verwendet, wenn danach also inhalt.placeXML(myTextFrame); folgt landet der Inhalt in myTextFrame.
Selbst wenn ich andere Elemente aus der XML auswähle.

Grüße Philip

Portrait von moschi
  • 30.08.2014 - 18:18

Klasse!!!!! Vielen Dank!!!!!

Portrait von Wuggy
  • 26.08.2014 - 22:06

Danke für einen gut erklärten Einstieg in das Scripting in InDesign. Damit wollte ich mich schon lange mal beschäftigen, warte also auf die folgenden Teile in dieser Reihe. Danke.

Portrait von Steve007
  • 26.08.2014 - 20:51

Vielen Dank für diesen 1. Teil Deiner interessanten Reihe.

Portrait von BOPsWelt
  • 25.08.2014 - 12:39

Danke für das Tutorial.

Portrait von Caesarion2004
  • 25.08.2014 - 12:31

Vielen Dank für das informative Tutorial samt Datei.

Portrait von Domingo
  • 25.08.2014 - 12:16

Vielen Dank für umfangreiche Tutorial.

x
×
×