Thomas J.S.: 2 XML Dokumente; Knoten hinzufügen/ersetzen

Beitrag lesen

Hallo,

Ich hab leider nicht allzuviel versucht; bin seit einer Woche Praktikant und XSL(T)-Anfänger.

Da bekommt das "ins klate Wasser werfen" ja ganz neue dimensionen!

Ich versuch mich gerade an XLIFF Übersetzungen, dabei sollen italienische XLIFF Dateien die englischen XLIFF target files übernehmen

Mit richtigen XLIFF-Dateien, so nett mit default Namensraum etc?

Ich versuchs mal an einem Beispiel zu erklären :

Dokument A.xml ist die englische XLIFF Datei mit den target tags :
...
<source>&amp;Datei</source>
<target state="translated">&amp;File</target>
...

Die italienische Übersetzung (B.xml) ist noch nicht soweit; deshalb steht hier nur das hier drin :
...
<source>&amp;Datei</source>
...
Nun soll temporär die englische Übersetzung im italienischen XLIFF Dokument (B.xml) drinstehen; also im target soll folgendes erscheinen :

...
<source>&amp;Datei</source>
<target>&amp;File</target>
....

Hier ein Beispiel mit zwei XLIFF-Dateien (vorausgesetzt eure sind ebenfalls konforme XLIFF-Dateien, ansonsten kannst du auf dem Namensraumangaben in dem XSL verzeichten)

Datei A.xml
-------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
 <file original="hello.txt" source-language="en" target-language="fr" datatype="plaintext">
  <body>
   <trans-unit id="hi">
    <source>Hello world</source>
    <target>Bonjour le monde</target>
    <alt-trans>
     <target xml:lang="es">Hola mundo</target>
    </alt-trans>
   </trans-unit>
   <trans-unit id="file">
    <source>File</source>
    <target>Dossier</target>
    <alt-trans>
     <target xml:lang="es">Archivo</target>
    </alt-trans>
   </trans-unit>
  </body>
 </file>
</xliff>
-----------

Datei B.xml
-----------
<?xml version="1.0" encoding="iso-8859-1"?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
 <file original="hello.txt" source-language="en" target-language="fr" datatype="plaintext">
  <body>
   <trans-unit id="hi">
    <source>Hello world</source>
    <target>Bonjour le monde</target>
    <alt-trans>
     <target xml:lang="es">Hola mundo</target>
    </alt-trans>
   </trans-unit>
   <trans-unit id="file">
    <source>File</source>
   </trans-unit>
  </body>
 </file>
</xliff>
------------

Die XSL-Datei angewendet auf B.xml:
------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1">
<xsl:output method="xml" indent="yes" encoding="iso-8859-1" />
 <xsl:template match="/">
  <xsl:apply-templates />
 </xsl:template>

<xsl:template match="xliff:xliff | xliff:file | xliff:body">
  xsl:copy
   <xsl:copy-of select="@*" />
   <xsl:apply-templates />
  </xsl:copy>
 </xsl:template>

<xsl:template match="xliff:trans-unit">
  <xsl:variable name="currentid" select="@id" />
  xsl:copy
   <xsl:copy-of select="@*" />
   <xsl:apply-templates mode="copy" />
   <xsl:if test="not(xliff:source)">
    <xsl:apply-templates select="document('A.xml')//xliff:trans-unit[@id = $currentid]/xliff:source" mode="copy" />
   </xsl:if>
   <xsl:if test="not(xliff:target)">
    <xsl:apply-templates select="document('A.xml')//xliff:trans-unit[@id = $currentid]/xliff:target" mode="copy" />
   </xsl:if>
   <xsl:if test="not(xliff:alt-trans)">
    <xsl:apply-templates select="document('A.xml')//xliff:trans-unit[@id = $currentid]/xliff:alt-trans" mode="copy" />
   </xsl:if>
  </xsl:copy>
 </xsl:template>

<xsl:template match="xliff:*" mode="copy">
  xsl:copy
   <xsl:copy-of select="@*" />
   <xsl:apply-templates mode="copy" />
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
------------

Ausgabe von Saxon8:
------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
    <file original="hello.txt" source-language="en" target-language="fr" datatype="plaintext">
      <body>
         <trans-unit id="hi">
            <source>Hello world</source>
            <target>Bonjour le monde</target>
            <alt-trans>
               <target xml:lang="es">Hola mundo</target>
            </alt-trans>
         </trans-unit>
         <trans-unit id="file">
            <source>File</source>
            <target>Dossier</target>
            <alt-trans>
               <target xml:lang="es">Archivo</target>
            </alt-trans>
         </trans-unit>
      </body>
   </file>
</xliff>
-------------

Grüße
Thomas