Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » XML-Tags vollständig löschen

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

17. Jun 2019, 17:49
Bewertung:

gelesen: 12475

Beitrag als Lesezeichen
Hallo zusammen,

wir müssten InDesign-Dokumente mit xml-Tags versehen und zusätzlich mit Attributen ergänzen. Wir bekommen von einem Lieferanten die besagten IDs zugeschickt die nicht mit den xml-Tags versehen sind. Wenn ich jedoch mittels rechtsklick auf die Rahmen gehe und in "Tag für Rahmen" schaue, sind leider doch noch "Präferenzen" enthalten.

Nun ist es so, dass ich mittels "Tags automatisch erstellen" das Tagging vornehme und die Tags per Script umbenennen möchte. Leider ist der neu zu vergebene Namen (PFBlock) identisch welche noch im Hintergrund gespeichert sind.

folgendes Script (mit Quellhinweis) werde ich:
Code
//XMLTagUmbenennen.jsx 
//https://forums.adobe.com/thread/714182

#target InDesign

var myDoc = app.activeDocument;

RenameXMLTag("Textabschnitt", "PFBlock");


function RenameXMLTag(Old, New)
{
if(myDoc.xmlTags.itemByName(Old).isValid)
{
myDoc.xmlTags.itemByName(Old).name = New;
}

}


Das Skript endet mit dem Hinweis:
[b]Fehlernummer:49089
Fehlerzeichenfolge: Ein Tag mit diesem Namen ist berreits vorhanden. Wählen Sie einen anderen Namen aus.

Folgendes Skript entfernt zwar die Tags aus der Struktur, jedoch auch nicht in den Präferenzen:
Code
//XmlTagRemove.jsx 
//Xml Tags entfernen
//https://www.hilfdirselbst.ch/foren/XML-Tags_im_Buch_entfernen_f%FCr_Indexerstellung_nach_ZF_P500691.html#500691

app.activeDocument.xmlElements.firstItem().xmlElements.everyItem().untag();


Desweiteren möchte ich im Zuge der Umbenennung ein oder mehrere Attribute zum Tag setzen. Bin (wie manche vielleicht wissen) kein Scripter und ich finde keine Lösung!

Um Rückmeldung wäre ich (wie immer) äußerst Dankbar.

Gruß
Uli

P.s. gibt es im speziellen Schulungen oder online-Tutorials für das JavaScripting in InDesign?

(Dieser Beitrag wurde von Uli75 am 17. Jun 2019, 17:50 geändert)

XML-Tags vollständig löschen

Martin Fischer
  
Beiträge gesamt: 12783

17. Jun 2019, 18:30
Bewertung:

gelesen: 12464

Beitrag als Lesezeichen
Hallo Uli,

ich bin mir nicht ganz sicher, ob ich Dich richtig verstanden habe.

Aber hilft das?
(Bitte erst an einem Beispiel-Dokument testen!)
Code
app.activeDocument.xmlElements.firstItem().xmlElements.everyItem().untag();  
var root_tag = app.activeDocument.xmlElements.firstItem().markupTag;
for (var i = app.activeDocument.xmlTags.length-1; i >= 0; i--)
{
if (app.activeDocument.xmlTags.item(i) != root_tag)
app.activeDocument.xmlTags.item(i).remove(root_tag);
}


Das Schnipsel entfernt zunächst alle zugewiesenen Tags vom Text.
Danach löscht es alle Tags bis auf das Root-Tag.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 17. Jun 2019, 18:38 geändert)

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

18. Jun 2019, 08:47
Bewertung:

gelesen: 12415

Beitrag als Lesezeichen
Hallo Martin,

das hat soweit prächtig funktioniert. Herzlichen Dank dafür!!!

Was ist wenn in dem gelieferten ID noch ein DTD hinterlegt ist. Könnte man das Script noch erweitern und dieses ebenso ersatzlos löschen?

Jetzt steh ich noch etwas auf dem Schlauch, was das hinzufügen von Attributen und Werten im ersten Skript (XMLTagUmbenennen.jsx) anbelangt. Wie weiß ich da was zu?

Gruß
Uli

(Dieser Beitrag wurde von Uli75 am 18. Jun 2019, 08:54 geändert)

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

