Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT翻译XML文件_Xslt_Dictionary_Xslt 2.0 - Fatal编程技术网

使用XSLT翻译XML文件

使用XSLT翻译XML文件,xslt,dictionary,xslt-2.0,Xslt,Dictionary,Xslt 2.0,我想通过XSLT将给定的XML文件(这是一种轻松的语法)翻译成其他语言。假设XML文件为: <?xml version="1.0" encoding="UTF-8"?> <grammar> <element name="table" /> <element name="chair" /> </grammar> 但是我也可以把这些信息放到一个外部文件中(我从零开始)。你能给我一些如何制定XSLT的建议吗?我曾想过为此使用,但我从

我想通过XSLT将给定的XML文件(这是一种轻松的语法)翻译成其他语言。假设XML文件为:

<?xml version="1.0" encoding="UTF-8"?>
<grammar>
  <element name="table" />
  <element name="chair" />
</grammar>
但是我也可以把这些信息放到一个外部文件中(我从零开始)。你能给我一些如何制定XSLT的建议吗?我曾想过为此使用
,但我从未掌握XSLT中的关键点。当我创建德语翻译时,结果应该是这样的:

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

此转换:

<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>
<grammar>
    <element name="table" />
    <element name="chair" />
</grammar>
<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>
生成所需的正确结果

<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>
<grammar>
    <element name="table" />
    <element name="chair" />
</grammar>
<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>


xsl样式表的外观总是让我吓得魂不附体@丹曼:让我害怕的是命令式的、像意大利面条一样的代码:)首先:谢谢你,迪米特,你总是给出很好的答案!目前我对这本长长的字典不太满意(当我有100个条目时,很难看出正确的数字)。我应该事先考虑一下。我目前正在使用您的解决方案,并尝试将其应用于具有以下风格的词典:
。我已经使用它一段时间了,并提出了一个不同的解决方案(受您的启发,再次感谢!)。我发布了一个关于如何改进的后续问题:@Patrick:不客气。我更喜欢词典的当前(在我的回答中)结构,因为它使不同的语言几乎是独立的,我们可以很容易地将庞大的词典拆分为多个词典——每个词典只针对一种语言。我来看看你的新问题。