跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

使用 XSLT 国际化应用程序

遵循分步方法在客户端管理国际化

Photo of Leonida Gianfagna
获得理论物理博士学位后,Leonida Gianfagna 于 2002 年加入了 IBM。他目前在 IBM Tivoli Monitoring 担任软件工程师。他感兴趣的领域包括面向服务架构 (SOA)、软件性能工程和量子计算。
Photo of Stefano Borghetti
获得计算机科学学位后,Stefano Borghetti 与 ENEA Italian Research Center 合作了一年,然后于 2000 年加入 IBM。他目前在 IBM Tivoli Monitoring 领域担任软件工程师。他感兴趣的领域包括 Web 技术、使用可视化建模进行软件分析和设计以及软件性能工程。
Dr. Antonio Perrone (antonio.perrone@it.ibm.com), 高级软件工程师, IBM
Photo of  Antonio Perrone
Antonio Perrone 于 1989 年以优异的成绩从意大利巴里大学信息科学专业毕业。1990 年加入 IBM,担任过很多开发和支持职位。他从 1996 年起就一直在 IBM Tivoli 部门中,目前担任网络性能管理方面的架构师。他的兴趣包括系统管理、性能和可用性、知识表达、数据集成、事务和过程建模及软件开发。

简介: 为了满足全球用户的需求,当今的 Web 应用程序通常都需要国际化。在本文中,您将看到基于 XSLT 进行客户端国际化的方法。这种解决方案只要求进行国际化的数据与服务器存储都位于 XML 中。

发布日期: 2008 年 6 月 24 日
级别: 初级 其他语言版本: 英文
访问情况 : 2240 次浏览
评论: 


常用缩写词

  • UTF:Unicode Transformation Format
  • URI:统一资源标识符(Universal Resource Identifier)
  • W3C:万维网联盟(World Wide Web Consortium)
  • XML:可扩展标记语言(Extensible Markup Language)
  • XSLT:可扩展样式表语言转换(Extensible Stylesheet Language Transformations)

当今的报表应用程序广泛地使用了 XML 来设置数据的格式,而不管是否采用了不同的数据源。更具体地说,基于 Web 的报表应用程序通常使用 XSL 转换来把这些 XML 数据呈现给各种客户机。当前报表系统的标准流程或多或少都可以用下面这个流程链表示:传统数据源 > XML > XSL 转换 > Web 浏览器。注意,您可以在服务器端也可以在客户端(浏览器)执行 XSL 转换步骤。选择在哪里执行通常取决于非功能性要求;例如,在高请求率的系统中,把 XSL 转换移到客户机可以获得性能和可伸缩性优势。必须把来自 XSL 转换的 Web 页面国际化。但是,如果 XSL 转换是在客户机上执行的,则应当在进行转换时处理国际化。这意味着 XSL 转换应当动态管理消息的翻译。在本文中,我们建议采用一种综合解决方案解决此问题。

解决方案说明

建议的解决方案包含以下构建块:

  • XSLT 客户端转换
  • 转换期间语言 ID 可用性(例如 it_IT 语言代码)
  • UTF-8 格式的 XML 字典;文件命名约定必须包含语言 ID
  • 用于访问 XML 字典的 XSLT document 函数

定义字典、数据库和转换

清单 1 将定义名为 dictionary_en.xml 的简单 XML 字典的结构。


清单 1. XML 字典
                
<?xml version="1.0" encoding="utf-8"?>
<Dictionary xml:lang="en-US">
<Label ID="TITLE">
<LabelText>Title</LabelText>
</Label>
<Label ID="YEAR">
<LabelText>Year</LabelText>
</Label>
<Label ID="AUTHOR">
<LabelText>Author</LabelText>
</Label>
<Label ID="HEADER">
<LabelText>Library example</LabelText>
</Label>
</Dictionary>

此文件包含要国际化的所有标签和消息;每个标签都有在转换中引用的 ID 以及名为 LabelText 的字段,该字段包含要国际化的字符串。在我们的方法中,语言 ID 包含在要转换的 XML 文件中。这意味着服务器将决定此字段是否包含在 XML 中。例如,如果需要用请求浏览器的首选语言进行国际化,则在服务器端读取 HTTP 请求头文件、搜索语言 ID 并将其包含在 XML 中就足够了。清单 2 显示了您将使用的 XML。


清单 2. XML 图书数据
                
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<Books language="en">
  <Book>
    <Title>Being and Time</Title>
    <Year>1927</Year>
    <Author>Martin Heidegger</Author>
  </Book>
  <Book>
    <Title>Shobogenzo</Title>
    <Year>1231</Year>
    <Author>Dogen Zenji</Author>
  </Book>

</Books>

您需要使用 清单 3 中所示的 XSL 转换才能在浏览器中显示此信息。由于您在客户端使用转换,因此 XSLT 和字典都必须是使用特定 URI 的可用 HTTP 资源。


清单 3. XSL 转换
                
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
    
<xsl:variable name="language" select="Books/@language" />
<xsl:variable name="dictionaryName">dictionary_<xsl:value-of 
select="$language"/>.xml</xsl:variable>
<xsl:variable name="dictionary" select="document($dictionaryName)" />

