Markus : Knoten positionsabhängig einfügen

Hallo,

Ich versuch gerade eine automatisierte Übersetzung durchzuführen. Hierzu soll ein Wörterbuch (lexikon.xml) aufgerufen werden und das entsprechende englische Wort übernommen werden.

Ich wollte es folgendermaßen machen (Pseudo-Algo) :

Finde im Dokument den Textknoten "Kunde"; danach rufe im Lexikon die entsprechende Stelle, wo das Wort "Kunde" erscheint und merke die Position.
Ein Elementknoten vor der gefundenen Stelle ist das englische Wort.
Dann übersetze das Wort und suche nächstes Wort....

Mein XSL hierfür funktioniert leider nicht.Xalan beschwert sich zurecht mit mit "unknown nodetype".

Aber ich weiss leider nicht, wie ich das sonst machen soll. Kann mir vielleicht jemand einen Tip geben ?

<xsl:template match="*[text()='Kunde']">
 <xsl:variable name="trans" select="text()"/>
  <xsl:variable name="pos" select="number(document('lexikon.xml')//seg[text()=$trans]/position())"/>

<xsl:variable name="ersetze" select="string(document('lexikon.xml')//wort[$pos][1])"/>
...

Die lexikon.xml sieht so aus :

...
<tu>
  <wort xml:lang="en"><seg>login</seg></wort>
  <wort xml:lang="de"><seg>Anmeldung</seg></wort>
</tu>

<tu>
  <wort xml:lang="en"><seg>customer</seg></wort>
  <wort xml:lang="de"><seg>Kunde</seg></wort>
</tu>

<tu>
  <wort xml:lang="en"><seg>order</seg></wort>
  <wort xml:lang="de"><seg>Bestellung</seg></wort>
</tu>

<tu>
  <wort xml:lang="en"><seg>browse</seg></wort>
  <wort xml:lang="de"><seg>suchen</seg></wort>
</tu>
...

  1. Hallo,

    Die lexikon.xml sieht so aus :

    Wie soll die Ausgabe aussehen?
    (Das geht weder aus deinem XSL und noch aus deiner Frage hervor.)

    Grüße
    Thomas

    1. Die Ausgabe habe ich bewusst weggelassen, weil es ein FOP-Stylesheet ist ( also bisschen unübersichtlich...)

      Was ich also machen will :
      Ein Übersetzungs-Stylsheet, welches alle Textknoten eines xsl-fo Stylesheets in Englisch übersetzt.

      Das Fragment der Eingabedatei sieht so aus :

      fo:table-row
              <fo:table-cell border-width="0.5pt">
               <fo:block text-align="left" line-height="25pt">
            Kunde
                     </fo:block>
              </fo:table-cell>
              <fo:table-cell border-width="0.5pt" line-height="25pt">
               <fo:block text-align="left">
                <xsl:value-of select="Kunde/@Nachnachme"/>
               </fo:block>
              </fo:table-cell>

      Fragment der Ausgabedatei :

      fo:table-row
              <fo:table-cell border-width="0.5pt">
               <fo:block text-align="left" line-height="25pt">
           customer
                     </fo:block>
              </fo:table-cell>
              <fo:table-cell border-width="0.5pt" line-height="25pt">
               <fo:block text-align="left">
                <xsl:value-of select="Kunde/@Nachnachme"/>
               </fo:block>
              </fo:table-cell>

  2. Hallo,

    <xsl:template match="*[text()='Kunde']">

    Und das willst du für jedes Wort so schreiben?  Dann bist du schneller wenn du die Übersetzung/Ersetzung von Hand machst.

    <xsl:variable name="trans" select="text()"/>
      <xsl:variable name="pos" select="number(document('lexikon.xml')//seg[text()=$trans]/position())"/>

    <xsl:variable name="ersetze" select="string(document('lexikon.xml')//wort[$pos][1])"/>
    ...

    Die lexikon.xml sieht so aus :

    <tu>
      <wort xml:lang="en"><seg>customer</seg></wort>
      <wort xml:lang="de"><seg>Kunde</seg></wort>
    </tu>

    Ich würde folgendes versuchen:
    <xsl:variable name="lexikon" select="document('lexikon.xml')" />
    ...

    fo:table-row
             <fo:table-cell border-width="0.5pt">
              <fo:block text-align="left" line-height="25pt">
              <xsl:apply-templates />
              </fo:block>
             </fo:table-cell>
             <fo:table-cell border-width="0.5pt" line-height="25pt">
              <fo:block text-align="left">
               <xsl:value-of select="Kunde/@Nachnachme"/>
              </fo:block>
             </fo:table-cell>
      </fo:table-row>

    ...

    <xsl:template match="fo:block[string-length(normalize-space(.)) != 0]">
     <xsl:variable name="thisWord" select="normalize-space(.)" />
     <xsl:variable name="lexWord_de" select="$lexikon//seg[. = $thisWord]" />
     <xsl:variable name="lexWord_en" select="$lexikon//seg[../../wort/seg[. = $thisWord]]" />
     xsl:choose
      <xsl:when test="not($lexWord_de = '') and not($lexWord_en = '')">
      <xsl:value-of select="$lexWord_en" />
     </xsl:when>
     xsl:otherwise
      <xsl:value-of select="$thisWord" />
     </xsl:otherwise>
    </xsl:choose>
    </xsl:template>

    fo:block[string-length(normalize-space(.)) != 0] verhindert, dass z.B. auch solche Sachen wie:
    <fo:block text-align="left" line-height="25pt">
              <xsl:apply-templates />
              </fo:block>
    betroffen werden.

    Die choose-Abfrage soll sicherstellen, dass im lexikon.xml sowohl ein deutsches als auch ein englisches Wort vorhanden ist.

    Du kannst "lexWord_en" auch so notieren:
     <xsl:variable name="lexWord_en" select="$lexikon//seg[parent::wort[@xml:lang = 'en']][../../wort[@xml:lang = 'de']/seg[. = $thisWord]]" />

    HTH
    Grüße
    Thomas

    1. Hallo,

      danke !!!

      Klappt zwar noch nicht ganz...aber dein Ansatz hilft mir auf jeden Fall weiter !

      Viele Grüsse !

      Markus

      1. Hallo,

        Klappt zwar noch nicht ganz...aber dein Ansatz hilft mir auf jeden Fall weiter !

        Wo happerst noch?

        Grüße
        Thomas

        1. Hi,

          Xalan ersetzt das deutsche Wort einfach nicht....

          Ich habe jetzt mal bisschen die XSL Spezifikation angeschaut.

          Ich glaub  xsl:key macht die Sache für mich einfacher.

          Wenn ich nicht weiterkomme, werde ich mich hier melden !

          Danke für deine bisherige Hilfe !

          Gruss,

          Markus