[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

StefanK
Beiträge gesamt: 10

4. Sep 2013, 16:08
Beitrag # 1 von 9
Bewertung:
(3151 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich suche nach einer Möglichkeit, in einem aus einer XML-Datei generierten fortlaufenden Text, mehrfach vorhandene XML-Elemente bzw. deren Inhalt zu entfernen und ggf. an dieser Stelle ein anderes Absatzformat anwenden.

Ein Beispiel: Ich habe eine Aufzählung von Büchern, die nach Autor sortiert sind. Jetzt möchte ich nur über dem ersten Buchtitel eines Autors dessen Name als Überschrift stehen haben. Zwischen allen weiteren Buchtiteln desselben Autors soll das XML-Element Autor nicht eingefügt bzw. gelöscht werden und stattdessen über ein Absatzformat eine Linie hinzugefügt werden.

Mit dem folgenden Script kann ich die XML-Elemente überprüfen und doppelt oder mehrfach vorhandene finden.
Wie kann ich mit dieser Info nun die Elemente oder deren Inhalt ansprechen und wie oben beschrieben ändern?
Kennt InDesign z. B. die Position (Zeile, Wort etc.) eines XML-Elements?
Oder habe ich den falschen Ansatz und sollte besser im Vorfeld (XSLT?) eine Abfrage definieren?

Code
var myElements = app.activeDocument.xmlElements[0].xmlElements; 

for (n=1; n<myElements.length; n++) {
var myContent1 = myElements[n].xmlElements.itemByName("Autor").contents;
var myContent2 = myElements[n-1].xmlElements.itemByName("Autor").contents;
if (myContent1 == myContent2) {
//Zeile löschen + Format anwenden
}
}

Vielen Dank im Voraus für eure Hilfe.

Gruß
Stefan

(Dieser Beitrag wurde von Hans Haesler am 4. Sep 2013, 20:31 geändert)
X

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

Hans Haesler
  
Beiträge gesamt: 5826

4. Sep 2013, 20:37
Beitrag # 2 von 9
Beitrag ID: #516955
Bewertung:
(3114 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stefan,

der Zählername i eignet sich schlecht, um in diesem Forum Code zu posten. Wenn das i mit eckigen Klammern (= [ ]) umgeben wird, dann verschwinden diese drei Zeichen und der folgende Text erscheint in Italics (= kursiv).

Deshalb habe ich Deinen Code schon mal korrigiert und anstelle des i den Buchstaben n eingesetzt.

Besser wäre aber, wenn Du den Button code benutzen würdest. Dann wäre die Kombination i und [] kein Problem. Zudem würden die Einzüge des Codes erhalten bleiben. Siehe oben.

Frage: Soll das Zählen mit var n=1; beginnen? Mit dem zweiten Element? Das erste wäre var n=0;

Eine nützlichere Antwort auf Deine Anfrage würdest Du eher bekommen, wenn Du entsprechende Beispieldateien zur Verfügung stellen würdest. Dann müssten willige Helfer nicht zuerst versuchen, die Voraussetzungen zu erarbeiten.

Gruss, Hans


als Antwort auf: [#516948]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

StefanK
Beiträge gesamt: 10

5. Sep 2013, 08:55
Beitrag # 3 von 9
Beitrag ID: #516956
Bewertung:
(3065 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

hier ein vereinfachtes XML-Beispiel:

Code
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buch>
<autor>Böll</autor>
<titel>Haus ohne Hüter</titel>
</buch>
<buch>
<autor>Böll</autor>
<titel>Ansichten eine Clowns</titel>
</buch>
<buch>
<autor>Böll</autor>
<titel>Ende einer Dienstfahrt</titel>
</buch>
<buch>
<autor>Heine</autor>
<titel>Deutschland. Ein Wintermärchen</titel>
</buch>
<buch>
<autor>Grass</autor>
<titel>Die Blechtrommel</titel>
</buch>
</root>


In diesem Beispiel, wie ich es eingangs schon versucht habe zu erklären, werden alle Buchtitel mit Autor nacheinander als fortlaufende Anzeigen in ein InDesign-Dokument importiert.
Nun möchte ich aber, dass bei allen Anzeigen, bei denen es von dem Autor mehrere Buchtitel gibt, dieser Autor nur über der ersten Anzeige im Text erscheint.
Bei der zweiten und wie in diesem Beispiel dritten Anzeige des Autors Böll soll statt des Autors eine Linie erscheinen und in etwa so aufgebaut sein:


Böll
Haus ohne Hüter
___________________
Ansichten eines Clowns
___________________
Ende einer Dienstfahrt

Heine
Deutschland. Ein Wintermärchen

Grass
Die Blechtrommel


Zwei Aspekte sind mir also wichtig:
Kann ich die Platzierung von XML-Elementen in Abhängigkeit von anderen XML-Elementen steuern?
Kann ich ein - wie im Code im ersten Thread - gefundenes XML-Element z. B. löschen oder eine andere Formatierung darauf anwenden?

Zuletzt noch eine Antwort auf deine Frage Hans:
Ich beginne bewusst mit n=1, weil das erste Element immer den Autor als Überschrift erhält und n -1 dann keinen negativen Wert ergibt.

Gruß
Stefan


als Antwort auf: [#516955]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

Hans Haesler
  
Beiträge gesamt: 5826

5. Sep 2013, 09:10
Beitrag # 4 von 9
Beitrag ID: #516957
Bewertung:
(3058 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stefan,

okay, das Beginnen mit dem zweiten Element ist einleuchtend.

Im Übrigen habe ich nur wenig Erfahrung mit XML. Deshalb überlasse ich anderen den Vortritt.

Gruss, Hans


als Antwort auf: [#516956]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

gfellenz
Beiträge gesamt: 122

5. Sep 2013, 09:43
Beitrag # 5 von 9
Beitrag ID: #516959
Bewertung:
(3042 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zuammen,

vielleicht ist alles ganz einfach:

Code
myElements[n-1].xmlElements.itemByName("Autor").contents = "\r"; 
myElements[n-1].xmlElements.itemByName("Autor").paragraphs[0].appliedParagraphStyle = "Name des Absatzformats mit Linie";


???
Ansonsten ist in deinem 1. Beispiel Autor groß- im 2. klein geschrieben. Und du musst noch etwas an der Logik feilen, mit dem Code im 1. Beispiel kannst du nur direkt aufeinander folgende Autoren bereinigen, d.h. du kommst um eine Hilfsvariable, die sich den aktuellen Autor merkt, nicht herum.


als Antwort auf: [#516957]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

mx
Beiträge gesamt: 161

6. Sep 2013, 14:27
Beitrag # 6 von 9
Beitrag ID: #517000
Bewertung:
(2971 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stefan,

irgendwie kommt es mir deutlich angenehmer vor, das gleich noch im XML über ein Stylesheet zu lösen, da ist dann gleich sortiert nach Autor und Titel:

Code
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:key name="autoren" match="autor" use="."/>
<xsl:key name="titel" match="titel" use="parent::buch/autor"/>

<xsl:template match="/">
<root>
<xsl:for-each select="//autor[generate-id(.) = generate-id(key('autoren', .)[1])]">
<xsl:sort/>
<xsl:variable name="autor" select="."/>
<autor>
<name>
<xsl:value-of select="$autor" />
</name>
<xsl:for-each select="key('titel', $autor)">
<xsl:sort/>
<titel>
<xsl:value-of select="." />
</titel>
</xsl:for-each>
</autor>
</xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>


Viele Grüße
Jo


als Antwort auf: [#516956]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

StefanK
Beiträge gesamt: 10

6. Sep 2013, 15:00
Beitrag # 7 von 9
Beitrag ID: #517002
Bewertung:
(2958 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe mit der Info von Gregor folgende funktionierende Skriptlösung gefunden:

Code
var myElements = app.activeDocument.xmlElements[0].xmlElements; 

for( n = myElements.length -1; n >= 0; n-- ){
var myContent1 = myElements[n-1].xmlElements.itemByName("autor").contents;
var myContent2 = myElements[n].xmlElements.itemByName("autor").contents;
if (myContent2 == myContent1){
myElements[n].xmlElements.itemByName("autor").contents = "";
myElements[n].xmlElements.itemByName("autor").paragraphs[0].appliedParagraphStyle = "autor_linie";
}
}


Da ich den Content schon per Stylesheet nach Autor und Titel vorsortiert importiere, gehe ich die Autoren von hinten nach vorne durch und vergleiche immer mit dem jeweils vorigen Autor.
Vielleicht nicht die schönste Lösung, aber sie funktioniert.

Ich werde die Variante per Stylesheet von Jo auch noch testen.

Vielen Dank schon einmal an beide.

Gruß
Stefan


als Antwort auf: [#517000]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

StefanK
Beiträge gesamt: 10

9. Sep 2013, 10:38
Beitrag # 8 von 9
Beitrag ID: #517071
Bewertung:
(2887 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

dein Stylesheet funktioniert wunderbar, allerdings nicht direkt beim Import der XML-Datei in InDesign. InDesign CS6 stürzt beim Import ab. Ich vermute dessen XSL-Interpreter kann diese Anweisungen nicht verarbeiten.
Per SAXON/Kernow funktioniert es.

Gibt es eine Möglichkeit die Funktion des Stylesheets beim direkten Import in InDesign zu verwenden bzw. es dafür umzubauen?

Viele Grüße
Stefan


als Antwort auf: [#517000]

Mehrfach vorhandenen XML-Content nicht einfügen oder löschen

mx
Beiträge gesamt: 161

9. Sep 2013, 14:39
Beitrag # 9 von 9
Beitrag ID: #517079
Bewertung:
(2865 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stefan,

InDesign mag die leeren Sort-Elemente nicht, aber sortieren in XSL ist eh keine Stärke von InDesign (Vorsicht bei Umlauten!).
Ein ausgewachsener XSL-Prozessor kann das richtig...

Probier's nochmal damit:
Code
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:key name="autoren" match="autor" use="."/>
<xsl:key name="titel" match="titel" use="parent::buch/autor"/>

<xsl:template match="/">
<root>
<xsl:for-each select="//autor[generate-id(.) = generate-id(key('autoren', .)[1])]">
<xsl:sort select="." lang="de"/>
<xsl:variable name="autor" select="."/>
<autor>
<name>
<xsl:value-of select="$autor" />
</name>
<xsl:for-each select="key('titel', $autor)">
<xsl:sort select="." lang="de"/>
<titel>
<xsl:value-of select="." />
</titel>
</xsl:for-each>
</autor>
</xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>


Viele Grüße
Jo


als Antwort auf: [#517071]
X