当今的报表应用程序广泛地使用了 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 构建字典名称
- 使用
documentXSLT 函数访问字典 - 使用 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.zip | 3KB | HTTP |
学习
- 您可以参考本文在 developerWorks 全球站点上的 英文原文。
-
XSLT 是什么类型的语言?(Michael Kay,developerWorks,2005 年 4 月):查阅这篇分析和概述文章,了解这种语言的起源、优势以及使用它的原因。
-
国际化的 XSLT 样式表和 XML 字典方法
(Laura Menke,developerWorks,2001 年 4 月):了解这种在服务器端进行国际化并把站点内容发生更改时需要编辑的文件数减至最少的方法。
-
XSLT 教程:了解 XSLT 的基础知识及如何用它来转换 XML 文档。
-
XML 国际化的最佳实践:在万维网联盟(World Wide Web Consortium,W3C)中查阅这些最佳实践说明。
-
IBM XML 认证:了解如何成为一名 IBM 认证的 XML 及相关技术的开发人员。
-
XML 技术文档库:参阅 developerWorks XML 专区,获得大量技术文章和技巧、教程、标准和 IBM 红皮书。
-
developerWorks 技术活动和网络广播:通过这些会话获得最新的技术进展。
-
技术书店:浏览关于这些主题和其他技术主题的书籍。
-
developerWorks podcast:收听针对软件开发人员的有趣访谈和讨论。
获得产品和技术
-
用于产品评估的 IBM 试用软件:使用可直接从 developerWorks 下载的试用软件构建您的下一个开发项目,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
-
XML 专区讨论论坛:参与任何与 XML 相关的讨论。
-
developerWorks XML 专区:分享您的想法:在阅读本文之后,请在此论坛中发表您的评论和想法。XML 专区的编辑主持该论坛并欢迎您的加入。
-
developerWorks blog:访问这些博客,加入 developerWorks 社区。