18. Jun 2019, 12:57
Bewertung:

gelesen: 12375

Beitrag als Lesezeichen
Hallo nochmals,

habe das vorhin beschriebene Problem, was die DTDs angeht, gelöst. Wenn ich das DTD manuell aus der Struktur lösche, und dann das Bereinigungs-Script anwende, sind auch die Daten im Hintergrund gelöscht.

Bleibt nur noch eine Frage offen, wie ich im Zuge der Umbenennung noch Attribute hinzufügen kann.

Muchas gracias
Uli

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

18. Jun 2019, 15:19
Bewertung:

gelesen: 12351

Beitrag als Lesezeichen
Hallo nochmals,

vielleicht bin ich generell ja auf dem Holzweg mit dem Umbennen.

Es gibt ja bestimmt die Möglichkeit, alle Textrahmen mit einem Tag zu versehen und gleichzeitig ein Attribut mit entsprechendem Wert zu generieren.

Habe schon etliche Scripts ausgetestet, finde jedoch nur welche, mit denen entweder:
- der Text ausgewählt werden muss
- der Textrahmen nur ein Tag erhält jedoch ohne Attribute

Vielleicht findet sich jemand, der sowas schon mal gescriptet hat oder mit den nötigen Lösungsweg aufzeigen kann.

Gruß
Uli

XML-Tags vollständig löschen

Martin Fischer
  
Beiträge gesamt: 12783

18. Jun 2019, 16:21
Bewertung:

gelesen: 12337

Beitrag als Lesezeichen
Hallo Uli,

wirf mal einen Blick ins DOM: XMLAttributes.add()

Ein xmlAttribut fügst Du einem xmlElement hinzu:

Code
mein_xmlElement.xmlAttributes.add('mein_Attribut', 'mein_Inhalt'); 


Du brauchst also ein xmlElement, um ihm ein Attribut hinzuzufügen.

Angenommen, Du hast etwas ausgewählt, was getaggt ist, dann ginge das so:

Code
if (app.selection[0].associatedXMLElement != null) 
app.selection[0].associatedXMLElement.xmlAttributes.add('mein_Attribut', 'mein_Inhalt');


Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 18. Jun 2019, 16:22 geändert)

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

18. Jun 2019, 16:57
Bewertung:

gelesen: 12315

Beitrag als Lesezeichen
Hi Martin,

das funktioniert ja tadellos! Merci dafür.

Aus der DOM werde ich nicht wirklich schlau, da kann mir wohl auch keiner helfen :-)

Angenommen:
Es müssen alle Textrahmen mit dem Tag A versehen und mit dem Attribut X werden. Wie stell ich das an?

Gruß
Uli

P.s. ich möchte jedoch keinen über die Maßen die Zeit klauen !!!

XML-Tags vollständig löschen

Martin Fischer
  
Beiträge gesamt: 12783

18. Jun 2019, 17:35
Bewertung: |||

gelesen: 12283

Beitrag als Lesezeichen
Das folgende Schnipsel sollte zum Einen alle freistehenden Textrahmen (nicht verankert, nicht gruppiert, nicht in Tabellen ...) taggen (falls nicht bereits getaggt) und zum Anderen dem (ggf. neu) zugewiesenen xmlElement das xmlAttribut 'A' mit dem Wert '...' zuweisen.

Code
var doc = app.activeDocument;  
var xml_tag = (doc.xmlTags.itemByName('A').isValid) ? doc.xmlTags.itemByName('A') : doc.xmlTags.add({name:'A'});
var xml_element = null;

for (var i = doc.textFrames.length-1; i >= 0; i--)
{
if (doc.textFrames.item(i).associatedXMLElement != null)
{
// Textrahmen bereits getaggt
xml_element = doc.textFrames.item(i).associatedXMLElement;
}
else
{
// Textrahmen noch nicht getaggt
xml_element = doc.xmlElements.firstItem().xmlElements.add({markupTag: xml_tag});
doc.textFrames.item(i).markup(xml_element);
}
try
{
//Versuch, das angegebene xmlAttribut zuzuweisen
if (!doc.textFrames.item(i).associatedXMLElement.xmlAttributes.itemByName('X').isValid)
doc.textFrames.item(i).associatedXMLElement.xmlAttributes.add('X', '...');
}
catch(e)
{
// Zuweisung des xmlAttributs misslungen
$.writeln( e.message );
}
}


Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 18. Jun 2019, 17:54 geändert)

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

