2010-09-09 48 views
1

我正在做正确的转换以开发多语言网站。本网站的所有文本都需要从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> 

/郎/fr/index.xml

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

我的问题是我如何管理它。我无权改变这种情况,因为我不允许为每种语言执行特定的index.xsl文件。

预先感谢您,并为学校英语感到难过。

+0

你在哪里运行XSL转换?在服务器或客户端在浏览器中?通常,这种转换是在服务器上完成的,但是您的示例看起来像您想在浏览器中的客户端上执行此操作? – 2010-09-09 23:11:23

+0

@ 0xA3我的转换是由服务器在PHP中完成的。我现在更新更具体的情况的例子。 – ipalaus 2010-09-09 23:17:52

+0

立即更新,以便更清晰。提前致谢! – ipalaus 2010-09-09 23:25:46

回答

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

@Alejandro再次感谢您的回答!我不明白的是$ pMenu参数。在这个xml/xsl例子中,我写了几行,但它会更多。/lang/ /index.xsl文件对于每种语言都具有相同的结构。我必须为它的每个使用param?我希望它很清楚......因为你可以看到我的英语......再次感谢你! – ipalaus 2010-09-10 01:01:00

+0

@Isern Palaus:我认为你想输出三个不同的页面。或者我错过了什么?每当你想输出一个页面,你都可以运行一个转换传递语言参数给你的XSLT处理器。如果你想一次输出三页,那么你必须运行XSLT 2.0处理器或使用一些扩展元素... – 2010-09-10 01:11:30

+0

@Alejandro你是如此的正确。我只想输出一个页面。我已经加载了两个.xml文件(与这些语言值对应的index.xml和index.xml),然后使用了.xsl。我所有的工作!谢谢! – ipalaus 2010-09-10 01:23:48

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

您没有使用任何有用的$ lang参数 - 看起来像是一个错误。我期望看到特定的文本被检索并从相应的语言特定文件输出。 – 2010-09-09 22:54:53

+0

@Dimitre Novatchev:问题是如何运行这些转换。 OP对此并不十分清楚。如果要在浏览器中呈现XML,通常会添加处理指令,然后用户可能会访问语言特定的URL,例如http://example.com/index.fr.xml以访问法语版本。但也许这里的情况应该是完全不同的。也许我应该让我的回答中的假设更清晰一些。当然,在我的版本中,$ lang参数并不是真的需要,更多的是gimick。 – 2010-09-09 23:04:48

+0

我已经用更清晰的示例更新了我要找的答案。我正在通过服务器上的PHP处理文件,客户端接收最终的XHTML输出。提前致谢! – ipalaus 2010-09-09 23:24:59