在XSLT上包含语言文件(作为XML)

时间:2010-09-09 22:06:09

标签: xml xslt

我正在进行正确的转型以开发多语种网站。本网站的所有文本都需要从XML文件中获取,因为该站点的输出将是已处理的文件。

这是基本文件 index.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl/index.xsl"?>
<page>
    <entry>
        <id>12</id>
        <value>img/12.jpg</value>
    </entry>
    <entry>
        <id>13</id>
        <value>img/13.jpg</value>
    </entry>
</page>

此条目是唯一的,因此不需要翻译。我的 index.xsl

<?xml version="1.0" encoding="UTF-8"?>   
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- I'm including a language file, but I've various language files that will be stored in different folders -->
    <xsl:param name="menu" select="document('../lang/index.xml')" />

    <xsl:template match="/">
        <html>
            <xsl:attribute name="lang"><!-- name of the lang --></xsl:attribute>

            <head></head>

            <body>
                <ul id="menu">
                    <xsl:for-each select="language/menu">
                        <li><xsl:value-of select="." /></li>
                    </xsl:for-each>
                </ul>

                <!-- this is not important, is an example -->
                <xsl:for-each select="page/entry">
                    <xsl:value-of select="id" />
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

我包含 ../ lang / index.xml ,其中包含某种语言的所有单词,例如英语。我需要这个网站有3种不同的语言,可以存储如下:

/lang/en/index.xml

<language>
    <menu>Home</menu>
    <menu>Images</menu>
</language>

/lang/es/index.xml

<language>
    <menu>Inicio</menu>
    <menu>Imágenes</menu>
</language>

/lang/fr/index.xml

<language>
    <menu>Maison</menu>
    <menu>Images</menu>
</language>

我的问题是如何管理这个问题。我没有选择更改它,因为我不允许为每种语言执行特定的index.xsl文件。

提前谢谢你,抱歉学校英语。

2 个答案:

答案 0 :(得分:2)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:param name="pLang" select="'es'"/>
    <xsl:param name="pMenu" 
               select="document(concat('../lang/',$pLang,'/index.xml'),/)"/>
    <xsl:template match="/">
        <html lang="{$pLang}">
            <head></head>
            <body>
                <ul id="menu">
                    <xsl:apply-templates select="$pMenu/*"/>
                </ul>
                <xsl:apply-templates select="page/entry"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="language/menu">
        <li>
            <xsl:value-of select="." />
        </li>
    </xsl:template>
    <xsl:template match="entry">
        <img id="{id}" src="{value}"/>
    </xsl:template>
</xsl:stylesheet>

输出:

<html lang="es">
    <head></head>
    <body>
        <ul id="menu">
            <li>Inicio</li>
            <li>Imágenes</li>
        </ul>
        <img id="12" src="img/12.jpg" />
        <img id="13" src="img/13.jpg" />
    </body>
</html>

答案 1 :(得分:1)

特定于语言的输入文件

此文件将被转换。除了样式表处理指令外,它还将实际语言作为参数传递给样式表。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl/index.xsl"?>
<?xm-xsl-param name="lang" value="en"?>
<page>
  <entry>
    <id>11</id>
    <value>bla </value>
  </entry>
  <entry>
    <id>14</id>
    <value>bla bla</value>
  </entry>
</page>

与语言无关的文件

使用document函数包含此文件。请注意,这不需要样式表处理指令:

<?xml version="1.0" encoding="UTF-8"?>
<page>
    <entry>
        <id>12</id>
        <value>Lorem ipsum</value>
    </entry>
    <entry>
        <id>13</id>
        <value>Lorem ipsum</value>
    </entry>
</page>

XSL转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- the external parameter with a default value -->
  <xsl:param name="lang" select="en" />

  <xsl:variable name="entries" 
                select="page/entry | document('../lang/index.xml')/page/entry" />


  <xsl:template match="/">
    <html lang="{$lang}">
      <head></head>

      <body>
        <!-- accessing an entry by its id value -->
        <xsl:value-of select="$entries[id = 12]/value"/>

        <!-- looping all entries -->
        <xsl:for-each select="$entries">
          <xsl:sort select="id" order="ascending"/>
          <xsl:value-of select="id" />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>