<xsl:template match="Books">
  <html>
   <head><title>Library example</title></head>
   <body>
    <h1>Library example</h1>
    <table border="1">
     <tr bgcolor="#9acd32">
      <th align="left"> 
        Title
      </th>
      <th align="left"> 
        Year
      </th>
      <th align="left"> 
        Author
      </th>
     </tr>
     <xsl:for-each select="Book">
     <tr>
      <td><xsl:value-of select="Title"/></td>
      <td><xsl:value-of select="Year"/></td>
      <td><xsl:value-of select="Author"/></td>
     </tr>
     </xsl:for-each>
    </table>
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

这将生成 图 1 中所示的屏幕。


图 1. 未经国际化的结果
未经国际化的结果

在这种情况下,标签都尚未国际化。


更改语言属性

清单 4 将引入把输出国际化为意大利语言所需实现的更改。服务器端应用程序将只返回包含 XSLT 引用的 XML 数据,但是它将修改语言属性以表示意大利语言。


清单 4. 包括意大利语言的 XML 图书数据
                
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<Books language="it">
  <Book>
    <Title>Being and Time</Title>
    <Year>1927</Year>
    <Author>Martin Heidegger</Author>
  </Book>
  <Book>
    <Title>Shobogenzo</Title>
    <Year>1231</Year>
    <Author>Dogen Zenji</Author>
  </Book>
</Books>
      

这样,XSLT 能够直接从 XML 检索所需的语言。

清单 5 所示,您现在需要通过三种不同的方法来增强 XSLT:

  • 使用语言 ID 构建字典名称
  • 使用 document XSLT 函数访问字典
  • 使用 XPath 替换必须国际化的标签

清单 5 显示了得到的 XSLT。


清单 5. 使用 XSL 转换访问字典
                
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
    
<xsl:variable name="language" select="Books/@language" />
<xsl:variable name="dictionaryName">dictionary_<xsl:value-of 
select="$language"/>.xml</xsl:variable>
<xsl:variable name="dictionary" select="document($dictionaryName)" />

<xsl:template match="Books">
  <html>
   <head><title>Library example</title></head>
   <body>
    <h1><xsl:value-of select="$dictionary//Label[@ID='HEADER']/LabelText" /></h1>
    <table border="1">
     <tr bgcolor="#9acd32">
      <th align="left"> 
        <xsl:value-of select="$dictionary//Label[@ID='TITLE']/LabelText" />
      </th>
      <th align="left"> 
        <xsl:value-of select="$dictionary//Label[@ID='YEAR']/LabelText" />
      </th>
      <th align="left"> 
        <xsl:value-of select="$dictionary//Label[@ID='AUTHOR']/LabelText" />
      </th>
     </tr>
     <xsl:for-each select="Book">
     <tr>
      <td><xsl:value-of select="Title"/></td>
      <td><xsl:value-of select="Year"/></td>
      <td><xsl:value-of select="Author"/></td>
     </tr>
     </xsl:for-each>
    </table>
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

清单 6 显示了意大利文字典 dictionary_it.xml。


清单 6. 意大利文字典
                
<?xml version="1.0" encoding="utf-8"?>
<Dictionary xml:lang="en-US">
<Label ID="TITLE">
<LabelText>Titolo</LabelText>
</Label>
<Label ID="YEAR">
<LabelText>Anno</LabelText>
</Label>
<Label ID="AUTHOR">
<LabelText>Autore</LabelText>
</Label>
<Label ID="HEADER">
<LabelText>Esempio libreria</LabelText>
</Label>
</Dictionary>

这将得到您在 图 2 中看到的屏幕。


图 2. 经过国际化的结果
经过国际化的结果

如果所需的字典或特定标签不可用,则可以使用默认字典的定义。


结束语

本文提供了一种基于 XSL 转换进行 XML 内容国际化的客户端解决方案。无需在服务器上完成任何工作;您只需把国际化要使用的语言存储到 XML 中。客户机将通过使用 XSLT document 函数在 XSL 转换中检索相应字典来完成国际化。



下载

描述名字大小下载方法
示例源代码x-clientxslti18n.zip3KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

  • 用于产品评估的 IBM 试用软件:使用可直接从 developerWorks 下载的试用软件构建您的下一个开发项目,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

作者简介

Photo of Leonida Gianfagna

获得理论物理博士学位后,Leonida Gianfagna 于 2002 年加入了 IBM。他目前在 IBM Tivoli Monitoring 担任软件工程师。他感兴趣的领域包括面向服务架构 (SOA)、软件性能工程和量子计算。

Photo of Stefano Borghetti

获得计算机科学学位后,Stefano Borghetti 与 ENEA Italian Research Center 合作了一年,然后于 2000 年加入 IBM。他目前在 IBM Tivoli Monitoring 领域担任软件工程师。他感兴趣的领域包括 Web 技术、使用可视化建模进行软件分析和设计以及软件性能工程。

Photo of  Antonio Perrone

Antonio Perrone 于 1989 年以优异的成绩从意大利巴里大学信息科学专业毕业。1990 年加入 IBM,担任过很多开发和支持职位。他从 1996 年起就一直在 IBM Tivoli 部门中,目前担任网络性能管理方面的架构师。他的兴趣包括系统管理、性能和可用性、知识表达、数据集成、事务和过程建模及软件开发。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Web development
ArticleID=316216
ArticleTitle=使用 XSLT 国际化应用程序
publish-date=06242008
author1-email=Leonida.Gianfagna@it.ibm.com
author1-email-cc=dwxed@us.ibm.com
author2-email=stefano_borghetti@it.ibm.com
author2-email-cc=dwxed@us.ibm.com
author3-email=antonio.perrone@it.ibm.com
author3-email-cc=dwxed@us.ibm.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。