使用XSLT转换XML文件

top*_*kip 5 xslt dictionary xslt-2.0

我想通过XSLT将给定的XML文件(它是一个RelaxNG语法)翻译成其他语言.假设XML文件是:

<?xml version="1.0" encoding="UTF-8"?>
<grammar>
  <element name="table" />
  <element name="chair" />
</grammar>
Run Code Online (Sandbox Code Playgroud)

现在我正在考虑使用带有类似信息的XSLT样式表

en=table, de=Tisch, fr=table
en=chair, de=Stuhl, fr=chaise
...  (there will be many, many more entries)
Run Code Online (Sandbox Code Playgroud)

但我也可以把这些信息放到外部文件中(我从头开始).你能给我一些如何制定XSLT的建议吗?我正在考虑使用<xsl:key>这个,但我从来没有在XSLT中获得密钥.当我创建德语翻译时,结果应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<grammar lang="de">
  <element name="Tisch" />
  <element name="Stuhl" />
</grammar>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

当应用于提供的XML文档时:

<grammar>
    <element name="table" />
    <element name="chair" />
</grammar>
Run Code Online (Sandbox Code Playgroud)

并将文件 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>
Run Code Online (Sandbox Code Playgroud)

产生想要的,正确的结果:

<grammar>
   <element name="Tisch"/>
   <element name="Stuhl"/>
</grammar>
Run Code Online (Sandbox Code Playgroud)

  • @DanMan:什么吓到我*是一个命令式,意大利面条代码的外观:) (2认同)