XML und InDesign – es könnte so einfach sein!

Aus einer langen Pause starte ich mit einem doppeldeutigen Titel, natürlich könnte ich auch mal einfach ein wenig mehr bloggen, aber Adobe hätte mit dem gleich vorgestellten Skript vielen Menschen viel Frust ersparen können. Aber der Reihe nach:

Der erste Versuch XML-Dokumente innerhalb von InDesign zu verwenden scheitert meist kläglich. Das Problem ist das kuriose Whitespace Handling. Die meisten XML-Dokumente enthalten Whitespace zwischen nicht texttragenden Elementen um sie leichter lesbar zu machen (Pretty Print) oder weil ein vorheriger Bearbeitungsschritt diesen erzeugt hat.

<root>
-> Whitespace  <abs>text</abs>
</root>

Jeder der schon einmal den Quelltext einer Website betrachtet hat kennt das Phänomen.

InDesign importiert nun den Whitespace zwischen den Elementen und stellt ihn vollständig dar (ähnlich dem XML-Attribut xml:space=“preserve“ oder dem  <pre>-Tag von HTML). Unbrauchbare Dokumente und frustrierte Anwender sind die Folge.

Mit der Version CS3 dachten auch viele Adobe hätte das Problem in den Griff bekommen, denn beim XML-Import tauchte eine Option zum Whitespace Handling auf.

xmlImportOptions

Leider ist diese Funktion praktisch nutzlos, denn entweder bekommt man einen langen Text ganz ohne Zeilenumbrüche oder eben das ehemalige Verhalten bei dem alle Whitespace Elemente umgesetzt wurden.

Zur Lösung des Problems musste man entweder ein XSLT zum Preprocessing verwenden oder aber XML-Rules selber skripten. Für Anfänger sind beide Technologien etwas komplex, insbesondere wenn man sich klar macht, das einfach nur strukturierte Daten importiert werden sollen. Auch in CS4 hat sich dahingehend leider nichts verändert.

In jeder InDesign-XML-Schulung sprach ich bis heute immer davon, das bei der Funktion Map Tags to Styles… (Befehl Formate zu Tags zuordnen… aus dem Kontextmenu der Strukturansicht) ein Häkchen fehlen würde, welches das entsprechende Element als Absatz (Blocklevel-Element) auszeichnet. Diese Option würde steuern welche Elemente ganze Absätz beinhalten und entsprechend einen Zeilenumbruch hinzufügen.

Vor ein paar Tagen kam mir dann eine noch einfachere Idee: Einfach ein Skript schreiben welches allen Elementen, denen in der Zuordnungstabelle ein Absatzformat zugewiesen ist, beim Importprozess einen Zeilenumbruch mitgibt. Denn die Zuweisung eines Absatzformats kennzeichnet ja eben das Element als Blocklevel-Element.

Das geht dann auch erstaunlich einfach: Das importieren der XML-Daten kann von InDesign übernommen werden. Der Trick ist eine For-Schleife über die ImportMap (Zuordnungstabelle) mit Prüfung ob ein Absatzformat zugewiesen ist. Vorraussetzung ist natürlich, dass die Zuordnung von Absatzformaten zu Tags bereits vor dem Import vorgenommen wurde, ohne je ein Skript editieren zu müssen.

for (i = 0; i < _dokument.xmlImportMaps.length; i++) {
  if (_dokument.xmlImportMaps[i].mappedStyle.constructor.name == "ParagraphStyle" )
  { ... }
}

Jetzt muss nur noch eine XML-Rule für jedes so ermittelte Element programmiert werden:

_xpath = "//" + _dokument.xmlImportMaps[i].markupTag.name;
...
var _proc  = app.xmlRuleProcessors.add([_xpath]);
var _match = _proc.startProcessingRuleSet(_dokument.xmlElements[0]);
while( _match!=undefined ) {
  _node = _match.element;
  _node.insertTextAsContent ("\r", XMLElementPosition.afterElement)
  _match = _proc.findNextMatch();
}

Mit Hilfe dieses Skripts kann jetzt jeder ohne XSLT oder Programmierkenntnisse XML in InDesign verarbeiten. Einfach das Skript herunterladen und  in das Bedienfeld Skripte einfügen. Zum Testen habe ich eine XML-Instanz und ein InDesing Dokument vorbereitet: Download XML Test ZIP.

Viel Spaß!