mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Di 16.04.2024 11:15 Benutzername: Passwort: Auto-Login

Thema: XSLT Attribute automatisch einfügen vom 22.07.2006


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> XSLT Attribute automatisch einfügen
Seite: 1, 2  Weiter
Autor Nachricht
fischchen
Threadersteller

Dabei seit: 06.03.2003
Ort: Kassel
Alter: 45
Geschlecht: Männlich
Verfasst Sa 22.07.2006 20:47
Titel

XSLT Attribute automatisch einfügen

Antworten mit Zitat Zum Seitenanfang

Hallo zusammen,

stehe mal wieder vor einem Problem mit XSLT.
Mein Chef meint er müsste mir ständig Sachen bringen die meiner Meinung nach ein hohes KnowHow fordern. Leider arbeite ich mich erst seit einigen Monaten in die ganze Thematik ein und weiß dann oft nicht weiter.
Wir erstellen ein ganz normales Indesign Dokument. Dann exportieren wir die XML Struktur. (siehe ersten Codeblock)
Diese Struktur soll dann durch ein Übersetzungsbüro in mehrere Sprachen übersetzt werden. Um später die übersetzten Texte wieder an den richtigen Positionen zuordnen zu können, wollen wir eine id als Attribute einfügen. (siehe zweiten Codeblock, so soll es aussehen)

Jetzt habe ich gedacht, ich lese die aktuelle Position des momentnen Textknotens in einem separaten Template aus und setze diesen Wert als Attribut. Dann rufe ich an den bestimmten Stellen im Script das Template auf. Das klappt aber nicht, weil ich dann immer die Position in dem aktuellen Tag bekomme und nicht die aus dem Gesamtdokument.
Oh man, ich weiß das lesen dieses Textes ist schon kompliziert. Mein Script ist im letzten Codeblock.

Vielleicht kann mir jemand helfen?

Code:

<seite_01>
 <VS_SellingIdea>
  <VS_SellingIdea>Neuheiten 
Herbst 2006</VS_SellingIdea>
  

  <VS_Claim>Werkzeuge für höchste Ansprüche</VS_Claim>
  </VS_SellingIdea>
  <_07_Stoerer>Ergänzung zu Ihrem 
Katalog 05/06</_07_Stoerer>
  </seite_01>
- <seite_02>
  <_00_Kopfzeile>Neuheiten Herbst 2006</_00_Kopfzeile>
  <_07_Stoerer>Lassen Sie sich begeistern: von
durchdachten Lösungen für noch
effizienteres Arbeiten.</_07_Stoerer>
  </seite_02>

Code:

- <seite_01>
- <VS_SellingIdea>
  <VS_SellingIdea textRefDE="1">Neuheiten Herbst 2006</VS_SellingIdea>
  

  <VS_Claim textRefDE="2">Werkzeuge für höchste Ansprüche</VS_Claim>
  </VS_SellingIdea>
  <_07_Stoerer textRefDE="3">Ergänzung zu Ihrem Katalog 05/06</_07_Stoerer>
  </seite_01>
- <seite_02>
  <_00_Kopfzeile textRefDE="4">Neuheiten Herbst 2006</_00_Kopfzeile>
  <_07_Stoerer textRefDE="5">Lassen Sie sich begeistern: von durchdachten Lösungen für noch effizienteres Arbeiten.</_07_Stoerer>
  </seite_02>

Code:

- <xsl:for-each select="seite_01">
- <seite_01>
- <xsl:for-each select="VS_SellingIdea">
- <VS_SellingIdea>
- <xsl:for-each select="child::node() | @*">
- <xsl:choose>
- <xsl:when test=". instance of element( VS_SellingIdea )">
- <VS_SellingIdea>
- <xsl:for-each select="child::node() | @*">
- <xsl:choose>
- <xsl:when test=". instance of text()">
  <xsl:call-template name="refid" />
  <xsl:copy-of select="." />
  </xsl:when>
  </xsl:choose>
  </xsl:for-each>
  </VS_SellingIdea>
  </xsl:when>
