2011-11-25 104 views
5

我想通過XSLT將給定的XML文件(它是RelaxNG語法)轉換爲其他語言。假設XML文件是:使用XSLT轉換XML文件

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

現在,我想與像

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

但是我也可以把這些信息在外部文件中的信息的XSLT樣式表(我從開始刮)。你可以給我建議如何制定一個XSLT?我正在考慮爲此使用<xsl:key>,但我從來沒有在XSLT中獲得密鑰的懸掛。結果應該是這樣的,當我創建德語翻譯:

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

回答

6

這種轉變

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

時所提供的XML文檔應用:

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

並將文件C:\temp\delete\dicts.xml設爲

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

產生想要的,正確的結果

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

方式XSL樣式表看起來總是嚇唬魂飛魄散了我。 ;) – DanMan

+2

@DanMan:什麼讓我害怕*是一種必須的,類似意大利麪的代碼:) –

+0

首先:謝謝Dimitre,你總是發佈很棒的答案!目前我對長字典不太滿意(當我有100個條目時,很難看到什麼是正確的數字)。我應該事先考慮過這個。我現在正在玩你的解決方案,並嘗試將它應用到具有以下樣式的字典中:'。 – topskip