[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:
(2900 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: 5816

4. Sep 2013, 20:37
Beitrag # 2 von 9
Beitrag ID: #516955
Bewertung:
(2863 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:
(2814 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: 5816

5. Sep 2013, 09:10
Beitrag # 4 von 9
Beitrag ID: #516957
Bewertung:
(2807 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: 120

5. Sep 2013, 09:43
Beitrag # 5 von 9
Beitrag ID: #516959
Bewertung:
(2791 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.
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com


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:
(2720 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:
(2707 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:
(2636 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:
(2614 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

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
29.09.2022

IDUGS#85 Press2id

Zoom Meeting
Donnerstag, 29. Sept. 2022, 19.00 - 21.00 Uhr

Vortrag

Kennst du WordPress? Vielleicht. Verwendest du WordPress? Ja, klar! WordPress ist das am weitesten verbreitete System für die Erstellung von Webseiten. Um Webseitenbau soll es auf dieser IDUG aber nicht gehen. Gregor zeigt press2id (github.com/grefel/press2id). Seine Open-Source-Lösung für die Verbindung von Web und InDesign. Richtig gelesen: InDesign liest mithilfe von press2id die Inhalte der WordPress-Webseiten und generiert daraus Zeitschriften, Kataloge, Programmhefte oder Bierdeckel (das zeigen wir natürlich auch!). So wird die „Content First“ Theorie zu einer konkret anwendbaren Praxis, ohne gleich die ganz großen Räder zu drehen. Versprochen: Jeder kann nach der IDUG innerhalb kürzester Zeit Daten von WordPress nach InDesign importieren. Aber Achtung: Prinzipiell kann press2id aus jeder Website, oder besser Contentmanagementsystem (CMS) Daten auslesen und nach InDesign importieren! Spannend, oder? Danach geht es in die Praxis: Stefan hat die Webseite des Parktheater Iserlohn (parktheater-iserlohn.de) gestaltet. Die gedruckten Spielpläne (parktheater-iserlohn.de/interaktive-spielplaene) werden mit press2id realisiert. Wir schauen in den Maschinenraum und zeigen, wie die Lösung des Projekts realisiert wurde.

Nein

Organisator: InDesign Usergroup Stuttgart

Kontaktinformation: Christoph Steffens, E-Mailidug AT satzkiste DOT de

https://idugs85.eventbrite.de/

Von Wordpress nach InDesign
Veranstaltungen
08.11.2022

Frankfurt, Fraport Conference Center
Dienstag, 08. Nov. 2022, 13.30 - 18.00 Uhr

Seminar

Auf der Enfocus World Tour stellen wir Ihnen gemeinsam mit Enfocus die aktuellen Highlights von Enfocus Switch und dem Impressed Workflow Server (IWS) vor. Wir präsentieren Ihnen anhand typischer Aufgabenstellungen in einem modernen Produktionsbetrieb die Möglichkeiten, die Enfocus Switch für die Automatisierung und Standardisierung von Abläufen bietet. Wir haben sowohl für Produktionsverantwortliche als auch technisch Interessierte ein spannendes Programm vorbereitet, bei dem Sie sicherlich viel Neues erfahren werden, welches Sie in Ihrem eigenen Betrieb umsetzen können. Die Veranstaltung bietet darüber hinaus eine hervorragende Möglichkeit, sich mit anderen Anwendern und Workflow-Spezialisten auszutauschen und Antworten auf konkrete Aufgabenstellungen zu erhalten, welche Sie mit Hilfe von Enfocus Switch/IWS umsetzen möchten.

Wir sind jeweils an 2 Tagen in Frankfurt, Hamburg und München vor Ort. Der erste (halbe) Tag richtet sich in erster Linie an Betriebsleiter und Produktionsverantwortliche in Druckereien - ist also weniger technisch orientiert - sondern gibt einen Überblick zu den heutigen Möglichkeiten einer automatisierten Produktion.

Der zweite Tag (Switch Anwender-Treffen) richtet sich an bestehende Switch-Anwender und Administratoren.

Anmeldung und weitere Infos: https://www.impressed.de/schulung.php?c=sDetail&sid=310

Ja

Organisator: Enfocus/Impressed

Kontaktinformation: Silvia Noack, E-Mailsnoack AT impressed DOT de

https://www.impressed.de/schulung.php?c=sDetail&sid=310

Enfocus World Tour 2022