- <xsl:when test=". instance of element( VS_Claim )">
- <VS_Claim>
  <xsl:call-template name="refid" />
  <xsl:value-of select="." />
  </VS_Claim>
  </xsl:when>
- <xsl:when test=". instance of text()">
  <xsl:copy-of select="." />
  </xsl:when>
  </xsl:choose>
  </xsl:for-each>
  </VS_SellingIdea>
  </xsl:for-each>
- <xsl:for-each select="_07_Stoerer">
- <_07_Stoerer>
  <xsl:call-template name="refid" />
  <xsl:value-of select="." />
  </_07_Stoerer>
  </xsl:for-each>
  </seite_01>
  </xsl:for-each>
- <xsl:for-each select="seite_02">
- <seite_02>
- <xsl:for-each select="_00_Kopfzeile">
- <_00_Kopfzeile>
  <xsl:call-template name="refid" />
  <xsl:value-of select="." />
  </_00_Kopfzeile>
  </xsl:for-each>
- <xsl:for-each select="_07_Stoerer">
- <_07_Stoerer>
  <xsl:call-template name="refid" />
  <xsl:value-of select="." />
  </_07_Stoerer>
  </xsl:for-each>
  </seite_02>
- <xsl:template name="refid">
-  <xsl:variable name="zahl">
    <xsl:value-of select="count(//text())" />
   </xsl:variable>
   <xsl:attribute name="textRefDE" select="$zahl" />
  </xsl:template>
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Jigity

Dabei seit: 30.07.2005
Ort: Augsburg
Alter: 44
Geschlecht: Männlich
Verfasst Sa 22.07.2006 21:27
Titel

Antworten mit Zitat Zum Seitenanfang

Hallo fischchen,

ich würd dir helfen, aber des is echt schwer zu verstehen! Vielleicht nochmal in kurzen prägnanten Worten:
- Ihr wollt aus InDesign die erstellte XML-Struktur exportieren, die ihr durch taggen von Inhalten erreicht habt
- Ihr wollt jedem Element im nachhinein eine id per xslt zuordnen
- für verschiedene Sprachversionen soll später das jeweilige xml wieder in InDesign importiert werden um den Inhalt auszutauschen

Is dem so?

Wenn ja braucht ihr keine id's, denn InDesign geht nach Dokumentreihenfolge vor um die Inhalt mit den entsprechenden Tags zu matchen.

Vielleicht hab ich dich aber auch falsch verstanden...

Gruß Daniel
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
fischchen
Threadersteller

Dabei seit: 06.03.2003
Ort: Kassel
Alter: 45
Geschlecht: Männlich
Verfasst Sa 22.07.2006 21:46
Titel

Antworten mit Zitat Zum Seitenanfang

Hallo Daniel,

also der komplette Workflow ist etwas umfangreicher. Das Problem ist, das diese Arbeit von einem Dienstleister erledigt wird und ich mir jetzt nur anhand vorhandener Daten den Workflow zusammenreimen darf.

Ich schildere dir mal den kompletten Workflow in der Hoffnung dich nicht noch mehr zu verwirren.
Wir exportieren die XML Struktur aus InDesign.
Die sieht dann wie von mir gepostet aus. Daraus macht der Dienstleister eine XML für das Übersetzungsbüro. Die können diese in ein spezielles Programm laden, und dort die Texte übersetzen. Die Struktur der XML sieht so aus.

Code:

- <item>
  <category />
  <refID>1</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="21" length="">Neuheiten Herbst 2006</objectTextModule>
  </item>
- <item>
  <category />
  <refID>2</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="31" length="">Werkzeuge für höchste Ansprüche</objectTextModule>
  </item>
- <item>
  <category />
  <refID>3</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="32" length="">Ergänzung zu Ihrem Katalog 05/06</objectTextModule>
  </item>
