[代码生成] 使用Java与XSLT的10条技巧
http://blog.csdn.net/kayz/article/details/251824
+++++++++++++++++++++++++
http://www.ibm.com/developerworks/cn/xml/x-clientxslti18n/
服务端国际化例子
+++++++++++++++++++++++++++
国际化的XSLT样式表和XML字典方法
大中小
2002-8-28 14:21:36 作者:畅享网 【我要评论】
本文关键字: 网络技术 XML & Web services 应用技术资料
国际化的XSLT样式表和XML字典方法
--当站点上的内容更改时,使需要编辑的文件数最小化
Laura Menke (menkell@us.ibm.com)
技术协调员,IBM WebSphere 开发者园地
2001 年 4 月
在本文中,Laura 将向您演示如何利用 XML 和 XSLT 技术,通过字典驱动的方法启用 Web 页面的动态国际化。它提供了可以在应用程序中扩展或包括的常规 XSLT 样式表样本。 还包括将与样式表一起使用的样本字典布局。该方法将允许您在站点上的内容发生更改时使需要编辑的文件数最小化。
概述
本文假设读者已具备 JSP、servlet、HTML、XML 和 XSLT 的常识。在本文中,我将介绍使用 XSLT 样式表和 XML 字典所进行的 Web 内容的国际化解决方案。
为显示提供信息的动态国际化是一个难题。 例如,HTML 页面可能包含需要翻译成目标语言的按钮和标签。 通过编码、使用 servlet、JSP 或对每种语言使用不同的页面,可以实现 HTML 的翻译。然而,源可能是动态的,因而使这些种类的解决方案变得非常昂贵和复杂。
大多数 Web 应用程序处理格式为 XML(包括 HTML 页面)的数据。结果,基于 XML 的标准转换机制(例如,XSLT)可用于根据目标语言替换部分文本。然而,如果仅仅使用 XSLT,那么每对语言都需要一个 XSLT 样式表。该问题的解决方案是创建一个字典驱动的常规 XSLT 样式表来控制文本可翻译部分的动态替换。因为用户只通过提供新字典将常规 XSLT 样式表应用于新情况,所以这会减少用于显示的国际化信息的费用和复杂程度。它还允许重用字典,为要存储的文本翻译创建一个中央位置。
图 1:使用常规 XSLT 样式表
Web 内容的转换有多种方法。可以在 servlet、JSP 或浏览器中使用常规 XSLT 样式表。 例如,Internet Explorer 5.0 可以处理 XSLT 转换,让您将一些处理推送到客户机以获得更好的性能。 然而,WAP 电话和 Palm Pilot 没有这种能力,所以在这些情况下,转换必须在 servlet 或 JSP 中发生。
常规 XSLT 样式表
定义 XSLT 样式表的关键是创建一个常规样式表,这个样式表可应用于许多种情况并且不直接依赖于某种 Web 语言( HTML、WML 或任何其它标记语言)。常规 XSLT 样式表将基本功能添加到国际化信息,用于显示。 然后,可以在其它 XSLT 样式表中扩展或包括,以添加功能。常规样式表定义下列规则:需要国际化的 HTML/XML 文档中的每个元素——如按钮、标签或文本——必须定义属性 nlsid。nlsid 的值用作 XML 字典的密钥。 XSLT 样式表为字典编制索引、查找与 nlsid 属性值匹配的密钥、与字典中的当前语言匹配并检索已翻译的文本。然后,它将替换元素主体中已翻译的文本,或将已翻译的文本插入元素主体。如果样式表在字典中找不到 nlsid 指定的密钥,那么它只将元素的内容(如果该元素包含缺省内容)复制到新文档。 清单 1 显示了实现这一规则的常规 XSLT 样式表。 传递到 XSLT 样式表的两个参数用于定义将使用的 XML 字典以及翻译的首选目标语言。
常规字典
XML 字典的格式如下所示。根元素是 locale。locale 的子代是可以根据 nlsid 属性值索引的字典中的密钥。密钥的子代是带有文本部分译文的支持的语言。 可以为 Web 应用程序的每个页面和 Web 应用程序的每个部分定义字典, 也可以为整个 Web 应用使用一个字典。 可以在多个应用程序之间使用 XML 字典。清单 2 是登录屏幕的字典示例;它包含两种语言:英语和德语。
清单 2:登录屏幕的字典
<?xml version='1.0'?>
<locale>
<userid>
<en-us>User Name</en-us>
<de>Benutzername</de>
</userid>
<password>
<en-us>Password</en-us>
<de>Passwort</de>
</password>
<logonbutton>
<en-us>Logon</en-us>
<de>Anmelden</de>
</logonbutton>
</locale>
Web 内容的外观
上面提到过,要翻译的任何元素都需要定义 nlsid 属性。元素可能包含也可能不包含缺省语言。 清单 3a 定义的是带有缺省语言的标签元素的外观, 清单 3b 显示了没有缺省语言是什么样子。 清单 3c 显示了当应用常规样式表时下列元素的结果。对于这个示例,从浏览器接收到的首选语言是德语,它使用上面定义的“XML 字典”(请参阅清单 2)。
清单 3a:在带有缺省语言的 HTML 文档中定义的元素
<label id="useridLabel" nlsid="userid">User Name</label>
或
清单 3b:在不带有缺省语言的 HTML 文档中定义的元素
<label id="useridLabel" nlsid="userid"/>
清单 3c:转换结果
<label id="useridLabel" nlsid="userid">Benutzername</label>
servlet 转换示例
Internet Explorer 和 Netscape Navigator 这样的浏览器允许设置首选语言。 servlet 或 JSP 可以通过 HTTP 请求的 "Accept-Language" 头检索用户的首选语言。 可以从 Internet Explorer 内部使用 VBScript 来检索首选语言。 要使 Web 应用程序国际化,只要将首选语言作为参数传递给 XSLT 样式表、将字典源作为参数设置成 XSLT 样式表、对 HTML/XML 文档执行转换并显示国际化信息即可。
例如,servlet 可能包含下列要处理 HTML 页面翻译的代码(请参阅清单 4)。
清单 4:HTML 页面的翻译
public void doGet (HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
.......
XSLTProcessor processor =
org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor();
Processor.setStylesheetParam("currentLocale",
req.getHeader("Accept-Language"));
processor.setStylesheetParam("dictionary-file","'nls.xml'");
Processor.process(new
org.apache.xalan.xslt.XSLTInputSource("HTMLToBeTranslated.xml"),
new
org.apache.xalan.xslt.XSLTInputSource("NLSStyleSheet.xsl"),
New
org.apache.xalan.xslt.XSLTResultTarget(OutputStreamForView));
.......
}
总结
在本文中,我已经向您演示了如何使用 XSLT 和 XML 字典创建可扩展的解决方案,使 Web 内容国际化。通过利用这种方法,将减少开发人员必须维护的代码量并且防止硬编码资源在您各个应用程序中分散。这种方法还允许您拥有单一页面源,而不是用 24 种不同语言编写的同一页面源。您还可以在许多各种各样的应用程序中重用字典。
参考资料
XML.org 提供许多与 XML 相关的新闻、教育和工具。
Mulberry Technologies, Inc. 是专门从事基于 SGML 和 XML 的系统的电子出版顾问工作。
获得最新版本的 Xalan-Java, 它是一种将 XML 文档转换成 HTML、文本或其它 XML 文档类型的 XSLT 处理器。
Xerces Java Parser 1.3.1 支持 XML 1.0 建议书,并包含高级语法分析器功能,如 XML Schema 和 DOM Level 2 版本 1.0。
关于作者
Laura Menke 是美国明尼苏达州罗切斯特 IBM WebSphere 开发者园地的技术协调员。她拥有威斯康星大学(拉克罗斯)计算机科学学位。正在明尼苏达大学继续攻读计算机科学硕士学位。近三年来,她一直从事各种面向对象的技术。她主要研究客户机技术。可以通过 menkell@us.ibm.com 与她联系。
++++++++++++++++++++++++++++
客户端国际化例子
++++++++++++++++++++++++++++
使用XSLT国际化应用程序
来源:ibm.com 发布时间:2008-07-23 收藏 投稿 字体:【大 中 小】
为了满足全球用户的需求,当今的 Web 应用程序通常都需要国际化。在本文中,您将看到基于 XSLT 进行客户端国际化的方法。这种解决方案只要求进行国际化的数据与服务器存储都位于 XML 中。
点此在新窗口浏览图片
常用缩写词
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.zip 3KB HTTP
点此在新窗口浏览图片
点此在新窗口浏览图片 关于下载方法的信息 点此在新窗口浏览图片
分享到:
相关推荐
在Android应用开发中,国际化的实现是一个重要的环节,它使得应用程序能够支持多种语言,从而吸引全球用户。"Android-Android国际化文档整理xml和excel互转"项目主要关注如何方便地管理和转换Android应用中的本地化...
10. **国际化支持**:XSLT 2.0支持多语言处理,可以处理Unicode字符集和国际化格式。 通过深入学习《XSLT 2.0 程序员参考指南》,我们可以掌握这些关键概念,并能熟练地运用XSLT 2.0进行XML数据的转换和处理,提高...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
5. **XSLT的国际化支持**:XSLT 2.0及以上版本提供了内置的国际化支持,如`<xsl:decimal-format>`元素用于定义数字的分隔符和小数位数,以及`<xsl:variable>`结合`<xsl:decimal-format>`来实现动态的日期和数字格式...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
4. 国际化:XML支持多语言,而XSLT可以轻松处理不同语言版本的呈现,使得网站易于进行国际化部署。 5. 可访问性:良好的XML和XSLT使用有助于提高网页的可访问性,因为它们使内容和样式分离,有助于屏幕阅读器和其他...
4. 国际化标签库(I18N Capable Formatting):支持对JSP页面的国际化,使得开发者可以创建适应不同国家语言格式的应用程序。 XSLT(Extensible Stylesheet Language Transformations,扩展样式表转换语言)是一种...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
它由一系列标签组成,覆盖了包括控制流程、数据操作、I/O处理和国际化等多个方面。在"JSTL in Action"这本书中,深入探讨了如何利用JSTL来实现高效的Web应用开发。 1. **JSTL核心标签库**: 这是JSTL的基础,提供了...
DocBook是一种XML标准,主要用于技术写作,尤其是软件文档,而OpenDocument是国际标准化的开放文档格式,支持文字处理、电子表格和演示文稿等多种类型的内容。这个开源项目提供的XSLT样式表和工具使得这种转换过程变...
5. **国际化与本地化**:支持多语言环境,方便进行全球化部署。 6. **与JavaScript的集成**:可以通过JavaScript与Saxon-Forms交互,实现更高级的前端功能。 7. **浏览器兼容性**:尽管Saxon-Forms基于XSLT,但...
#ISSN XQuery 3.0 和 XSLT 2.0 函数库# ISSN(或国际标准序列号)被出版商(和其他人)用来识别不同媒体类型(例如印刷或电子等)的期刊出版物。 该函数库包含以下函数: 格式化 ISSN 从 ISSN 中删除格式计算 ISSN ...
尽管有这一国际标准,各PLC厂商为提高产品差异化,仍然采用不同的工程信息格式。这导致了在程序设计、项目迁移到不同厂商PLC以及长期维护时出现的不便。 二、PLCopen技术委员会与XML项目 面对这一问题,PLC用户...
标题中的“IEC_61970_CIM_2_Nodeset”指的是与国际电工委员会(International Electrotechnical Commission, IEC)标准相关的,特别是IEC 61970和IEC 61968两个标准的公共信息模型(Common Information Model, CIM)...
- **标准性**:遵循国际标准化组织(ISO)的标准,确保了其在全球范围内的适用性和互操作性。 - **扩展性**:可以通过自定义元素来满足特定需求。 3. **BPMN 2.0的主要元素**: - **活动**:代表业务流程中的一...
XML可以用于存储和交换非结构化数据,而SQL则擅长处理结构化数据。在此次作业中,学生可能学习了如何将XML数据导入到数据库中,或者从数据库中提取XML格式的数据,理解了XML与SQL的集成和交互。 通过这四次作业,...
1. **通用性**:XML是国际开放标准,支持跨平台的数据交换,并具有标准的命名空间,允许不同系统之间共享信息。 2. **易用性**:XML比SGML更简洁,易于编写和理解,同时也降低了开发XML浏览器的难度。 3. **跨平台...