`
pengzhaocheng16
  • 浏览: 178123 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

xslt国际化

阅读更多
[代码生成] 使用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
点此在新窗口浏览图片
点此在新窗口浏览图片 关于下载方法的信息 点此在新窗口浏览图片
分享到:
评论

相关推荐

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...

    issn:ISSN XQuery 3.0 和 XSLT 2.0 函数库

    #ISSN XQuery 3.0 和 XSLT 2.0 函数库# ISSN(或国际标准序列号)被出版商(和其他人)用来识别不同媒体类型(例如印刷或电子等)的期刊出版物。 该函数库包含以下函数: 格式化 ISSN 从 ISSN 中删除格式计算 ISSN ...

    spring-webmvc5.3.6 jar包.rar

    包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。  当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。(例如: org.springframework.web....

    Struts tutorial(中文)

    第二个实验:struts的国际化 05. struts中的Forms 06. struts:介绍ActionForm 07. 分离Book和BookForm的一个好方法 08. 处理Invalid Entries 09. Recapitualation: Where we are 10. 使用logic 11. ...

    Struts课堂笔记.rar--struts2的struts.properties配置文件详解

    加载附加的国际化属性文件(不包含.properties后缀) struts.custom.properties Location of additional configuration properties files to load 加载附加的配置文件的位置 struts.devMode Whether Struts ...

    Struts架构设计.rar

    04.第二个实验:struts的国际化 05.struts中的Forms 06.struts:介绍ActionForm 07.分离Book和BookForm的一个好方法 08.处理Invalid Entries 09.Recapitualation: Where we are 10.使用logic 11.Templates ...

    北京中科信软 Visual Basic.NET培训

    编号 标题 内容 ... VS2008开发环境 C#语言及编码规范 面向对象开发初步 接口和类的设计 SQL语句,存储过程 二 .NET框架&C#编程 面向对象的基本知识体系 ... 资源文件与国际化开发 部署方案(ClickOnce)

    Struts tutorial

    第二个实验:struts的国际化 05. struts中的Forms 06. struts:介绍ActionForm 07. 分离Book和BookForm的一个好方法 08. 处理Invalid Entries 09. Recapitualation: Where we are 10. 使用logic 11. Templates...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    XGAP - XML Generator of APplications:XGAP是一个PHP Web应用程序生成器-开源

    XGAP代表“ Xml-Generador de APlicaciones”。 XGAP的主要目标是协助程序员完成重复的和常见的编码任务。... 免责声明:目前,XGAP已/ not /国际化或本地化。 所有消息均以西班牙语编写,并采用阿根廷语言环境。

    Struts2入门教程(全新完整版)

    1.action级别下的国际化 47 2.配置package的资源文件 48 3.app级别的资源文件 48 4.使用资源文件的原理 49 5.选择使用资源文件 49 八、验证机制 50 1.基于手工编码的校验 50 简析校验流程: 53 2.基于XML配置形式的...

    XML 讲解和分析

     为了使得SGML显得用户友好,XML重新定义了SGML的一些内部值和参数,去掉了大量的很少用到的功能,这些繁杂的功能使得SGML在设计网站时显得复杂化。XML保留了SGML的结构化功能,这样就使得网站设计者可以定义自己的...

    cemicursoj2ee:从 code.google.compcemicursoj2ee 自动导出

    国际化 邮件 XML(架构、DTD)和 JAXP(DOM 和 SAX)(.) 代码文档 (javadoc) 测试:JUnit、JMeter、... 介绍以下概念 小程序 并发 (.) 网络(. - 示例) Swing (. - 示例) RMI (.) 序列化和反射 (.) XSLT 和 ...

    XQuery权威指南(简码·扫描版)

     17.9 国际化考虑 第18章 正则式  18.1 正则式的结构  18.2 表示单个字符  18.3 表示任意字符  18.4 表示字符的组  18.5 字符类表达式  18.6 勉强模式  18.7 锚  18.8 向后引用  18.9 使用标记  18.10 ...

    Struts2属性文件详解

    该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开. struts.diSPAtcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request...

Global site tag (gtag.js) - Google Analytics