- <item>
  <category />
  <refID>4</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="29" length="">Neuheiten Herbst 2006</objectTextModule>
  </item>


Diese Transformation ist soweit kein Problem.

Jetzt kommen die verschiedenen Sprachen als jeweils eineXML von dem Übersetzungsbüro in dem Format auch zurück. Jetzt erstellen die wieder für jede Sprache eine InDesign XML die wir einfließen lassen können. Die InDesign XML hat jetzt als Attribute die id.(wie im zweiten CodeBlock dargestellt) Ich vermute mal das anhand der ID die Texte zugeordnet werden. Deshalb muss die id doch bestimmt als erstes als Attribute eingefügt werden?

Es ist etwas komplex und deshalb auch schwer zu erklären. Ich hoffe du verstehst es so.

Vielen Dank für deine Mühen
Stefan

Nicht wundern, ich hab nur das /code an die richtige Stelle
gesetzt *zwinker* dastef


Zuletzt bearbeitet von dastef am Sa 22.07.2006 22:03, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Jigity

Dabei seit: 30.07.2005
Ort: Augsburg
Alter: 44
Geschlecht: Männlich
Verfasst Sa 22.07.2006 22:43
Titel

Antworten mit Zitat Zum Seitenanfang

Ok, das is mal wirklich verwirrend!
Ich muß dich nochmal bitte den einzelnen Code zu posten und bitte in folgender Reihenfolge:

1. Exportierte XML Datei aus InDesign
(soweit ich bis dato entnehmen konnte, wird hier von InDesign keine ID exportiert, aber für die spätere Zuordnung wollt ihr hier ein zuweisen. Wenn ja, nach welchen Vorgaben? Einfach für jeden Text eine id, oder für spezielle Elemente?)

2. XML-Datei nach transformation für die Übersetzer

3. Erhaltene XML-Datei von Übersetzern, die wiederum in InDesign eingepflegt werden soll


Anmerkungen meiner Seits:
Welches Tool benützt ihr zusätzlich zur XML Schnittstelle? Weil du schreibst, das du vermutest das die Texte nach ID zugwiesen werden. Oder meinst du doch die normale Schnittstelle von InDesign, denn die interessiert sich nicht für Attribute soweit ich zumindest damit vertraut bin, sondern geht wie gesagt nach Dokumentreihenfolge vor.

Wenn du also vier item-Elemente in deiner xml hast und in InDesign vier Textrahmen den tag item zugewiesen hast, dann ersetzt InDesign den inhalt des ersten gettagten Rahmens in InDesign mit dem Inhalt des ersten item-Elements deiner importierten xml Datei. Attribute werden völlig ingnoriert.
Deshalb auch die nachfragerei, da ich glaub, dass dir die Zuweisung von ID's nichts bringt.

Als zweites gibt es die Möglichkeit in InDesign mit Scripting bsp: JavaScripts zu arbeiten, und hier die von InDesign vergebenen id's zu exportieren. Vielleicht wäre das die schnellste und praktkabelste Lösung...

Gruß Daniel


Zuletzt bearbeitet von Jigity am Sa 22.07.2006 22:59, insgesamt 3-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
fischchen
Threadersteller

Dabei seit: 06.03.2003
Ort: Kassel
Alter: 45
Geschlecht: Männlich
Verfasst Sa 22.07.2006 23:08
Titel

Antworten mit Zitat Zum Seitenanfang

Also wir nutzen für den XML Import nur Indesign. Für die Zuordnung der Texte in InDesign brauchen wir die ID auch nicht. Ich gehe davon aus das unser Dienstleister die ID erzeugt, damit er die übersetzten XMLs wieder in eine InDesign XML wandeln kann. Hier jetzt mal die Codes der Reihenfolge nach.

Unser Exportformat aus InDesign für unseren Dienstleister
Code:

- <seite_01>
- <VS_SellingIdea>
   <VS_SellingIdea>Neuheiten 
