2011-11-25 5 views
5

Voglio tradurre un determinato file XML (è una grammatica RelaxNG) in altre lingue tramite XSLT. Supponiamo che il file XML è:Utilizzo di XSLT per tradurre un file XML

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

Ora stavo pensando di avere un foglio di stile XSLT con le informazioni come

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

Ma potrei anche mettere queste informazioni in un file esterno (sto iniziando da graffiare). Puoi darmi consigli su come formulare un XSLT? Stavo pensando di usare <xsl:key> per questo, ma non ho mai avuto il blocco delle chiavi in ​​XSLT. Il risultato dovrebbe essere simile a questo, quando creo la traduzione tedesca:

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

risposta

6

Questa trasformazione:

<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> 

se applicato sul documento XML fornito:

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

e con il file C:\temp\delete\dicts.xml come:

<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 il desiderato, risultato corretto:

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

Il modo fogli di stile XSL guardano sempre spaventando a morte fuori di me. ;) – DanMan

+2

@DanMan: Ciò che spaventa * me * è l'aspetto di un imperativo, codice simile agli spaghetti :) –

+0

Prima di tutto: grazie Dimitre, scrivi sempre ottime risposte! Attualmente non sono molto contento del lungo dizionario (quando ho 100 voci, diventa difficile vedere qual è il numero corretto). Avrei dovuto pensarci in anticipo. Attualmente sto giocando con la tua soluzione e provo ad applicarla a un dizionario con il seguente stile: ''. – topskip