2011-11-25 31 views
5

Quiero traducir un archivo XML dado (es una gramática RelaxNG) a otros idiomas a través de XSLT. Supongamos que el archivo XML es:Uso de XSLT para traducir un archivo XML

<?xml version="1.0" encoding="UTF-8"?> 
<grammar> 
    <element name="table" /> 
    <element name="chair" /> 
</grammar> 

Ahora estaba pensando en tener una hoja de estilo XSLT con la información como

en=table, de=Tisch, fr=table 
en=chair, de=Stuhl, fr=chaise 
... (there will be many, many more entries) 

Pero también podría poner esta información en un archivo externo (estoy empezando a partir rasguño). ¿Puede darme consejos sobre cómo formular un XSLT? Estaba pensando en usar <xsl:key> para esto, pero nunca entiendo las teclas en XSLT. El resultado debe ser similar a esto, cuando se crea la traducción alemana:

<?xml version="1.0" encoding="UTF-8"?> 
<grammar lang="de"> 
    <element name="Tisch" /> 
    <element name="Stuhl" /> 
</grammar> 

Respuesta

6

Esta transformación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pFrom" select="'en'"/> 
<xsl:param name="pTo" select="'de'"/> 

<xsl:key name="kIdByLangVal" match="@dId" 
    use="concat(../../@lang, '+', ../@value)"/> 

<xsl:key name="kValByLangId" match="@value" 
    use="concat(../../@lang, '+', ../@dId)"/> 

<xsl:variable name="vDicts" select= 
    "document('file:///c:/temp/delete/dicts.xml')"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@name"> 
    <xsl:variable name="vCur" select="."/> 

    <xsl:attribute name="name"> 
    <xsl:for-each select="$vDicts"> 
    <xsl:value-of select= 
    "key('kValByLangId', 
      concat($pTo, '+', 
       key('kIdByLangVal', 
        concat($pFrom, '+', $vCur) 
        ) 
       ) 
     ) 
    "/> 
    </xsl:for-each> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en el documento XML proporcionado:

<grammar> 
    <element name="table" /> 
    <element name="chair" /> 
</grammar> 

y teniendo el archivo C:\temp\delete\dicts.xml como:

<dictionaries> 
<dictionary lang="en"> 
    <word dId="1" value="table"/> 
    <word dId="2" value="chair"/> 
</dictionary> 
<dictionary lang="de"> 
    <word dId="1" value="Tisch"/> 
    <word dId="2" value="Stuhl"/> 
</dictionary> 
</dictionaries> 

produce el, resultado correcto deseada:

<grammar> 
    <element name="Tisch"/> 
    <element name="Stuhl"/> 
</grammar> 
+0

La forma en hojas de estilo XSL miran siempre asustar de muerte a mí. ;) – DanMan

+2

@DanMan: Lo que asusta * me * es el aspecto de un imperativo, código de spaghetti :) –

+0

Antes que nada: gracias Dimitre, ¡siempre publicas excelentes respuestas! Actualmente no estoy muy contento con el diccionario largo (cuando tengo 100 entradas, es difícil ver cuál es el número correcto). Debería haber pensado en esto de antemano. Actualmente estoy jugando con tu solución y trato de aplicarla a un diccionario con el siguiente estilo: ''. – topskip

Cuestiones relacionadas