Herbst 2006</VS_SellingIdea>
      <VS_Claim>Werkzeuge für höchste Ansprüche</VS_Claim>
   </VS_SellingIdea>
   <_07_Stoerer>Ergänzung zu Ihrem 
Katalog 05/06</_07_Stoerer>
  </seite_01>
- <seite_02>
  <_00_Kopfzeile>Neuheiten Herbst 2006</_00_Kopfzeile>
  <_07_Stoerer>Lassen Sie sich begeistern: von
durchdachten Lösungen für noch
effizienteres Arbeiten.</_07_Stoerer>
  </seite_02>


Diese XML wird in folgendes Format für das Übersetzungsbüro gewandelt

Code:

- <item>
  <category />
  <refID>1</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="21" length="">Neuheiten Herbst 2006</objectTextModule>
  </item>
- <item>
  <category />
  <refID>2</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="31" length="">Werkzeuge für höchste Ansprüche</objectTextModule>
  </item>
- <item>
  <category />
  <refID>3</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="32" length="">Ergänzung zu Ihrem Katalog 05/06</objectTextModule>
  </item>
- <item>
  <category />
  <refID>4</refID>
  <sourceLanguage />
  <objectLanguage />
  <objectTextModule current-length="29" length="">Neuheiten Herbst 2006</objectTextModule>
  </item>


Das Übersetzungsbüro lädt diese XML in eine spezielle Software und übersetzt die Texte in alle gewünschten Sprachen.
Danach kommt für jede Sprache eine XML an unseren Dienstleister in dem oben genannten Format.

Wir erhalten dann folgende XML für den Import in InDesign
Code:

- <seite_01>
- <VS_SellingIdea>
  <VS_SellingIdea textRefDE="1">Neuheiten Herbst 2006</VS_SellingIdea>
  

  <VS_Claim textRefDE="2">Werkzeuge für höchste Ansprüche</VS_Claim>
  </VS_SellingIdea>
  <_07_Stoerer textRefDE="3">Ergänzung zu Ihrem Katalog 05/06</_07_Stoerer>
  </seite_01>
- <seite_02>
  <_00_Kopfzeile textRefDE="4">Neuheiten Herbst 2006</_00_Kopfzeile>
  <_07_Stoerer textRefDE="5">Lassen Sie sich begeistern: von durchdachten Lösungen für noch effizienteres Arbeiten.</_07_Stoerer>
  </seite_02>


Hier ist jetzt im Vergleich zu unserer gelieferten XML das textRef Attribute dazu gekommen. Das stört uns nicht weiter beim Import. Aber die Inhalte aus der XML für das Übersetzungsbüro werden meiner Meinung nach anhand der ids wieder zugeordnet. Ich denke also das hier erst aus unserer gelieferten InDesign XML eine Art Mastervorlage erstellt wird mit der refid. Dann wird daraus die XML für das Übersetzungsbüro transformiert. Und wenn diese dann zurückkommen, werden anhand der ids die Texte an den richtigen Stellen wieder eingesetzt.

Was denkst du?
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Jigity

Dabei seit: 30.07.2005
Ort: Augsburg
Alter: 44
Geschlecht: Männlich
Verfasst So 23.07.2006 10:10
Titel

Antworten mit Zitat Zum Seitenanfang

Für den Quellcode den du mir zu Verfügung gestellt hast würd ich's vielleicht so angehen:
Code:
<xsl:template match="seite_01">
   <xsl:element name="seite_01">
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

<xsl:template match="seite_02">
   <xsl:element name="seite_02">
      <xsl:apply-templates/>
   </xsl:element>
</xsl:template>

<xsl:template match="VS_SellingIdea">
   <xsl:element name="VS_SellingIdea">
      <xsl:choose>
         <xsl:when test="not(exists(VS_SellingIdea))">
            <xsl:attribute name="textRefDE">
               <xsl:value-of select="count(preceding::*[ancestor::seite_01 or ancestor::seite_02]/text()) +1"/>
            </xsl:attribute>
            <xsl:copy-of select="node()"/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:apply-templates/>   
         </xsl:otherwise>
      </xsl:choose>
   </xsl:element>
