hilfdirselbst.ch
Facebook Twitter gamper-media
StefanK
Beiträge: 10
4. Sep 2013, 16:08
Beitrag #1 von 9
Bewertung:
(2541 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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)
Top
 
X
Hans Haesler  M  p
Beiträge: 5557
4. Sep 2013, 20:37
Beitrag #2 von 9
Beitrag ID: #516955
Bewertung:
(2504 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
StefanK
Beiträge: 10
5. Sep 2013, 08:55
Beitrag #3 von 9
Beitrag ID: #516956
Bewertung:
(2455 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
Hans Haesler  M  p
Beiträge: 5557
5. Sep 2013, 09:10
Beitrag #4 von 9
Beitrag ID: #516957
Bewertung:
(2448 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
gfellenz
Beiträge: 110
5. Sep 2013, 09:43
Beitrag #5 von 9
Beitrag ID: #516959
Bewertung:
(2432 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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.
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com
als Antwort auf: [#516957] Top
 
mx S
Beiträge: 161
6. Sep 2013, 14:27
Beitrag #6 von 9
Beitrag ID: #517000
Bewertung:
(2361 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
StefanK
Beiträge: 10
6. Sep 2013, 15:00
Beitrag #7 von 9
Beitrag ID: #517002
Bewertung:
(2348 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
StefanK
Beiträge: 10
9. Sep 2013, 10:38
Beitrag #8 von 9
Beitrag ID: #517071
Bewertung:
(2277 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
mx S
Beiträge: 161
9. Sep 2013, 14:39
Beitrag #9 von 9
Beitrag ID: #517079
Bewertung:
(2255 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

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


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] Top
 
X