19. Jun 2019, 08:40
Bewertung:

gelesen: 11948

Beitrag als Lesezeichen
Guten Morgen Martin,
TOP!!!!

Vielen Herzlichen Dank! Das ist genau das was ich brauche!

Jetzt nehm ich mir das Buch von Gregor Fellenz "InDesign automatisieren" und schau mir die Logik deines Scripts an.

Top, top, top… bin begeistert

Gruß
Uli

XML-Tags vollständig löschen

Martin Fischer
  
Beiträge gesamt: 12783

19. Jun 2019, 09:28
Bewertung:

gelesen: 11901

Beitrag als Lesezeichen
Guten Morgen Uli,

vielen Dank für Deine Rückmeldung.

Wenn die obigen Beispiele dazu anspornen, Dich selbst in die Materie zu vertiefen – wozu das Buch von Gregor eine gute Grundlage bietet – dann hat sich diese Diskussion wirklich gelohnt.

Weitere interessante Quellen findest Du bei Peter Kahrel, dessen Skripte ich Dir besonders zum Studium und zur Orientierung empfehle: InDesign: JavaScript and GREP links and other useful resources.


Es freut mich, Dich von diesem »Virus« angesteckt zu sehen. Smile

Viele Grüße
Martin


XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

24. Jun 2019, 10:34
Bewertung:

gelesen: 7626

Beitrag als Lesezeichen
Moin nochmals,

bin wohl mit dem Virus infiziert, jedoch ist die Krankheit noch nicht ausgebrochen :-)

Jetzt, nach Rücksprache mit dem Kollegen, taucht die Frage auf, ob man nicht die vertaggung nur auf der entsperrten Ebene (immer die oberste) vornehmen kann und alle Textrahmen auf gesperrten Ebenen vernachlässigt.

Ich weiß zwar, dass ich die Ebene mit firstItem ansprechen kann, aber nicht die Elemente auf dieser.

Kann mir geholfen werden?

XML-Tags vollständig löschen

Uli75
Beiträge gesamt: 54

25. Jun 2019, 09:20
Bewertung:

gelesen: 7527

Beitrag als Lesezeichen
Guten morgen zusammen!

Glaube bin auf der Zielgeraden!? Zumindest funktioniert es wie nachfolgend:

Code
//TagAttributZuTextrahmen.jsx 
//https://www.hilfdirselbst.ch/gforum/gforum.cgi?post=570757#570757

var doc = app.activeDocument;
var xml_tag = (doc.xmlTags.itemByName('PFBlock').isValid) ? doc.xmlTags.itemByName('PFBlock') : doc.xmlTags.add({name:'PFBlock'});
var xml_element = null;


for (var i = doc.layers.firstItem().textFrames.length-1; i >= 0; i--)
{

//wenn oberste Ebene gesperrt -> Stop
if (doc.layers.firstItem().locked == true)
{
alert("Die oberste Ebene ist gesperrt!");
exit();
} else {

if (doc.layers.firstItem().textFrames.item(i).associatedXMLElement != null)
{
// Textrahmen bereits getaggt
xml_element = doc.textFrames.item(i).associatedXMLElement;
}
else
{
// Textrahmen noch nicht getaggt
xml_element = doc.xmlElements.firstItem().xmlElements.add({markupTag: xml_tag});
doc.layers.firstItem().textFrames.item(i).markup(xml_element);
}
try
{
//Versuch, das angegebene xmlAttribut zuzuweisen
if (!doc.layers.firstItem().textFrames.item(i).associatedXMLElement.xmlAttributes.itemByName('settings').isValid)
doc.layers.firstItem().textFrames.item(i).associatedXMLElement.xmlAttributes.add('settings', // Anfuehrungen müssen \" auskommentiert und Zeilenschalter mittels \n erstellt werden
'{\n\"block-actions\":\"\",\n\"text-format\":\"\"\n}');
}
catch(e)
{
// Zuweisung des xmlAttributs misslungen
$.writeln( e.message );
}
}
}


Gruß
Uli