</xsl:template>

<xsl:template match="VS_Claim">
   <xsl:element name="VS_Claim">
      <xsl:attribute name="textRefDE">
         <xsl:value-of select="count(preceding::*[ancestor::seite_01 or ancestor::seite_02]/text()) + 1"/>
      </xsl:attribute>
      <xsl:copy-of select="node()"/>
   </xsl:element>
</xsl:template>

<xsl:template match="_00_Kopfzeile">
   <xsl:element name="_00_Kopfzeile">
      <xsl:attribute name="textRefDE">
         <xsl:value-of select="count(preceding::*[ancestor::seite_01 or ancestor::seite_02]/text()) - count(preceding::*[ancestor::VS_SellingIdea]/text())"/>
      </xsl:attribute>
      <xsl:copy-of select="node()"/>
   </xsl:element>
</xsl:template>

<xsl:template match="_07_Stoerer">
   <xsl:element name="_07_Stoerer">
      <xsl:attribute name="textRefDE">
         <xsl:value-of select="count(preceding::*[ancestor::seite_01 or ancestor::seite_02]/text()) - count(preceding::*[ancestor::VS_SellingIdea]/text())"/>
      </xsl:attribute>
      <xsl:copy-of select="node()"/>
   </xsl:element>
</xsl:template>


Aber ich betrachte es noch immer wenig sinnvoll, im nachhinein ne ID zuzuweisen!
Ihr wollt doch ne ID, mit der später auch InDesign was anfangen kann, oder?

Ich würde vorschlagen, ihr orndet bereits jedem Element was ihr in InDesign Tagged eine eindeutige ID zu. Würd sich über Skripting sicherlich auch automatisieren lassen!

Gruß Daniel
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
fischchen
Threadersteller

Dabei seit: 06.03.2003
Ort: Kassel
Alter: 45
Geschlecht: Männlich
Verfasst So 23.07.2006 11:17
Titel

Antworten mit Zitat Zum Seitenanfang

Guten Morgen Daniel,

vielen Dank für deinen Vorschlag. Ich probiere das gleich mal aus.
Also die ID hat mit InDesign selber nichts zu tun. Ich denke, das die ID eingebaut wird, damit unser Dienstleister automatisch die übersetzten Texte wieder in das InDesign Format bringen kann. Wenn die XML vom Übersetzungsbüro zurück kommt, dann stehen dort alle Texte übersetzt drin. Wir haben in der Struktur aber keinerlei Informationen wo die einzelnen Texte hingehören. Was gehört auf Seite 1 zu welchem Absatzformat usw. Deshalb die IDs. Man könnte dann sagen, ordne mir alle Inhalte aus der ÜbersetzungsXML anhand der ID wieder in die InDesignXML wo es auch diese ID gibt.

Viele Grüße
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
fischchen
Threadersteller

Dabei seit: 06.03.2003
Ort: Kassel
Alter: 45
Geschlecht: Männlich
Verfasst So 23.07.2006 17:35
Titel

Antworten mit Zitat Zum Seitenanfang

Hi Daniel,

ich habe dein Script getestet. Leider bringt mich das nicht weiter da ich immer noch das folgende Problem hab.
Ich wollte die Refid ja anhand der aktuellen Position der Textknoten vergeben. Das Problem ist nur, das sobald ein neuer Seiten Tag kommt wieder von vorne anfängt zu zählen. Das Problem besteht bei deinem Script auch noch. Es müsste so sein das er vom ersten Textknoten der Inhalt enthält bis zum letzten durchnummeriert.

Viele Grüße
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen Logo automatisch einfügen in Bilderserien
Werte automatisch in Textfeld in PDF einfügen lassen...
Excel (Spalten automatisch (per MAKRO) einfügen lassen
position=last() - XSLT
XSLT Script
Mit XSLT URL encoden?
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.