﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-VincentChen‘s Blog-文章分类-XML</title><link>http://www.blogjava.net/Vencent/category/8765.html</link><description>&lt;font color='orange'&gt;本博客仅为收集所用。在此对原作者表示感谢。&lt;/font&gt;
&lt;center&gt;
&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;div class="custom"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6256612161572960";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
google_ad_channel ="";
google_page_url = document.location;
google_color_border = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"];
google_color_bg = ["EEEEEE","EEEEEE","EEEEEE","EEEEEE"];
google_color_link = ["FFDDAA","0033FF","00008B","99CC33"];
google_color_url = ["999999","0033FF","00008B","FFCC00"];
google_color_text = ["0033FF","AA9999","0033FF","AA9999"];
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;/div&gt;&lt;/center&gt;
&lt;!--bgsound src="http://www.blogjava.net/Files/Vencent/The%20Mass%20Era.zip" volume="10" loop="10"/--&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 18 Jun 2007 20:32:54 GMT</lastBuildDate><pubDate>Mon, 18 Jun 2007 20:32:54 GMT</pubDate><ttl>60</ttl><item><title> 关于SAX，DOM，JAXP，JDOM，DOM4J的一些理解【转载】</title><link>http://www.blogjava.net/Vencent/articles/124856.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Sun, 17 Jun 2007 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/124856.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/124856.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/124856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/124856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/124856.html</trackback:ping><description><![CDATA[<p>第一：首先介绍一下SAX，DOM，JAXP，JDOM，DOM4J的基本知识：<br>（注意：至于 JAXP&nbsp; |&nbsp;&nbsp; JAXB&nbsp; |&nbsp;&nbsp; JAXM&nbsp; |&nbsp;&nbsp; JAXR&nbsp; |&nbsp;&nbsp; JAX-RPC 分别指什么，查看<a  href="http://gceclub.sun.com.cn/staticcontent/html/xml/faq/#jaxr">http://gceclub.sun.com.cn/staticcontent/html/xml/faq/#jaxr</a>_）</p>
<p>1、sax、dom是两种对xml文档进行分析的方法（没有具体的实现，只有接口）<br>所以不是解释器，如果光有他们，你是完成不了对xml文档的处理的。<br>sax的包是org.xml.sax<br>dom的包是org.w3c.dom<br>包的名称很重要，它有助于你理解他们之间的关系。</p>
<p>2、jaxp是api，他封装了sax\dom两种接口。并在sax\dom的基础之上，作了一套比较简单的api以供开发人员使用。<br>jaxp的包是javax.xml.parsers<br>可以看看jaxp的源文件，它的文件中包含了对sax或者dom的引用（import）<br>jaxp也不是具体的实现，他只是一套api。如果你仅仅有jaxp那是无法工作的<br>（其实jaxp只是完成对sax、dom的包装，生成了DocumentBuilderFactory\DocumentBuilder<br>和SAXParserFactory SAXParser。也就是设计模式中的工厂模式，他的好处就是具体的对象（ 解释器）建立由子类完成）</p>
<p>3、xerces解释器（号称地球上最快的xml解释器）<br>在xerces
中对jaxp中定义的SAXParser SAXParserFactory DocumentBuilder
DocumentBuilderFactory进行了继承（extends）对应SAXParserImpl
SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl<br>这就是为什么你的classpath中只要有xerces.jar（其中包含了sax dom jaxp ）和 xercesImpl.jar就可以的原因了.</p>
<p>4、什么时候可以用别的解释器 比如crimson呢<br>他也是和xerces一样 是解释器，很简单，用crimson.jar 替代xercesImpl.jar</p>
<p>5、jdom和dom4j<br>&nbsp;<br>W3C
的DOM标准API难用的让人想撞墙，于是有一帮人开发Java专用的XML
API目的是为了便于使用，这就是jdom的由来，开发到一半的时候，另一部分人又分了出来，他们有自己的想法，于是他们就去开发dom4j，形成了今天
这样两个API，至于他们之间的性能，jdom全面惨败，dom4j大获全胜。我觉得jdom和dom4j就相当于sax/dom+jaxp，具体的解释
器可以选择。</p>
<p>第二：再介绍一下，dom,sax,jdom,dom4j的技术特点：</p>
<p>1: DOM<br>DOM
是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM
是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何
工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM
以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下
导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。<br>　　另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。</p>
<p>2:SAX<br>
这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数
据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX
还比它的替代者 DOM 快许多。</p>
<p>3:　选择 DOM 还是选择 SAX ？<br>　　对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。 <br>　　DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。 <br>
DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM
解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation
APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML
文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML
文档需要频繁的改变的服务中。 <br>　　SAX 解析器采用了基于事件的模型，它在解析 XML
文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX
对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX
这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 </p>
<p>4:jdom <a  href="http://www.jdom.org/">http://www.jdom.org</a><br>JDOM
的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型，JDOM
一直得到大力推广和促进。正在考虑通过&#8220;Java 规范请求 JSR-102&#8221;将它最终用作&#8220;Java 标准扩展&#8221;。从 2000 年初就已经开始了
JDOM 开发。<br>　　JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。<br>
JDOM 文档声明其目的是&#8220;使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题&#8221;（根据学习曲线假定为
20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM
还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML
以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。<br>　　JDOM
自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM
表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache
许可证变体下发布的开放源码。</p>
<p>5: DOM4J&nbsp;&nbsp; <a  href="http://dom4j.sourceforge.net/">http://dom4j.sourceforge.net/</a><br>
虽然 DOM4J 代表了完全独立的开发结果，但最初，它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的
XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API
和标准 DOM 接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。<br>　　为支持所有这些功能，DOM4J
使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections
类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API
的代价，但是它提供了比 JDOM 大得多的灵活性。<br>　　在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J 的目标与
JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有
Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。<br>　　DOM4J
是一个非常非常优秀的Java XML
API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用
DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。</p>
<p>最后：我建议用dom4j</p>
JDOM
和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM
的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM
实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java
模型相对），所以在某些类型的项目中可能也需要它（如在 javascript 中使用 DOM）。<br>　　SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。<br>　　无疑，DOM4J是最好的，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！<img src ="http://www.blogjava.net/Vencent/aggbug/124856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2007-06-17 23:26 <a href="http://www.blogjava.net/Vencent/articles/124856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML 拉丁字符对照表</title><link>http://www.blogjava.net/Vencent/articles/102465.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Wed, 07 Mar 2007 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/102465.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/102465.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/102465.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/102465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/102465.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HTML字符实体(Character Entities)				有些字符在HTML里有特别的含义，比如小于号&lt;就表示HTML Tag的开始，这个小于号是不显示在我们最终看到的网页里的。那如果我们希望在网页中显示一个小于号，该怎么办呢？				这就要说到HTML字符实体(HTML Character Entities)了。				一个字符实体(Character Entity)分成...&nbsp;&nbsp;<a href='http://www.blogjava.net/Vencent/articles/102465.html'>阅读全文</a><img src ="http://www.blogjava.net/Vencent/aggbug/102465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2007-03-07 21:02 <a href="http://www.blogjava.net/Vencent/articles/102465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Web  显示层技术评估  </title><link>http://www.blogjava.net/Vencent/articles/58380.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Sat, 15 Jul 2006 17:46:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/58380.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/58380.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/58380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/58380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/58380.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Web				显示层技术评估								名词界定								显示层的意思就是				PresentationLayer				，也翻译成表现层、展现层、展示层。								本文讨论的范围只包括采用				HTMLTemplate				的显示层技术，不包括				Echo				，				GWT(google ...&nbsp;&nbsp;<a href='http://www.blogjava.net/Vencent/articles/58380.html'>阅读全文</a><img src ="http://www.blogjava.net/Vencent/aggbug/58380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-07-16 01:46 <a href="http://www.blogjava.net/Vencent/articles/58380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML: 利用模式注释实现自下而上的语义透明::让模式超越语法进入语义范畴</title><link>http://www.blogjava.net/Vencent/articles/36745.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36745.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36745.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36745.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="/Vencent/articles/36745.html#author">Uche Ogbuji</a>, 首席顾问, Fourthought, Inc.<br /></p>
		<p>2005 年  8 月  08 日</p>
		<blockquote>进
一步了解实现语义透明的不同方法，Uche Ogbuji 阐述了语义透明对使用 XML
的开发人员意味着什么。无论是否重用模式，都会发现使用正式的注释（与以前讨论的非正式注释相比）是很有价值的。这样做在不同的层次上带来了好处。在最直
接的实践层面上，可以生成更好的文档。更深远的好处在于它提供了语义透明性的一种重要度量。这一期的文章将讨论语义锚，并给出一些例子。作者还将花一点时
间讨论一下 XTech Conference 2005。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>以前的两期文章“
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think30.html" target="_new">Thinking XML: XML 建模艺术描述</a>”和“
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think31.html" target="_new">Thinking XML: 利用模式标准化实现自上而下的语义透明</a>”
中，我介绍了针对语义透明的一些有趣的技术和技巧。本文是这一小型系列的最后一部分，即第 3
部分，在本文中，我将讨论我认为最重要的语义透明工具。正确的模式注释在各种层次上都很有用，最起码可以改进文档。本系列的第一期中讨论了非正式的模式注
释。本文中讨论的方法是对这一思想的重要提炼，将利用语义锚实现注释的形式化。这种方法还受益于 developerWorks 上的另一篇短文，“ <a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipdict.html" target="_new">技巧：将数据词典用于 XML 和 Web 服务大纲</a>”。继续阅读本文之前，建议您看一看这些文章。
      </p>
		<p>不过，首先我想提一下最近参加的一次很棒的会议。</p>
		<p>
				<a name="N1007A">
						<span class="atitle">XTech Conference 2005</span>
				</a>
		</p>
		<p>XTech 会议源自原来的 XML Europe 会议，特别增加了补充 XML 的浏览器技术和语义技术专题讨论会。此外，
        <b>开放式数据</b>的专题讨论会和所有主题不仅考察处理 XML 的全新技术，还探讨人们和组织如何向世界自由提供数据，以便创建全新的、增加价值的应用程序和资源。
      </p>
		<p>XTech
2005 于 5 月 25-27 日在阿姆斯特丹召开（与 XML Europe 2004 的地点相同，很可能 2006
年也在这里召开）。我一直非常喜欢这个会议，高度关注标记技术的新思想和实际应用。浏览器和开放式数据专题讨论会为整个会议注入了很大活力，组织者
Edd Dumbill 为了营造团结协作的大会氛围所做的创造性工作也增强了大会的吸引力。会议提供了 Wiki（公开征求意见）和 IRC
频道（公开讨论）。Edd 在主持 Planet XTech 中很好地运用了流行的 XML 技术用法，这是一个元数据驱动的 Weblog 和
XTech 相关图片的集合，以 XML
的形式提供会议的日程安排，鼓励人们以有趣的、有用的方式“重新混合”或者处理信息。它帮助完成了开放式数据专题讨论会的所有任务。</p>
		<p>
				<b>微格式（microformat）</b>是
会议讨论的一大主题。基本上就是内嵌在宿主格式（如 XHTML 或 CSS）中的 XML
数据岛。微格式允许用户在信息中混合各种类型的扩展内容，如日历信息、个人联系信息或者图片元数据。大会中我最喜欢的话题之一讨论了一个系统，该系统的名
称很长，叫做 Gleaning Resource Descriptions from Dialects of Languages，或
GRDDL，可以用它从微格式中提取结构化的元数据（用法之一）。GRDDL 是一个重要的概念，我希望在以后的 <i>Thinking XML</i> 专栏文章中讨论它。虽然我个人的陈述出了些问题 ——
会场上的投影仪拒绝与我的膝上电脑视频驱动程序合作 —— 但我还是学到了很多东西，度过了一段美好的时光，最重要的是，我很满意地看到 XML
领域对语义技术越来越重视的更多证据（有于 XTech 大会的更多信息，请参阅 <a href="/Vencent/articles/36745.html#resources">参考资料</a>）。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="/Vencent/articles/36745.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10097">
						<span class="atitle">正式的模式注释</span>
				</a>
		</p>
		<p>形式化模式注释的关键在于为所用的术语找到好的词汇表资源和一组清晰的标识符。然后在模式中作为数据词典连接的端点写上这些标识符（通常是 URI）。清单 1 中的 RELAX NG 模式（紧凑语法）片段包含有非正式的注释。</p>
		<br />
		<a name="code1">
				<b>清单 1. 使用非正式注释提供语义线索的示例 RELAX NG 模式</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />namespace dc = "http://purl.org/dc/elements/1.1/"<br />element purchase-order<br />{<br />  dc:description [ "General purpose purchase order for merchandise" ]<br />  attribute id {<br />    dc:description [ "Unique identifier for the purchase order" ]<br />    text<br />  }<br />  #Rest of the schema here<br />}<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这种方法的局限性很大。仅仅提供了非正式的描述，需要人们读懂后才能使用。因此很难开发能够使用这类注释推断模式语义的软件。非正式性反映在注释使用了 
        <code>dc:description</code>
元素，该元素一般用于资源的松散说明。为了实现注释的正式化，我将选用 OWL Web Ontology Language
中更确定的声明，显然我是在使用词汇表术语标识模式数据元素。我选择 WordNet 作为词汇表。WordNet
是英文单词及其词法关系的数据库。我曾经在本专栏 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think29.html" target="_new">最近的一期文章</a> 中讨论过 WordNet，基本上可以将其作为一种机器可读的词汇表使用。清单 2 以 
        <a href="/Vencent/articles/36745.html#code1">清单 1</a> 为基础，但使用了更正式的注释。
      </p>
		<br />
		<a name="code2">
				<b>清单 2. 使用正式注释提供语义线索的示例 RELAX NG 模式</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />namespace wn = "http://www.cogsci.princeton.edu/"<br />element purchase-order<br />{<br />  wn:definition [<br />http://cogsci.princeton.edu/cgi-bin/webwn?stage=1&amp;word=purchase+order]<br />  attribute id {<br />    wn:definition [<br />http://cogsci.princeton.edu/cgi-bin/webwn2.0?stage=1&amp;word=identifier]<br />    text<br />  }<br />  #Rest of the schema here<br />}<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>该例中的注释为记录定义提供了明确的引用。可以在引用的 WordNet 页面上直接找到词典中的定义：
  </p>
		<blockquote>
				<b>名词</b>“purchase order”在 WordNet 中有一种意义。 
        <br />
  1. order, 
        <b>purchase order</b> ——（付款并提供规格说明和数量要求后，请求某人提供某物的商业文档，“IBM 接到了一百台计算机的订单”。）
  
      </blockquote>
		<blockquote>名词“identifier”在 WordNet 中有一种意义。
        <br />
   1. 
        <b>identifier</b> ——（建立受体的身份的符号。）  
      </blockquote>
		<p>机
器可使用 URL 的等价物来检查语义是否等价 —— WordNet
允许您在此基础上更进一步，使用它的同义词设置更丰富的语义。如果一个模式中包含指向“name”的锚，另一个包含指向“identifier”的锚，那
么机器就可以导航 WordNet 自动识别这些术语词义的相似性。不过，在实践中，WordNet
并不一定是这类注释的最佳选择，模式中使用的术语多数都有专门的技术含义，而通用词典中并没有记载这些含义。另外，由于过于雄心勃勃，WordNet
还没有完全完成，它包含不少错误，仍然在不断的发展中。作为语义锚，还可以选择 ebXML 核心成分和 RosettaNet
词典，两者本专栏中都曾经谈到过。您甚至可以在每个符号中组合使用多个锚。</p>
		<p>即使在准备从语义层面上处理这类注释之前，也可以在文
档任务中加以利用。很容易使用 XSLT 抽取模式定义和注释，以生成模式索引和数据词典。甚至可以将从页面中抽取的信息与 URL
锚结合起来。如果要使用 WordNet 来实现，可能需要使用 WordNet 的某个 RDF 翻译版本，而不是原来 Princeton
网页，否则标记非常冗长。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="/Vencent/articles/36745.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100E3">
						<span class="atitle">抽象模式中的语义锚</span>
				</a>
		</p>
		<p>如果阅读过我撰写的“
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-stron.html" target="_new">Discover the flexibility of Schematron abstract patterns</a>”，
就会了解一种非常有用的技术，从具体的 XML 语法中抽象出模式的基本信息内容。我在那篇文章中指出，“通过为 Schematron
抽象模式增加语义丰富的注释，还可以进一步提高表达能力……最终的模式很容易适应任何语法，同时还提供了语义透明性。”清单 3 中的
Schematron 片段示范了这两种技术结合的强大功能。 </p>
		<br />
		<a name="code3">
				<b>清单 3. 带有正式注释的 Schematron 抽象模式</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />  &lt;pattern abstract="true" name="purchase-order"&gt;<br />    &lt;rule context="$purchase-order"&gt;<br />      &lt;wn:definition href=<br />"http://cogsci.princeton.edu/cgi-bin/webwn?stage=1&amp;word=purchase+order"<br />       /&gt;<br />      &lt;assert test="$id"&gt;<br />        A purchase order requires an ID<br />      &lt;/assert&gt;<br />    &lt;/rule&gt;<br />    &lt;rule context="$id"&gt;<br />      &lt;wn:definition href=<br />"http://cogsci.princeton.edu/cgi-bin/webwn?stage=1&amp;word=identifier"<br />       /&gt;<br />      &lt;assert test="count(key('ids', .)) = 1"&gt;<br />        An ID must be unique<br />      &lt;/assert&gt;<br />    &lt;/rule&gt;<br />  &lt;/pattern&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这段代码定义了一个 Schematron 抽象模式，包含带有惟一标识符的订购单的抽象概念。可以用任何 XML 范式来实例化它，比如使用带有 
        <code>ID</code> 属性的 
        <code>PO</code> 元素，或者包含子元素 
        <code>ident</code> 的 
        <code>purchase-order</code> 元素。其工作原理请参阅我的 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-stron.html" target="_new">前一篇文章</a>。无论选择什么语法，都可以把这种结构从具体的模式范式回溯到抽象范式（参见 
        <a href="/Vencent/articles/36745.html#code3">清单 3</a>），从而找到确定其定义的语义锚。模式将限定 
        <code>count(key('ids', .)) = 1</code> 检查所有的标识符，从而确保只有一个包含当前值（换句话说，确定该标识符是否是惟一的）。它要求事先定义一个名为 
        <code>ids</code> 的键。
  
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="/Vencent/articles/36745.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10121">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>在从事 XML 设计的咨询活动中，我发现，对于提高模式以及我开发的其他工具的质量，语义锚是一种非常有用的工具。明显的好处是，可以使用语义锚为客户生成支持文档，而后，清晰的语义所带来的快速调整和处理技术会让客户感到惊喜。</p>
		<p>本文结束了关于实用语义透明技术的考察。希望我已经阐明，良好的语义设计不仅仅是一堆理论，而且能够在 XML 技术实践中应用。当然，我将继续在本专栏中讨论这个主题，也建议您参与 
        <a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=185&amp;cat=11" target="_new">Thinking XML 讨论论坛</a>，与他人分享您的观点。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="/Vencent/articles/36745.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>
						<a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=185&amp;cat=11">参与论坛讨论</a>。<br /><br /></li>
				<li> 您可以参阅本文在 developerWorks 全球站点上的 
          <a href="http://www.ibm.com/developerworks/xml/library/x-think32.html" target="_blank">英文原文</a>。
        <br /><br /></li>
				<li>参阅本期文章中引用的 developerWorks 文章：

          <ul><li>“
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think30.html">XML 建模艺术描述</a>”（2005 年 3 月）
            </li><li>“
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think31.html">利用模式标准化实现自上而下的语义透明</a>”（2005 年 4 月）
            </li><li>“
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipdict.html">将数据词典用于 XML 和 Web 服务大纲</a>”（2004 年 5 月）
            </li><li>“
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-stron.html">Schematron 抽象范式的灵活性</a>”（2004 年 10 月）
            </li></ul><br /></li>
				<li>进一步了解 
          <a href="http://www.xtech-conference.org/">XTech 2005</a>，此次大会已经在今年 5 月 25-27 日于阿姆斯特丹召开。有于会议的更多内容，请参阅 
          <a href="http://www.planetxtech.org/">Planet XTech</a> 和 
          <a href="http://wiki.usefulinc.com/XTech_2005">The XTech Wiki</a>。Uche Ogbuji 的演讲题目为“
          <a href="http://xtech.org/2005/wednesday.asp#21">Matching Python idioms to XML idioms</a>”。
        <br /><br /></li>
				<li>了解 
          <a href="http://www.w3.org/TR/grddl/">Gleaning Resource Descriptions from Dialects of Languages (GRDDL)</a>。“使用明确关联的转换算法，通常用 XSLT 表示从 XML 和 XHTML 文档生成 RDF 数据”的系统。
        <br /><br /></li>
				<li>有于微格式的更多信息，请阅读 Micah Dubinko 撰写的“
          <a href="http://www.xml.com/pub/a/2005/03/23/deviant.html">What Are Microformats?</a>”。
        <br /><br /></li>
				<li>了解 RELAX NG，这是一种更有效的 XML 设计。David Mertz 在他的 developerWorks 
          <i>XML Matters</i> 专栏中提供了很好的入门介绍：
  
          <ul><li><a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters/part25/index.html">第 1 部分</a> 相当完整地概括了 RELAX NG 模式的语法和语义（2003 年 2 月）。
            </li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters/part26/index.html">第 2 部分</a> 阐述了一些附加的语义问题，考察了使用 RELAX NG 的工具（2003 年 3 月）。
            </li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters/part27/index.html">第 3 部分</a> 考察了使用 RELAX NG 紧凑语法的工具（2003 年 5 月）。
            </li></ul><br /></li>
				<li>请访问 
          <a href="http://wordnet.princeton.edu/">WordNet</a> 主页，这是普林斯顿大学 Cognitive Science Laboratory 开发的英文词汇及其词法关系数据库。
        <br /><br /></li>
				<li>在 
          <a href="http://www-128.ibm.com/developerworks/cn/xml/">developerWorks XML 专区</a> 可以找到更多 XML 参考资料，其中包括 Thinking XML 专栏的 
          <a href="http://www-128.ibm.com/developerworks/cn/views/xml/articles.jsp?view_by=search&amp;search_by=Thinking+XML">以前各期文章</a>。“
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-think3.html">XML 符合语法，第 3 部分</a>”讨论了 RosettaNet 词典（2001 年 5 月）。
        <br /><br /></li>
				<li>了解如何才能成为一名 
          <a href="http://www.ibm.com/certify/certs/adcdxmlrt.shtml">IBM 认证的 XML 及相关技术的开发人员</a>。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="/Vencent/articles/36745.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="Uche Ogbuji 的照片" src="http://www-106.ibm.com/developerworks/i/p-uche.jpg" align="left" border="0" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Uche Ogbuji 是 
        <a href="http://fourthought.com/">Fourthought Inc.</a> 的顾问兼创始人，该公司是一家专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了 
        <a href="http://4suite.org/">4Suite</a>，这是一个用于 XML、RDF 和知识管理应用程序的开源平台。Ogbuji 先生还是 
        <a href="http://uche.ogbuji.net/tech/rdf/versa/">Versa</a> RDF 查询语言的首席开发人员。他是一位出生于尼日利亚的计算机工程师和作家，目前生活和工作在美国科罗拉多的博耳德。您可以通过 Ogbuji 先生的 Weblog 
        <a href="http://copia.ogbuji.net/blog/">Copia</a> 进一步了解他，或者通过 
        <a href="mailto:uche.ogbuji@fourthought.com?Subject=Thinking%20XML&amp;cc=dwxed@us.ibm.com">uche.ogbuji@fourthought.com</a> 与他联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:51 <a href="http://www.blogjava.net/Vencent/articles/36745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML: 开放的办公文件格式::一种用于前台办公文档的 XML 格式</title><link>http://www.blogjava.net/Vencent/articles/36744.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36744.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36744.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36744.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#author">Uche Ogbuji</a>, 首席顾问, Fourthought, Inc.<br /></p>
		<p>2003 年  1 月  01 日</p>
		<blockquote>OpenOffice.org
是一种成熟的、开放源码的前台办公应用程序套件，它的优点是一种基于开放 XML DTD 的已保存文件格式。这使得在处理
OpenOffice.org 产生的工作时，向用户和开发人员提供了极大的灵活性和能力。在本文中，Uche Ogbuji 介绍了
OpenOffice 文件格式并说明了其优点。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>当标记支持者尝试向大众证明
象 XML 这样的技术突破的价值时，他们几乎总是提供专用的、二进制文件格式的示例 — 而最常用的示例是已保存的字处理器文件。对 XML
文件格式前身的讨论通常会包括用逗号分隔的文件格式，这些格式极频繁地用于电子表格和数据库的导入和导出。由 <i>前台办公</i>（或只是
        <i>办公</i>）工具 —
字处理器、电子表格、表示软件、联系人管理器等 —
产生的已保存文件保存了大量表示用户知识的数据。您的笔记、备忘录、提议、分析、计划和组织化工具都是知识管理的主要内容。当您升级或迁移任何此类软件
时，一个主要问题就是新方案是否要导入旧文件。当执行备份时通常会从这些办公文件入手。 </p>
		<p>供应商知道这一点并理解其中的微妙之处：使他们的专用文件格式足够重要，这样您不得不“忠诚”地使用他们
的软件，但同时又使他们的工具足够灵活，可以接受由竞争对手的软件产生的文件格式。但是标记支持者（尤其是 XML
支持者）指出您根本不必屈从于这种“貌似仁慈的囚禁”。有人提出主张，“您为什么不 100%
地控制此类重要的数据？”又有人提出，“为什么不可以用任何文本查看器轻松地打开文件，以理解内容呢？”于是提出了 XML 作为解决方案。XML
不但是纯文本的，而且提供了一个工具箱，使不同 XML 格式之间能够相互转换。有了它，真是透明性和互操作性的福音。</p>
		<p>正
如人们所预料的，越来越多的办公工具提供了 XML 输出。最近，Microsoft 在其办公套件的最新版本里，对 XML
集成和导出能力进行了较大改进。OpenOffice.org 项目从 StarOffice 派生出完整的、开放源码的办公套件，该项目将 XML
用作其核心文件格式，而不是作为单独的导出选项。OpenOffice
包括字处理器、电子表格、演示工具和图形／图表化工具。该工具已经问世很长时间（它大约出现在 1994
年），并具有您认为任何此类办公套件应具有的优点和特性。</p>
		<p>OpenOffice.org
的铁杆支持者（OpenOffice.org 网站的志愿参与者和用户）都同意将 OpenOffice
文件格式做得尽可能开放和通用，他们都希望在众多的办公文件格式之间能够有更大的互操作性和灵活性。除了这个目标之外，他们还将文件格式贡献给结构化信息
标准促进组织（Organization for the Advancement of Structured Information
Standards，OASIS）的一个新技术委员会（TC）。我是该委员会的创始成员，我认为 OpenOffice
格式可以成为有价值的社区资源，用来将我们在工作和联系中使用的人类可读文档与可增加这些文档总体价值的各种元数据管理连接起来。在本文中，我将介绍
OpenOffice 文件格式。</p>
		<p>XML 和办公软件交汇了，这是一个有趣的时刻。有许多关于最新的
Microsoft XDocs 技术的讨论，以及关于它会不会跟 XForms（OpenOffice
格式）和其它此类项目形成竞争或相辅相成的讨论。我不会在本文中论及任何相关主题 — 部分原因是篇幅不够，还有部分原因是 XDocs
的详细信息才刚披露。此外，在本文后面的部分中，我将使用名称“OpenOffice”而不是使用完整的正式名称“OpenOffice.org”。</p>
		<p>
				<a name="h1">
						<span class="atitle">整体格式</span>
				</a>
		</p>
		<p>
我启动了 OpenOffice 1.0.1 for Linux（我很高兴发现它是随 Red Hat 8.0 一起提供的），然后创建了一个文档，如
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#figure1">图 1</a>所示。
      </p>
		<br />
		<a name="figure1">
				<b>图 1. OpenOffice 字处理器会话</b>
		</a>
		<br />
		<img alt="OpenOffice 字处理器会话" src="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/figure1.jpg" height="256" width="600" />
		<br />
		<p>如您所见，编辑界面很象任何其它 WYSIWYG（所见即所得）字处理器屏幕（OpenOffice 用户界面不在本文讨论范围之内）。我将文件保存为
        <b>document.sxw</b>。
由于所有文件都是以 OpenOffice 本机格式保存的，所以这实际上是一个包括一组 XML 和其它支持文件的 ZIP 文件 — 一种称为
OpenOffice 包格式的捆绑包。关于使归档文件约定标准化以打包多个相关的 XML
文档及其支持文件的想法，是一种流行的和惯用的思想：XML 专家 Rick Jelliffe 开发了一种基于 ZIP 的 XML
应用程序归档（XML Application Archive，XAR）格式；还有“直接因特网消息封装”（Direct Internet
Message Encapsulation，DIME），它是一个因特网草案（Internet
Draft），但要复杂得多，并且主要是针对消息传递和 Web 服务而不是通用的归档文件。OpenOffice
使用它自己的格式，接下来我将研究这种格式。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#resources">参考资料</a>以获取关于这些格式的更多信息。
      </p>
		<p>
				<b>document.sxw</b>的 ZIP 内容如下：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />$ unzip -v document.sxw<br />Archive:  document.sxw<br />Length   Method    Size  Ratio   Date   Time   CRC-32    Name<br />--------  ------  ------- -----   ----   ----   ------    ----<br />2946  Defl:N      965  67%  12-13-02 04:03  44fee85c  content.xml<br />4638  Defl:N     1199  74%  12-13-02 04:03  791e906a  styles.xml<br />1120  Stored     1120   0%  12-13-02 04:03  a921529c  meta.xml<br />6183  Defl:N     1362  78%  12-13-02 04:03  c8586553  settings.xml<br />752  Defl:N      254  66%  12-13-02 04:03  11144701  META-INF/manifest.xml<br />--------          -------  ---                            -------<br />15639             4900  69%                            5 files<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>“第一站”是
        <b>META-INF/manifest.xml</b>，它在某种程度上担任包中所有其它文件的中央目录。
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#code1">清单 1</a>是来自我样本文档的清单文件。
      </p>
		<br />
		<a name="code1">
				<b>清单 1：图 1 中所示的已保存样本文档的清单</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN"<br />"Manifest.dtd"&gt;<br />&lt;manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest"&gt;<br />&lt;manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer"<br />manifest:full-path="/"/&gt;<br />&lt;manifest:file-entry manifest:media-type="" manifest:full-path="Pictures/"/&gt;<br />&lt;manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/&gt;<br />&lt;manifest:file-entry manifest:media-type="text/xml" manifest:full-path="styles.xml"/&gt;<br />&lt;manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/&gt;<br />&lt;manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/&gt;<br />&lt;/manifest:manifest&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>所有 OpenOffice
格式都使用 DTD，我认为这样很好，因为拥有一个模式，有助于强制格式的互操作性，并且选择 DTD 还确保了对 XML
工具的最广泛支持。警告：要用通用的 XML 工具处理这些文件，您要么必须使用编目（catalog）以解析公用标识，将被指定为系统标识的
Manifest.dtd 文件复制到相同目录中，要么仅使用不读取外部 DTD 子集的工具。OpenOffice 为所需的 DTD
和实体维护一个内部编目。可以在 OpenOffice 安装的共享目录中找到 OpenOffice DTD。例如，在我的 Red Hat 8.0
安装中，它们位于 <code>/usr/lib/openoffice/share/dtd/</code> 中，而清单 DTD 在 
        <code>/usr/lib/openoffice/share/dtd/officedocument/1_0/</code> 中。您也可以在线从 OpenOffice 网站（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#resources">参考资料</a>）下载或访问这些 DTD。清单文件使用公共的 OpenOffice 名称空间，并通常包括一个向每个文件提供因特网媒体类型（IMT）和相关 URL 的项元素列表。用于子文件夹的 
        <code>media-type</code> 属性是空的（例如我示例中的 Pictures 文件夹），但通常会在这些子文件夹中包含任何嵌入图形的图形源文件。
      </p>
		<p>
				<b>meta.xml</b>包括一系列具有文档元数据的元素（如创建和最后编辑日期、已经花费在编辑该文档上的总时间、字数、页数、表数和图数等元素）。您可以将
        <b>styles.xml</b>看
作 XML 格式中的级联样式表（CSS）和 XSL 格式化对象（XSL-Formatting
Objects，XSL-FO）之间的交叉点。它定义了各种样式，这些样式可用于文档的字体、间距、修饰、间隔、制表符停止位等方面编辑会话。它命名了所
有样式，因此您可以在其它文件中引用它们。 <b>settings.xml</b>记录用户对 OpenOffice
用户界面的用户首选项。这些涉及到用来编辑文档的应用程序的细节，而不是文档本身的任何细节。这个领域还需要完成一些工作以确保互操作性。总之，如果在多
个应用程序（都使用 OpenOffice 格式）中编辑同一文档，不能期望每个应用程序都维护同样类型的设置 —
但即使如此，又如何防止它们发生冲突呢？ </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="h2">
						<span class="atitle">处理内容</span>
				</a>
		</p>
		<p>
文档的核心（实际内容）在 
        <b>content.xml</b>中。遗憾的是，在文本编辑器中，乍看上去这个文件中的元素有点过于混乱，但是您可以用多种常见的 XML 工具（包括 XSLT）抽取出字符数据，允许使用空样式表（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#code2">清单 2</a>）。
      </p>
		<br />
		<a name="code2">
				<b>清单 2：空 XSLT 样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:stylesheet<br />xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />version="1.0"<br />&gt;<br />&lt;xsl:output method="text"/&gt;<br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个空样式表使用了所有缺省模板规则，其作用是将所有标记从 XML 文件中剥离。我指定文本输出方法，以避免在输出中获得 XML 文本声明。这个脚本可以和任何 XSLT 处理器一起使用：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />$ 4xslt content.xml null.xslt<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>产生下列输出：</p>
		<blockquote>This
new column, Thinking XML, will cover the intersection of XML
andknowledge architecture (KA). Knowledge architecture sounds
likesomething tossed out by a jargon bot, but it's really just an
umbrella termfor some very useful technologies that are emerging now
that XML is enteringits adolescence. Metadata management, semantic
transparency, and autonomousagents are hardly concepts unique to XML,
but the promise of XML to unifythe syntax of structured and
semistructured data
helps turn the next-to-impossibleinto the feasible.</blockquote>
		<p>请注意丢失的空格。看起来 OpenOffice 在依照用户编辑模式标记文档中的样式这方面是相当严格的。下面的行有许多内容：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;text:s/&gt;&lt;text:span text:style-name="T2"&gt;Knowledge architecture&lt;/text:span&gt; sounds<br />like&lt;/text:p&gt;&lt;text:p text:style-name="Standard"&gt;something tossed out by a jargon bot,<br />but it's really just an umbrella term&lt;/text:p&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>（在先前的代码样本中，为了便于阅读，代码从单词之间分隔开来，并在多个行上显示。实际上，该代码是很长的一行。）</p>
		<p>该
文本被划分成多个元素，并且 OpenOffice 按需填充空格。XSLT
处理器不执行相同的补救措施，因此出现了您在上面的输出中所看到的效果。您也可以对几个简单的 XSLT
模板做相同的操作，在元素范围之间添加空格。但是此处的关键是可以用通用工具非常有效地处理这种文件格式。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="h2">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>
在本专栏文章中，我对 OpenOffice 文本文件格式进行了概述，但该项目并不是生成一个文本格式然后就不管它了。OpenOffice
提供了内容丰富的工具箱，用来集成 XML 工具，并且第三方工具的队伍也在日益壮大。这些工具包括 SAX 过滤器、XSLT 插件，甚至包括低级别
Java API。该社区的开发人员已经使用这些工具来增加 OpenOffice 的能力，这些能力包括装入和保存
Docbook、HTML、TeX、纯文本以及 PalmOS 和 PocketPC 所用的文档格式。</p>
		<p>
				<b>XMerge</b>
项目用于在诸如 PDA 和移动电话之类的小型设备上处理 OpenOffice 内容。XMerge 开发工作进展相当迅速，供应商（如
Nokia）已经决定参与该项目。由此可见 OpenOffice
所秉承的开放原则的另一个巨大优势。它鼓励了来自各种广泛来源的贡献，甚至是来源于商业利益，谁都知道开放带来公平竞争，而使用专用格式则相反。
XMerge 使用 XSLT 插件进行文档转换，这也确保了跨平台支持。 </p>
		<p>在 Open Office XML format TC（开放办公 XML
格式技术委员会）（请注意拼写上的差异）中，我们将继续改进这些文件格式，并时刻关注着互操作性的更进一步增强。这是一个带有开放邮件列表的开放过程，任
何 OASIS 成员都可以正式加入。我鼓励所有对管理前台办公文档感兴趣的人都来参与，包括那些倾向于轻松愉快地使用任何他们所熟悉的工具来处理
OpenOffice 文件的人。毕竟，它只是 XML。
</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-think15/index.html">英文原文</a>.
        <br /><br /></li>
				<li>参与本文的
          <a href="javascript:void forumWindow()">论坛</a>。（您也可以单击本文顶部或底部的
          <b>讨论</b>来访问论坛。）
          <br /><br /><br /><br /></li>
				<li>请访问
          <a href="http://www.openoffice.org/">OpenOffice 主页</a>以获取有关用户和开发人员的信息，包括
          <a href="http://www.openoffice.org/dev_docs/source/features.html">特性列表</a>、邮件列表、文档和下载。
          <br /><br /><br /><br /></li>
				<li>跟上
          <a href="http://www.oasis-open.org/committees/office/">OASIS 开放办公 XML 格式技术委员会</a>的进展，并关注关于 Cover Pages 上全面的
          <a href="http://xml.coverpages.org/starOfficeXML.html">OpenOffice.org XML 文件格式新闻</a>。
          <br /><br /><br /><br /></li>
				<li>关于 OpenOffice 如何使用 XML（包括文件格式）的信息，都可以在
          <a href="http://xml.openoffice.org/">XML 项目主页</a>找到，它拥有到文件格式的
          <a href="http://xml.openoffice.org/general.html">详细信息和 DTD</a>、对如何选择包格式
          <a href="http://xml.openoffice.org/package.html">的幕后内容的讨论</a>以及更多内容的链接。
          <br /><br /><br /><br /></li>
				<li>除了
          <a href="http://xml.openoffice.org/package.html">OpenOffice 包格式</a>之外，还有几个 XML 包格式提议。Leigh Dodds 所著的“
          <a href="http://www.xml.com/pub/a/2001/11/21/wrap-yr-app.html">Wrap Your App</a>”上有其它打包格式（包括
          <a href="http://www.topologi.com/public/dzip.html">DZIP/XAR</a>和
          <a href="http://www.ietf.org/internet-drafts/draft-nielsen-dime-02.txt">DIME</a>）的要点。Rich Salz 所著的“
          <a href="http://www.xml.com/pub/a/2002/09/18/ends.html">Brother, Can You Spare a DIME?</a>”中也讨论了 DIME。
          <br /><br /><br /><br /></li>
				<li>
						<a href="http://xml.openoffice.org/xmerge/index.html">XMerge</a>项目是一个优秀的多功能应用程序示例，它构建在 XML 的基本文件格式之上。它包括用于 PDA、移动电话和其它小型设备的过滤器和工具。
          <br /><br /><br /><br /></li>
				<li>阅读 Matt Sergeant 所著的
          <a href="http://www.xml.com/pub/a/2001/02/07/openoffice.html">Adventures with OpenOffice and XML</a>，它讨论了用脚本处理 OpenOffice 文件的工具。尤其是 Perl 用户会发现这篇文章值得一读。
          <br /><br /><br /><br /></li>
				<li>Claude J. Bauer 所著的“
          <a href="http://www.ibm.com/developerworks/library/co-uno.html">Sun's open，componentized OpenOffice productivity suite</a>”大体讨论了 OpenOffice 的起源，以及该项目的一些其它技术方面（
          <i>developerWorks</i>，2001 年 2 月）。
          <br /><br /><br /><br /></li>
				<li>查看 Uche Ogbuji“Thinking XML”专栏的所有
          <a href="http://www.ibm.com/developerworks/xml/library/x-think-xml/">先前的专栏文章</a>。
          <br /><br /><br /><br /></li>
				<li>在 developerWorks
          <a href="http://www.ibm.com/developerworks/xml/">XML</a>专区查找关于本文所涵盖技术的更多信息。
          <br /><br /><br /><br /></li>
				<li>
						<a href="http://www-3.ibm.com/software/info1/websphere/index.jsp?tab=landings/studiosplashv5&amp;origin=x">IBM WebSphere Studio</a>提供了一套使 XML 开发自动化的工具，该工具可以使用 Java 和使用其它语言。它与
          <a href="http://www-3.ibm.com/software/webservers/appserv/">WebSphere Application Server</a>紧密地集成在一起，但也可以与其它 J2EE 服务器一起使用。
          <br /><br /><br /><br /></li>
				<li>找到您如何能够成为
          <a href="http://www-1.ibm.com/certify/certs/adcdxmlrt.shtml&amp;origin=x">IBM 认证的 XML 及相关技术开发人员</a>的信息。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part15/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="Uche Ogbuji 的照片" src="http://www-128.ibm.com/developerworks/cn/i/p-uche.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Uche Ogbuji 是
        <a href="http://fourthought.com/">Fourthought Inc.</a>的顾问和共同创始人，该公司是一家专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了
        <a href="http://4suite.org/">4Suite</a>，这是用于 XML、RDF 和知识管理应用程序的开放源码平台。Ogbuji 先生是出生于尼日利亚的计算机工程师和作家，他目前在美国科罗拉多州博耳德生活和工作。您可以通过
        <a href="mailto:uche.ogbuji@fourthought.com">uche.ogbuji@fourthought.com</a>与 Ogbuji 先生联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<em>
		</em>
<img src ="http://www.blogjava.net/Vencent/aggbug/36744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:50 <a href="http://www.blogjava.net/Vencent/articles/36744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>样式表也能编写样式表:由 XSLT 组件制作 XSLT 样式表</title><link>http://www.blogjava.net/Vencent/articles/36742.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36742.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36742.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36742.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#author">Alan Knox</a>, 软件工程师, IBM<br /></p>
		<p>2001 年  6 月  01 日</p>
		<blockquote>XSLT
样式表可用来动态地将 XML 变换成复杂的浏览器显示标记 --
但如果显示复杂，样式表也复杂。因此需要一种能够从简单组件构建复杂样式表的工具。既然 XSLT 本身就是 XML，因此可以用 XSLT 操纵
XSLT；样式表也能编写样式表。本文演示如何从 XSLT 组件构建一个执行某一特定运行时变换的 XSLT 样式表。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>另一篇 developerWorks 文章
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-multx/index.html">让你的XML适合所有尺寸的屏幕</a>
讨论了编写与管理那些在很多显示设备上显示同一 XML
篮球统计信息的样式表的问题。该解决方案涉及到编写一个参数化的样式表，该样式表生成具有不同等级的数据内容的
HTML，然后使用 WebSphere Transcoding Publisher
将该样式表产生的输出转换成适合于某个特定设备的代码。虽然这对于很多情况来说是一种有效和简单的解决方案，但却丧失了对出现在用户屏幕上的内容的某些控制。
      
      
      </p>
		<p>如果要：</p>
		<ul>
				<li>完全控制用户所见的内容</li>
				<li>调整应用程序的显示，以便在每一种设备上实现最佳的可能的效果</li>
				<li>利用设备的特定特性</li>
		</ul>
		<p>
那么，您必须解决生成无数复杂的样式表的问题。本文演示了一个使用相同篮球
XML 数据的非折衷解决方案。</p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N1005E">
																				<b>什么是样式表？</b>
																		</a>
																		<br />
																		<p>样式表描述文档如何在屏幕上或打印中显示。通过将样式表附加到 Web
上的结构化文档，您可以改变显示，而无需牺牲设备独立性或添加新的 HTML
标记。</p>
																		<p>
																				<b>什么是
XSL？</b>
																				<br />
XSL 是可扩展样式表语言，一种用于表达样式表的语言。（CSS
是另一种功效较弱的样式表语言。）
        
        
        </p>
																		<p>
																				<b>什么是
XSLT？</b>
																				<br />
XSLT 代表 XSL 变换，或用于变换 XML 文档的语言。
        
        
        </p>
																		<p>
																				<b>什么是
XML？</b>
																				<br />
XML 代表用于基于 Web 的文档的可扩展标记语言。可将它看成 SGML
的缩减版。

        
        
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="1">
						<span class="atitle">样式表的难点</span>
				</a>
		</p>
		<p>样式表主要有两类问题：</p>
		<ul>
				<li>
						<b>复杂性</b> -
新的应用程序显示往往需要新的样式表。随着标记语言和新设备的激增，所需的样式表的数量也变得令人生畏。如果使用
XML/XSLT 以外的方法（例如 JavaServer Pages (JSP) 或 JavaBean
体系结构），仍然存在同样程度的复杂性。然而，生成 JSP
的可使用的工具支持目前比支持 XSLT 样式表的工具支持要发达得多。
        
        
        </li>
				<li>
						<b>技能</b> - 除了理解 XML
数据之外，样式表作者还必须深入理解多种显示设备的标记语言。另外，在浏览器中生成在外观吸引人的显示也需要设计技能。而这种技能组合并非轻易可以获得。
        
        
        </li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">解决方案</span>
				</a>
		</p>
		<p>
上述问题可以通过采用基于组件的方法开发样式表来解决。XSLT
是一种声明性语言，其中，构成样式表的模板彼此独立。XSLT
样式表可以使用 
        
        
        <code>import</code> 和 
        
        
        <code>include</code> 
机制由其它样式表构成。只要适当留意，您可以分别开发一些独立的
        
        
        <i>组件样式表</i>，这些组件样式表可以一起构成将在运行期间应用于
XML
数据的
        
        
        <i>显示样式表</i>。这些组件将大致分为三种类型，用于处理：
      
      
      </p>
		<ul>
				<li>显示动态 XML 数据（在我的示例中是篮球数据）</li>
				<li>可重用的显示标记部分，例如按钮栏</li>
				<li>页面残余部分</li>
		</ul>
		<p>下例演示了这种解决方案。</p>
		<p>
				<a name="N100BE">
						<span class="smalltitle">用户界面设计</span>
				</a>
		</p>
		<p>
您可能希望您的 Web 应用程序看上去和感觉起来设计得更专业。布局美观的
HTML 页面往往意味着复杂标记、具有各种嵌入式 HTML
表的安排以及精确的格式化和间距命令。在本文中，我假设已有某个表示下面所示
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/side-design.html">页面设计</a>的静态
HTML。任务是用一个显示样式表重新生成相同的外观和感觉。
      
      
      </p>
		<br />
		<a name="figure">
				<b>目标外观和感觉
</b>
		</a>
		<br />
		<img alt="设计 HTML 图" src="http://www-128.ibm.com/developerworks/cn/xml/i-styles/design.jpg" height="443" width="580" />
		<br />
		<p>虽然这只是一个简单的示例页面，但它也有一些嵌入的 HTML
表。它将只是多个页面中的一个，这些页面显示的数据来自生成 XML
形式的篮球统计信息的应用程序。我将用
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/gt-ncsu-box.xml">篮球 XML</a> 中的数据替换 "Dynamic
data"（动态数据），然后使用 "Navigation
bar"（导航栏）列出从当前页开始的链接。
      
      
      </p>
		<p>
				<a name="N100E1">
						<span class="smalltitle">采取的步骤</span>
				</a>
		</p>
		<p>要生成显示样式表，需要：</p>
		<ol>
				<li>从设计 HTML 制作一个样式表。</li>
				<li>制作一个将篮球得分格式化成 HTML 的样式表。</li>
				<li>将二者合并。</li>
				<li>制作一个生成“导航”栏的 XSLT“窗口小部件”。</li>
				<li>具体化这个窗口小部件，以生成页面的最终样式表。</li>
		</ol>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">从设计 HTML 制作一个样式表</span>
				</a>
		</p>
		<p>我可以只制作一个 XSLT 样式表，然后将 HTML
粘贴到适当位置。然而，当用户界面设计更改时，我希望能相应地快速而轻松地更新显示样式表。一种比较好的解决方案是发明一个可以自动将设计
HTML 转换成样式表的过程。如果设计 HTML 和 XML
一样是有效的（如果不是，可以将它清除），那我就可以用 XSLT
样式表这样做。</p>
		<p>
				<a name="N10105">
						<span class="smalltitle">页面骨架</span>
				</a>
		</p>
		<p>
首先，在设计 HTML 的 
        
        
        <code>&lt;HTML&gt;</code> 标记周围添加 
        
        
        <code>&lt;layout&gt;</code> 元素。
      
      
      </p>
		<br />
		<a name="code">
				<b>带标记的设计 HTML -
        
        
        skeleton.xml
			</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />				&lt;layout match="game"&gt;<br /><br />   &lt;html&gt;<br /><br />      ...<br /><br />   &lt;/html&gt;<br /><br /><br /><br /><br />        &lt;/layout&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这不一定使 HTML 变成样式表，但确实可以让我使用 
        
        
        <code>&lt;layout&gt;</code> 
元素的属性来存储那些有助于推动此过程的信息。例如， 
        
        
        <code>match="game"</code> 
指定了篮球 XML 中的某个元素，我将使用该元素来触发此页面 HTML
的生成。 
        
        
        <code>&lt;layout&gt;</code> 元素内的 HTML
本质上是目标页面的 HTML 模板。因为
        
        
        <i>模板</i>一词在 XSLT
的上下文中有意义，所以，我称它为目标页面的 HTML 
        
        
        <i>骨架</i>。
      
      
      </p>
		<p>
				<a name="N10141">
						<span class="smalltitle">预处理样式表</span>
				</a>
		</p>
		<p>
下面是将 
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/skeleton.xml">skeleton.xml</a>
中的页面骨架转换成样式表的样式表。
      
      
      </p>
		<br />
		<a name="pre-process1-code">
				<b>pre-process.xsl - 第 1 版</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br />&lt;xsl:style sheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"<br /><br /><br /><br /><br />        xmlns:out="http://www.hursley.ibm.com/hsandt/et/compile"&gt;<br /><br /><br /><br />&lt;xsl:output method="xml" indent="yes"/&gt;<br /><br /><br /><br /><br />        &lt;xsl:namespace-alias stylesheet-prefix="out" result-prefix="xsl"/&gt;<br /><br /><br /><br /><br /><br />&lt;!-- template 1 --&gt;<br /><br />&lt;xsl:template match="/layout"&gt;<br /><br /><br /><br /><br />        &lt;out:stylesheet version="1.0"&gt;<br /><br />  &lt;out:output method="html" indent="yes"/&gt;<br /><br />  &lt;out:template match="{@match}"&gt;<br /><br />     &lt;xsl:apply-templates/&gt;<br /><br /><br /><br /><br />        &lt;/out:template&gt;<br /><br />  &lt;/out:stylesheet&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;!-- template 2 --&gt;<br /><br />&lt;xsl:template match="*|text()"&gt;<br /><br />  &lt;xsl:copy&gt;<br /><br />    &lt;xsl:copy-of select="@*"/&gt;<br /><br />    &lt;xsl:apply-templates select="*|text()"/&gt;<br /><br />  &lt;/xsl:copy&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;/xsl:stylesheet&gt;<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>该样式表有两个模板：</p>
		<ul>
				<li>template 1 匹配页面骨架中的 
          
          
          <code>&lt;layout&gt;</code> 
元素，并输出 XSLT 样式表。
        
        
        </li>
				<li>template 2
匹配任何其它元素或文本节点，并只将它匹配的内容不加更改地复制到输出中。</li>
		</ul>
		<p>因为我希望此样式表的输出是一个样式表，所以必须输出 XSLT
语句。但是，XSLT 处理器如何区分要输出的 XSLT 语句和要执行的 XSLT
语句呢？答案是对要复制到输出的 XSLT 语句使用另一个 XML
名称空间。</p>
		<p>在上例中，我定义了一个新的名称空间
( 
        
        
        <code>"http://www.hursley.ibm.com/hsandt/et/compile"</code> )，并将其与名称空间前缀 
        
        
        <code>out</code> 关联。因为带有 
        
        
        <code>out</code> 前缀的 XSLT
语句不在 XSLT ( 
        
        
        <code>"http://www.w3.org/1999/XSL/Transform"</code> )
名称空间中，所以，XSLT
处理器将按我的需要输出它们。但这还不够。我希望输出是正确的样式表，XSLT
进程无需作任何进一步更改就可以执行它。在示例的这一点处，我将获得看起来类似于样式表、而实际上却不是的东西。
      
      
      </p>
		<p>XSLT 用上面所用的 
        
        
        <code>&lt;xsl:namespace-alias&gt;</code> 
元素提供了该问题的解决方案。这将获取 
        
        
        <code>"http://www.hursley.ibm.com/hsandt/et/compile"</code> 
( 
        
        
        <code>out</code> ) 名称空间中的所有内容，并在输出时将它们移到 
        
        
        <code>"http://www.w3.org/1999/XSL/Transform"</code> 
( 
        
        
        <code>xsl</code> ) 名称空间中。
      
      
      </p>
		<p>将 
        
        
        <code>pre-process.xsl</code> 应用到页面骨架的结果看起来类似于：
      
      
      </p>
		<br />
		<a name="pre-process-output">
				<b>从
pre-process.xsl 得到的输出 - 
        
        
        skeleton.xsl
			</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /><br />&lt;out:stylesheet xmlns:out="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br /><br />&lt;out:output indent="yes" method="html"/&gt;<br /><br />&lt;out:template match="game"&gt;<br /><br /><br /><br />&lt;html&gt;<br /><br />   ...  <br /><br />&lt;/html&gt;<br /><br />&lt;/out:template&gt;<br /><br />&lt;/out:stylesheet&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请注意，名称空间前缀仍然是 
        
        
        <code>out</code> 。这并不重要。重要的是名称空间前缀 
        
        
        <code>out</code> 
现在被映射成 XSLT
名称空间： 
        
        
        <code>"http://www.w3.org/1999/XSL/Transform"</code> 。（对
XML 语法分析器很重要的是名称空间，而不是前缀。前缀是使 XML
便于阅读的工具）。某些 XSLT
处理器可以在输出时更改名称空间前缀和名称空间。本文示例所用的 Xalan
XSLT 处理器不更改。
      
      
      </p>
		<p>现在，可以将 
        
        
        <code>skeleton.xsl</code> 
样式表应用到篮球数据。结果由与数据中 
        
        
        <code>&lt;game&gt;</code> 元素的匹配所触发，它与原始
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/side-design.html">设计 HTML</a> 文件是同样的
HTML。目前这还不是很有用，因为在我希望看到比赛得分的地方仍然显示字符串
"Dynamic data"。我需要让 
        
        
        <code>skeleton.xsl</code> 
样式表触发那些在适当位置插入得分的模板。我通过找到写着 "Dynamic
data" 的标记，然后将它替换成 
        
        
        <code>&lt;xsl:apply-templates&gt;</code> 
调用来实现。 
        
        
        <code>skeleton.xml</code> 文件中的以下标记：
      
      
      </p>
		<a name="skeleton1">
		</a>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">...<br /><br />&lt;table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%"&gt;<br /><br />  &lt;tbody&gt;<br /><br />    &lt;tr&gt;&lt;td&gt;&lt;img src="spacer.gif" width="1" height="50"/&gt;&lt;/td&gt;&lt;/tr&gt;<br /><br />    &lt;tr&gt;&lt;td height="100%" align="center" valign="top"&gt;<br /><br /><br /><br /><br />        &lt;h2&gt;Dynamic data&lt;/h2&gt;<br /><br />    &lt;/td&gt;&lt;/tr&gt;<br /><br />  &lt;/tbody&gt;<br /><br />&lt;/table&gt;<br /><br />...<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="skeleton1">
				<br />
		</a>
		<p>
				<a name="skeleton1">变成</a>
		</p>
		<a name="skeleton1">
				<br />
		</a>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">...<br /><br />&lt;table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%"&gt;<br /><br />  &lt;tbody&gt;<br /><br />    &lt;tr&gt;&lt;td&gt;&lt;img src="spacer.gif" width="1" height="50"/&gt;&lt;/td&gt;&lt;/tr&gt;<br /><br />    &lt;tr&gt;&lt;td height="100%" align="center" valign="top"&gt;<br /><br /><br /><br /><br />        &lt;out:apply-templates select="//recap"/&gt;<br /><br />    &lt;/td&gt;&lt;/tr&gt;<br /><br />  &lt;/tbody&gt;<br /><br />&lt;/table&gt;<br /><br />...<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="skeleton1">
				<br />
		</a>
		<p>
				<a name="skeleton1">请注意 
        
        
        <code>out</code> 名称空间前缀；它将导致 XSLT
处理器将元素作为被输出，而不是被执行的事物对待 -- 与上面对 
        
        
        <code>pre-process.xsl</code> 
样式表中的类似元素的描述完全一样。正如您将在下一部分中看到的，我只对篮球数据中的 
        
        
        <code>&lt;recap&gt;</code> 
元素感兴趣，因此，我可以在这里指定选择标准 
        
        
        <code>select="//recap"</code> 。
      
      
      </a>
		</p>
		<a name="skeleton1">
		</a>
		<p>
				<a name="skeleton1">现在，我所拥有的 XSLT 代码能够生成所需的静态 HTML
布局，并可以触发那些插入动态数据的模板。接下来，我需要从篮球 XML
数据抽取数据的 XSLT 模板。</a>
		</p>
		<a name="skeleton1">
				<br />
		</a>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="skeleton1">
				<br />
				<br />
		</a>
		<p>
				<a name="4">
						<span class="atitle">篮球数据样式表</span>
				</a>
		</p>
		<p>
为简便起见，我只生成一个在篮球数据的 
        
        
        <code>&lt;recap&gt;</code> 
元素中找到的得分数据表，如下所示。
      
      
      </p>
		<br />
		<a name="scores-code">
				<b>recap.xsl</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version='1.0'?&gt;<br /><br />&lt;xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'&gt;<br /><br /><br /><br />  &lt;xsl:output method="HTML"/&gt;<br /><br /><br /><br />  &lt;xsl:template match="/"&gt;<br /><br />     &lt;HTML&gt;<br /><br />       &lt;HEAD&gt;<br /><br />           &lt;TITLE&gt;Box Score&lt;/TITLE&gt;<br /><br />        &lt;/HEAD&gt;<br /><br />        &lt;BODY&gt;<br /><br />           &lt;h1&gt;Testing&lt;/h1&gt;<br /><br />           &lt;xsl:apply-templates select="//recap"/&gt;<br /><br />        &lt;/BODY&gt;<br /><br />     &lt;/HTML&gt;<br /><br />  &lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />  &lt;xsl:template match="recap"&gt;<br /><br />     &lt;TABLE border="0" cellpadding="2" cellspacing="1" width="80%"&gt;<br /><br />        &lt;TR&gt;<br /><br />           &lt;TD BGCOLOR="#c80000"&gt;&lt;/TD&gt;<br /><br />           &lt;TD BGCOLOR="#c80000"&gt;<br /><br />             &lt;CENTER&gt;&lt;font color="#FFFFFF"&gt;&lt;B&gt;1st&lt;/B&gt;&lt;/font&gt;&lt;/CENTER&gt;<br /><br />           &lt;/TD&gt;<br /><br />           &lt;TD BGCOLOR="#c80000"&gt;<br /><br />             &lt;CENTER&gt;&lt;font color="#FFFFFF"&gt;&lt;B&gt;2nd&lt;/B&gt;&lt;/font&gt;&lt;/CENTER&gt;<br /><br />           &lt;/TD&gt;<br /><br />           &lt;TD BGCOLOR="#c80000"&gt;<br /><br />             &lt;CENTER&gt;&lt;font color="#FFFFFF"&gt;&lt;B&gt;Total&lt;/B&gt;&lt;/font&gt;&lt;/CENTER&gt;<br /><br />           &lt;/TD&gt;<br /><br />        &lt;/TR&gt;<br /><br />        &lt;xsl:apply-templates/&gt;<br /><br />     &lt;/TABLE&gt;<br /><br />  &lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />  &lt;xsl:template match="recapTeam"&gt;<br /><br />     &lt;TR&gt;<br /><br />        &lt;TD BGCOLOR="#ffe0e0"&gt;&lt;xsl:value-of select="team"/&gt;&lt;/TD&gt;<br /><br />        &lt;TD BGCOLOR="#ffe0e0"&gt;<br /><br />          &lt;CENTER&gt;&lt;xsl:value-of select="firstHalfScore"/&gt;&lt;/CENTER&gt;<br /><br />        &lt;/TD&gt;<br /><br />        &lt;TD BGCOLOR="#ffe0e0"&gt;<br /><br />          &lt;CENTER&gt;&lt;xsl:value-of select="secondHalfScore"/&gt;&lt;/CENTER&gt;<br /><br />        &lt;/TD&gt;<br /><br />        &lt;TD BGCOLOR="#ffe0e0"&gt;<br /><br />          &lt;CENTER&gt;&lt;xsl:value-of select="score"/&gt;&lt;/CENTER&gt;<br /><br />        &lt;/TD&gt;<br /><br />    &lt;/TR&gt;<br /><br />  &lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;/xsl:stylesheet&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>下面的样式表挑选出 XML 片断。</p>
		<br />
		<a name="scores-data">
				<b>篮球 XML 中的 
        
        
        &lt;recap&gt; 元素
      
      
      </b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">...<br /><br />&lt;recap&gt;<br /><br />  &lt;recapTeam&gt;<br /><br />    &lt;team&gt;Georgia Tech&lt;/team&gt;<br /><br />    &lt;firstHalfScore&gt; 21 &lt;/firstHalfScore&gt;<br /><br />    &lt;secondHalfScore&gt; 39 &lt;/secondHalfScore&gt;<br /><br />    &lt;score&gt; 60 &lt;/score&gt;<br /><br />  &lt;/recapTeam&gt;<br /><br />  &lt;recapTeam&gt;<br /><br />    &lt;team&gt;North Carolina State&lt;/team&gt;<br /><br />    &lt;firstHalfScore&gt; 24 &lt;/firstHalfScore&gt;<br /><br />    &lt;secondHalfScore&gt; 48 &lt;/secondHalfScore&gt;<br /><br />    &lt;score&gt; 72 &lt;/score&gt;<br /><br />  &lt;/recapTeam&gt;<br /><br />&lt;/recap&gt;<br /><br />...<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>上面的样式表产生以下输出：</p>
		<p>
				<a name="N10240">
						<span class="smalltitle">Testing</span>
				</a>
		</p>
		<table border="0" cellpadding="2" cellspacing="1" width="80%">
				<tbody>
						<tr>
								<td bgcolor="#c80000">
										<br />
								</td>
								<td align="center" bgcolor="#c80000">
										<b>1st</b>
								</td>
								<td align="center" bgcolor="#c80000">
										<b>2nd</b>
								</td>
								<td align="center" bgcolor="#c80000">
										<b>Total</b>
								</td>
						</tr>
						<tr>
								<td bgcolor="#ffe0e0">Georgia Tech</td>
								<td align="center" bgcolor="#ffe0e0">
21
</td>
								<td align="center" bgcolor="#ffe0e0">
39
</td>
								<td align="center" bgcolor="#ffe0e0">
60
</td>
						</tr>
						<tr>
								<td bgcolor="#ffe0e0">North Carolina State</td>
								<td align="center" bgcolor="#ffe0e0">
24
</td>
								<td align="center" bgcolor="#ffe0e0">
48
</td>
								<td align="center" bgcolor="#ffe0e0">
72
</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">合并两个样式表</span>
				</a>
		</p>
		<p>
现在，我有两个样式表： 
        
        
        <code>skeleton.xsl</code> 和 
        
        
        <code>recap.xsl</code> 。我可以通过将这两个样式表导入到名为 
        
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/runtime.xsl">runtime.xsl</a>
的新样式表非常方便地合并它们。结果如下所示。
      
      
      </p>
		<br />
		<a name="runtime-code">
				<b>runtime.xsl</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version='1.0'?&gt;<br /><br />&lt;xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'&gt;<br /><br /><br /><br />&lt;xsl:import href="recap.xsl"/&gt;<br /><br />&lt;xsl:import href="skeleton.xsl"/&gt;<br /><br /><br /><br />&lt;xsl:template match="/"&gt;<br /><br />  &lt;xsl:apply-templates/&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br />&lt;/xsl:stylesheet&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以在运行期间将该样式表作为 Web 应用程序的一部分应用到篮球 XML
数据。样式表中通过不同 XSLT 模板的流程如下所示：</p>
		<ul>
				<li>首先匹配篮球数据的根节点。 
          
          
          <code>runtime.xsl</code> 中具有 
          
          
          <code>match="/"</code> 的模板具有较高的导入优先权，并覆盖 
          
          
          <code>recap.xsl</code> 中的等价模板。后者只是用于 
          
          
          <code>recap.xsl</code> 
的独立测试中触发其它模板，因此，这就是我想要的行为。XSLT
处理器应用这些模板。
        
        
        </li>
				<li>要匹配的下一个模板是 
          
          
          <code>skeleton.xsl</code> 中具有 
          
          
          <code>match="game"</code> 的模板。它将持续输出
HTML，直到到达要输出得分数据的 
          
          
          <code>&lt;xsl:apply-templates&gt;</code> 元素为止。
        
        
        </li>
				<li>接下来要触发的模板是 
          
          
          <code>recap.xsl</code> 中具有 
          
          
          <code>match="recap"</code> 
的模板。它构建得分表标题行，然后应用模板来匹配用于构建表数据行的 
          
          
          <code>&lt;recapTeam&gt;</code> 元素。
        
        
        </li>
				<li>构建得分表之后，就没有更多要匹配的输入 XML
节点了。此时，控制返回到 
          
          
          <code>match="game"</code> 模板，该模板输出
HTML 的其余部分。
        
        
        </li>
		</ul>
		<p>
现在，我已经实现了具有目标视觉和感觉效果的动态数据部分。下一步是实现导航栏。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">导航栏</span>
				</a>
		</p>
		<p>假设在实际站点上，导航栏在站点上的所有页面中出现，并具有特定于当前页面的标题。在导航栏上有一些从该页出发的固定链接，对于该站点的不同页面，这些链接可能相同，也可能不同。这些链接只取决于当前页面的内容。导航栏不依赖于篮球
XML 数据。</p>
		<p>这一功能的实现与我刚刚对动态数据所执行的操作类似：将 
        
        
        <code>skeleton.xml</code> 文件中 HTML 标记的 "Navigation bar" 部分替换成触发 XSLT 代码的某个标记。然而这一次，XSLT 将不由篮球数据触发，并且我希望用于构建导航栏的所有 XSLT 代码在预处理阶段执行，而不要保留到运行期间。	
      
      
      </p>
		<p>
				<a name="N10307">
						<span class="smalltitle">导航窗口小部件</span>
				</a>
		</p>
		<p>
首先，我将在 
        
        
        <code>skeleton.xml</code> 
文件中希望出现导航栏的位置上放一个标记。我采用以下片断：
      
      
      </p>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;layout match="game"&gt;<br /><br />...<br /><br />&lt;table cellspacing="0" cellpadding="0" border="0" height="100%" width="145"&gt;<br /><br />  &lt;tr&gt;&lt;td&gt;&lt;img src="spacer.gif" width="100" height="100"/&gt;&lt;/td&gt;&lt;/tr&gt;<br /><br />  &lt;tr&gt;<br /><br />    &lt;td align="center" valign="top"&gt;<br /><br /><br /><br /><br />        &lt;font color="white"&gt;&lt;h2&gt;Navigation bar&lt;/h2&gt;&lt;/font&gt;<br /><br />    &lt;/td&gt;<br /><br />  &lt;/tr&gt;<br /><br />&lt;/table&gt;<br /><br />...<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>并将它编辑成：</p>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;layout id="Recap" match="game" <br /><br /><br />        xmlns:widget="http://www.hursley.ibm.com/widget" &gt;<br /><br />...<br /><br />&lt;table cellspacing="0" cellpadding="0" border="0" height="100%" width="145"&gt;<br /><br />  &lt;tr&gt;&lt;td&gt;&lt;img src="spacer.gif" width="100" height="100"/&gt;&lt;/td&gt;&lt;/tr&gt;<br /><br />  &lt;tr&gt;<br /><br />    &lt;td align="center" valign="top"&gt;<br /><br /><br /><br /><br />        &lt;widget:navbar/&gt;<br /><br />    &lt;/td&gt;<br /><br />  &lt;/tr&gt;<br /><br />&lt;/table&gt;<br /><br />...<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>我在这里发明了 
        
        
        <code>navbar</code> 标记，并在新的 
        
        
        <code>widget</code> 
名称空间中指定它。通常，当发明标记来以某种新方式标记已有 XML
时，最好将新标记放在新的名称空间中，以防止可能发生的名称冲突。这样做的更有利的原因是：可以通过在
XSLT 模板中指定 
        
        
        <code>match="widget:*"</code> 
来以类的形式查找和操纵页面骨架中的“窗口小部件”。
      
      
      </p>
		<p>还要注意添加到 
        
        
        <code>&lt;layout&gt;</code> 元素的 
        
        
        <code>id="Recap"</code> 
属性。它标识这个页面骨架应用于哪个特定页面。此信息用于确定在那个页面的导航栏上出现的内容。
      
      
      </p>
		<p>接下来，我编写了一个 XSLT 样式表，该样式表将由 
        
        
        <code>&lt;widget:navbar/&gt;</code> 标记触发，并将该标记替换成正确的 HTML，以形成所期望的页面导航栏。这样的样式表看起来可能类似于下例。
      
      
      </p>
		<br />
		<a name="navbar-code">
				<b>navbar.xsl</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version='1.0'?&gt;<br /><br />&lt;xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'<br /><br />        xmlns:widget="http://www.hursley.ibm.com/widget"&gt;<br /><br /><br /><br />&lt;xsl:template match="/"&gt;<br /><br />  &lt;xsl:apply-templates/&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;xsl:template match="widget:navbar"&gt;<br /><br />  &lt;!-- Get the "id" attribute from the page skeleton &lt;layout&gt; tag --&gt;<br /><br />  &lt;xsl:variable name="page" select="ancestor::layout[1]/@id" /&gt;<br /><br />  &lt;!-- Navigation bar title: --&gt;<br /><br />  &lt;tr&gt;<br /><br />    &lt;td align="center"&gt;<br /><br />      &lt;h2&gt;&lt;font color="white"&gt;&lt;xsl:value-of select="$page"/&gt;&lt;/font&gt;&lt;/h2&gt;<br /><br />    &lt;/td&gt;<br /><br />  &lt;/tr&gt;<br /><br />  &lt;!-- Navigation bar links: --&gt;<br /><br />  &lt;xsl:apply-templates select="document('')//widget:page[@id=$page]"/&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;xsl:template match="widget:page"&gt;<br /><br />  &lt;xsl:apply-templates/&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;xsl:template match="widget:link"&gt;<br /><br />  &lt;tr&gt;<br /><br />    &lt;td align="center"&gt;<br /><br />      &lt;a href="{@to}"&gt;&lt;xsl:value-of select="@title"/&gt;&lt;/a&gt;<br /><br />    &lt;/td&gt;<br /><br />  &lt;/tr&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;!--<br /><br />  A lookup table of navbar links out from each page:<br /><br />--&gt;<br /><br />&lt;widget:linkData&gt;<br /><br /><br /><br />  &lt;widget:page id="Recap"&gt;<br /><br />    &lt;widget:link to="nowhere1" title="Team stats"/&gt;<br /><br />    &lt;widget:link to="nowhere2" title="Player stats"/&gt;<br /><br />    &lt;widget:link to="nowhere3" title="etc."/&gt;<br /><br />  &lt;/widget:page&gt;<br /><br /><br /><br />  &lt;widget:page id="someOther"&gt;<br /><br />    &lt;!-- and so on for the other pages in the application --&gt;<br /><br />  &lt;/widget:page&gt;<br /><br /><br /><br />&lt;/widget:linkData&gt;<br /><br /><br /><br /><br /><br />&lt;/xsl:stylesheet&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>此样式表获取在其中找到 
        
        
        <code>&lt;widget:navbar/&gt;</code> 标记的 
        
        
        <code>&lt;layout&gt;</code> 元素的 
        
        
        <code>id</code> 
属性值，并在查表期间使用该属性作为键，以发现导航栏应该包含哪些源自该页面的链接。然后，构造并返回导航栏的
HTML。
      
      
      </p>
		<p>最后一步是更新 
        
        
        <code>pre-process.xsl</code> 样式表，以利用 navbar 窗口小部件。我需要添加 XSLT 代码，如下所示：
      
      
      </p>
		<br />
		<a name="pre-process2-code">
				<b>pre-process.xsl - 第 2 版</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"<br /><br />        xmlns:out="http://www.hursley.ibm.com/hsandt/et/compile"<br /><br /><br /><br /><br />        xmlns:widget="http://www.hursley.ibm.com/widget"&gt;<br /><br /><br /><br />&lt;xsl:output method="xml" indent="yes"/&gt;<br /><br />&lt;xsl:namespace-alias stylesheet-prefix="out" result-prefix="xsl"/&gt;<br /><br /><br /><br /><br /><br /><br />        &lt;xsl:import href="navbar.xsl"/&gt;<br /><br /><br /><br />&lt;xsl:template match="/layout"&gt;<br /><br />  &lt;out:stylesheet version="1.0"&gt;<br /><br />  &lt;out:output method="html" indent="yes"/&gt;<br /><br />  &lt;out:template match="{@match}"&gt;<br /><br />     &lt;xsl:apply-templates/&gt;<br /><br />  &lt;/out:template&gt;<br /><br />  &lt;/out:stylesheet&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;xsl:template match="*|text()"&gt;<br /><br />  &lt;xsl:copy&gt;<br /><br />    &lt;xsl:copy-of select="@*"/&gt;<br /><br />    &lt;xsl:apply-templates select="*|text()"/&gt;<br /><br />  &lt;/xsl:copy&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br /><br /><br /><br />        &lt;xsl:template match="widget:*"&gt;<br /><br />  &lt;xsl:apply-imports/&gt;<br /><br />&lt;/xsl:template&gt;<br /><br /><br /><br /><br /><br />&lt;/xsl:stylesheet&gt;<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>现在，可以对 
        
        
        <code>skeleton.xml</code> 文件重新运行 
        
        
        <code>pre-process.xsl</code> 样式表，以创建新版的 
        
        
        <code>skeleton.xsl</code> 。 
        
        
        <code>runtime.xsl</code> 中的 
        
        
        <code>&lt;xsl:import&gt;</code> 获得新的 
        
        
        <code>skeleton.xsl</code> 。对篮球数据应用 
        
        
        <code>runtime.xsl</code> 
后产生：
      
      
      </p>
		<p>
				<a name="result">
						<b>
						</b>
				</a>
				<b>
						<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/side-runtime.html" target="_blank">最后的结果</a>
				</b>
				<br />
				<img alt="运行时 HTML 图" src="http://www-128.ibm.com/developerworks/cn/xml/i-styles/runtime.jpg" height="443" width="580" />
		</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="7">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>
runtime.xsl 样式表由其它三个样式表 
        
        
        <code>skeleton.xsl</code> 、 
        
        
        <code>recap.xsl</code> 和 
        
        
        <code>navbar.xsl</code> 得到。构建这三个样式表所需的技能如下：
      
      
      </p>
		<ul>
				<li>通过对 
          
          
          <code>skeleton.xml</code> 文件应用自动过程来构建 
          
          
          <code>skeleton.xsl</code> 。从静态 HTML 构建 
          
          
          <code>skeleton.xml</code> 文件非常简单，无需任何特殊的 XML 或 XSLT
技能。HTML 需要 Web 设计技能。
        
        
        </li>
				<li>
						<code>recap.xsl</code> 需要有关的 XSLT 和应用 XML
的知识。它输出一些 HTML 标记，但不需要太多 HTML 技能，因为静态 HTML
可能包括一个样本数据表（它将全面指定表单元颜色、边框宽度等），而不是
"Dynamic data" 字符串。
        
        
        </li>
				<li>
						<code>navbar.xsl</code> 需要 XSLT
知识，并且在更现实的示例中，可能还需要深入了解目标标记语言。
        
        
        </li>
		</ul>
		<p>可以仔细地说明、开发和单独地测试样式表。生成动态数据的样式表和生成显示的样式表之间是有区别的。虽然 XSLT 程序员们需要同时理解显示标记和基本的商业 XML，但对于单独的 XSLT 程序员来说，无需同时理解二者。在本例的三个样式表中，技术要求最高的是 
        
        
        <code>navbar.xsl</code> ，但不管怎样，编写可重用的 XSLT 组件正是您施展才华的所在。
      
      
      </p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N103FF">
																				<b>When to use sidebars</b>
																		</a>
																		<br />
																		<p>请记住，在运行期间也要管理生成的样式表，并确保对每个给定请求，都应用了正确设备的正确样式表。</p>
																		<p>
																				<a href="http://www-306.ibm.com/software/pervasive/transcoding_publisher/">IBM WebSphere Transcoding Publisher</a>
可以替您这样做，这样，应用程序的 XSLT
变换在逻辑上（如果您愿意，也可以在物理上）就与产生 XML
的商业逻辑分隔开。

        
        
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="N10410">
						<span class="smalltitle">更进一步</span>
				</a>
		</p>
		<p>
				<code>pre-process.xsl</code> 
样式表独立于它所处理的页面骨架文件中的标记语言。在生成其它设备（例如，用于
WAP 电话的 WML
deck）的标记时，也可以应用完全相同的技术。创建新的窗口小部件只需编写一个适当的
XSLT 样式表，然后将一个 
        
        
        <code>&lt;import&gt;</code> 
元素添加到 
        
        
        <code>pre-process.xsl</code> 即可。
      
      
      </p>
		<p>随着要支持的页面骨架和窗口小部件数目的增加，管理和操纵所有这些组件的问题也随之成倍增加，因此需要一些工具来管理这种复杂的局面。但是，因为每个组件都是 XML，所以，这些工具本身也可以使用 XML。可以将页面骨架和窗口小部件存储在关系数据库中，并使用 
        
        
        <code>document()</code> 函数从 XSLT 访问它们。在构建这种开发工具方面，具有 Java API 的 XSLT 处理器（例如 Xalan）将特别有用。	
      
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          
          <a href="http://www.ibm.com/developerworks/library/i-styles/index.html">英文原文</a>.
        
        
        <br /><br /></li>
				<li>要下载本文所讨论的文件：

          
          
          <ul><li>HTML 页面设计：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/side-design.html">design.html</a>、
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/WolfpackBasketball.png">WolfpackBasketball.png</a>和
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/spacer.gif">spacer.gif</a></li><li>页面骨架：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/skeleton.xml">skeleton.xml</a></li><li>导航栏 XSLT 组件：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/navbar.xsl">navbar.xsl</a></li><li>预处理器 XSLT 样式表：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/pre-process.xsl">pre-process.xsl</a></li><li>对 
              
              
              <code>skeleton.xml</code> 运行 
              
              
              <code>pre-process.xsl</code> 
得到的 XSLT 样式表：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/skeleton.xsl">skeleton.xsl</a></li><li>篮球数据的源 XML 文件：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/gt-ncsu-box.xml">gt-ncsu-box.xml</a></li><li>抽取篮球得分的 XSLT 样式表：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/recap.xsl">recap.xsl</a></li><li>将在运行期间应用到篮球数据的 XSLT 样式表：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/runtime.xsl">runtime.xsl</a></li><li><code>runtime.xsl</code> 的 HTML 输出：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/side-runtime.html">runtime.html</a></li><li>包含所有文件的包：
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/files.zip">files.zip</a></li></ul><br /></li>
				<li>有关使用 XML 的信息，请参考 developerWorks
          
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/index.html">XML 专区</a>和
          
          
          <a href="http://www.w3.org/XML/">W3C Architecture domain</a>。
        
        
        <br /><br /></li>
				<li>有关相关主题的其它 developerWorks 文章：

          
          
          <ul><li><a href="http://www.ibm.com/developerworks/ibm/library/ibm-extend/?dwzone=ibm">
Extending the reach of your applications: A simple example using
IBM WebSphere Everyplace Suite</a></li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/index.html">改进 XSLT
编码的五种方法</a></li><li><a href="http://www.ibm.com/developerworks/ibm/library/j-dynxml.html?dwzone=ibm">
Generate dynamic XML using JavaServer Pages technology</a></li><li><a href="http://www.ibm.com/developerworks/ibm/library/i-multx/?dwzone=ibm">
Spinning your XML for screens of all sizes</a></li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/index.html">XSLT
是什么类型的语言？</a></li><li>Abstracting the Interface，
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract/index.html">第 1 部分</a>和
              
              
              <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/index.html">第 2
部分</a></li><li>更多的
              
              
              <a href="http://www.ibm.com/developerworks/ibm/?article=dr">开发者园地</a>资源。
            
            
            </li></ul><br /></li>
				<li>有关 XSLT 的信息，请参阅：

          
          
          <ul><li><a href="http://www.w3.org/Style/XSL">W3C User Interface
domain</a>。
            
            
            </li><li><i>XSLT Programmer's Reference</i>（Michael Kay 著，
              
              
              <a href="http://www.wrox.com/">Wrox
Press</a>，2000）为程序员提供了非常有用的 XSLT
语言讨论和参考信息。
            
            
            </li></ul><br /></li>
				<li>有关开放源码 Xalan XSLT 处理器的信息，请造访
          
          
          <a href="http://xml.apache.org/xalan/overview.html">Apache
开放源码站点</a>。
        
        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/i-styles/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="author" src="http://www-128.ibm.com/developerworks/cn/xml/i-styles/p-alanknox.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Alan Knox 是英国汉普郡 Hursley
Park 的一名 IBM 软件工程师。Alan 于 1997 年从 Civil Service 跳槽到
IBM。从那时起，他参与了一些使现有 Web 应用程序适用于交互式电视和
WAP 电话的项目。可以通过 
        
        <a href="mailto:knox@uk.ibm.com">knox@uk.ibm.com</a> 与 Alan
联系</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:49 <a href="http://www.blogjava.net/Vencent/articles/36742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用XML/HTC/DHTML模拟标准Windows菜单</title><link>http://www.blogjava.net/Vencent/articles/36743.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36743.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36743.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36743.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-winmenu/#author">刘 筱</a>
				<br />
		</p>
		<p>2002 年  4 月  01 日</p>
		<blockquote>随
着internet的发展，XML作为一种跨平台的通用结构化数据描述语言越来越得到人们的重视，并已经得到了广泛应用，如MicroMedia公司出品
的Dreamweaver、Flash以及游戏抢滩登录等软件都利用了XML文件作为数据存储方式，而且Microsoft.NET也是架构在XML上面
的。目前出现的取代HTML语言的下一代网页制作语言XHTML（可扩展超文本标记语言），就是建立在XML基础上，因此掌握XML技术是未来网页制作者
必备技能。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>本文通过一个模拟标准Windows菜单程序来介绍有关XML技术应用。</p>
		<p>
				<a name="N1003C">
						<span class="atitle">程序原理</span>
				</a>
		</p>
		<p>
考虑到层叠菜单复杂性，为使程序简化，只模拟到二级子菜单。下面我们来看看标准windows菜单过程：鼠标移入菜单时突出显示，移出时回复原状，点击则
菜单凹陷显示并打开子菜单，鼠标点击子菜单则完成相应功能。当子菜单打开后移动鼠标，则移入菜单凹陷显示并打开相应子菜单，移出菜单则回复原状并隐藏相应
子菜单，若鼠标并不是移动到另外菜单而是在页面其它地方，则移出菜单仍凹陷显示，相应子菜单也不隐藏，只有当在非菜单处点击时才恢复原状并隐藏子菜单。标
准Windows菜单一个重要特点就是子菜单打开后，在鼠标移出菜单时并不隐藏或者在文档中非菜单处任意单击时才隐藏。目前很多网页菜单程序都做不到这
点，一般都是移入菜单时打开子菜单，移出菜单时隐藏子菜单。采用IE5.0中新提供的鼠标捕获技术就可以完全解决这个问题。所谓鼠标捕获，就是与鼠标相关
的所有事件都由设定鼠标捕获的对象进行处理，而无论这些事件是否由该对象触发。</p>
		<p>由于xml文档非常适合描述结构化数据，故我们使用xml文档存储菜单及一级子菜单的有关信息。</p>
		<p>为
便于在其它页面使用模拟标准Windows菜单，我们并不使用代码功能重用性能比较差的外部脚本包含文件方法，而是采用IE
5.0新引入的DHTML行为(Behavior)技术将菜单功能代码封装在一个HTML 行为组件(HTC)内。
HTML行为组件封装了页面上特定的功能或动作，当把某个行为组件附加到页面上的标准HTML元素(对象)时，将增强该元素(对象)的默认功能，使得该元
素(对象)含有行为的属性、方法或事件，这使代码重用变得十分容易，并简化了页面的HTML代码，提高了页面的可管理性。</p>
		<p>因篇幅所限，有关xml文档及HTML行为组件的更多细节请参阅有关资料，本文不予详述。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-winmenu/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1004E">
						<span class="atitle">程序实现</span>
				</a>
		</p>
		<p>
		</p>
		<p>
				<a name="N10056">
						<span class="smalltitle">1.主页面(index.htm)</span>
				</a>
		</p>
		<p>我
们首先在主页面中定义充当菜单容器的Div元素，并使用CSS中的behavior属性附加行为组件(Menu.htc)，这样就可以使用元素扩充的属性
xmlsrc来指定存储菜单信息的数据文件(Menu.xml)以及使用onMenuClick来捕获组件触发的新事件并调用相应事件处理函数。</p>
		<p>此外为简化程序，在主页面中定义了突出(Up_Menu)、凹陷(Dn_Menu)、原状(Menu)三种菜单外观样式，在实际应用时应在组件中定义菜单显示外观，这样更符合组件开发原则。</p>
		<p>
				<a name="N10062">
						<span class="smalltitle">2.菜单组件(Menu.htc)</span>
				</a>
		</p>
		<p>模
拟标准Windows菜单的功能主要由菜单组件提供。菜单由以下Html元素组成：充当菜单容器的Div元素(在主页面定义)、用于一级菜单项的span
元素(初始化菜单时创建)、包含二级菜单项的Div元素(单击一级菜单时建立)、二级菜单项的Div元素(单击一级菜单时建立)。在该组件中定义了用于指
定菜单数据文件的xmlsrc属性、点击二级菜单时触发的onMenuClick事件。</p>
		<p>当主页面解析完毕后触发
ondocumentready事件，组件捕获这个事件并调用事件处理MenuInit()函数初始化一级菜单。当触发鼠标事件时，如
onmouseover、onmouseout、onmouseclick等，组件将分别捕获这些事件并调用相应的事件处理函数MenuOver()、
MenuOut()、MenuClick()。在这些处理函数中首先通过Event.srcElement属性确定触发事件的对象，然后依据对象type
类型(如parentMenu、subMenu或其它)分别做相应处理，如更改菜单显示外观、打开或隐藏子菜单、触发新事件等。</p>
		<p>在
一级菜单触发有关鼠标事件后，打开二级菜单并通过setCapture()方法对一级菜单对象设置鼠标捕获。此后所有在该菜单或者文档任意位置触发的
onmouseover、onmouseout、onmouseclick鼠标事件都由该菜单对象负责处理，但event.srcElement属性仍是
触发鼠标事件的对象而不是设置鼠标捕获的对象。当在二级子菜单或文档中非菜单处任意单击时，隐藏二级菜单并通过releaseCapture()方法释放
鼠标捕获。</p>
		<p>单击二级菜单时，其事件处理函数onmouseclick通过createEventObject方
法创建一个event(事件)对象，再通过fire方法触发新事件，并利用event对象的有关属性传递信息(如event.menuId返回所选定的菜
单ID)，然后由容器捕获这个事件，并调用相应事件处理函数HanderSubMenu ()。在主页面中定义函数HanderSubMenu
()能够使菜单组件更具通用性。</p>
		<p>
				<a name="N10074">
						<span class="smalltitle">3.菜单数据文件(Menu.xml)</span>
				</a>
		</p>
		<p>Item节点存储一级菜单信息，SubItem节点存储二级菜单信息，每个节点都含有两个属性：value(菜单ID)、name(菜单名称)。</p>
		<p>该程序必须在IE5.0及以上版本浏览器运行，运行结果如图。怎么样？象不象标准Windows菜单。</p>
		<br />
		<a name="N10082">
				<b>附：模拟标准Windows菜单源代码(在Win98+IE5.0下通过)</b>
		</a>
		<br />
		<img alt="附：模拟标准Windows菜单源代码(在Win98+IE5.0下通过)" src="http://www-128.ibm.com/developerworks/cn/xml/x-winmenu/fig1.gif" height="316" width="305" />
		<br />
		<br />
		<br />
		<a name="N10091">
				<b>index.htm文件：</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;Html&gt;<br />&lt;Head&gt;<br />&lt;Title&gt;菜单组件示例&lt;/Title&gt;<br />&lt;style&gt;<br />&lt;!--<br />.Menu{ border-top:2 solid #CCCCCC;border-bottom:1 solid #CCCCCC;border-left:2 solid #CCCCCC;<br />			border-right:1 solid #CCCCCC; }<br />.Up_Menu { border-top:2 outset;border-left:2 outset;border-right:1 outset #FFFFFF;<br />			border-bottom:1 outset #FFFFFF; background-color:#CCCCCC; }<br />.Dn_Menu{ border-top:2 inset ;border-left:2 inset ;border-right:1 inset ;border-bottom:1 inset ;<br />			background-color:#CCCCCC; }<br />--&gt;<br />&lt;/style&gt;<br />&lt;script&gt;<br />function HanderSubMenu(){//选择子菜单后相应处理<br />  switch(event.menuId){<br />    case event.menuId:<br />      alert(event.menuId);<br />      break;<br />  }<br />}<br />&lt;/script&gt;<br />&lt;/Head&gt;<br />&lt;Body style="background-color:#CCCCCC;"&gt;<br />&lt;TABLE style="font-size:12px;"&gt; <br />  &lt;TBODY&gt;&lt;TR height="10" &gt;<br />    &lt;TD Align="center" height=25 style="border-top:2px groove;border-bottom:2px groove;"&gt;<br />      &lt;div id="Menu" style="behavior:url(Menu.htc)" xmlsrc="Menu.xml" onMenuClick="HanderSubMenu()"&gt;&lt;/div&gt; <br />    &lt;/TD&gt;                   <br />  &lt;/TR&gt;<br />  &lt;/TBODY&gt;<br />&lt;/TABLE&gt;<br />&lt;/Body&gt;<br />&lt;/Html&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="N1009D">
				<b>Menu.htc文件：</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;PUBLIC:COMPONENT&gt;<br />&lt;PUBLIC:PROPERTY Name="xmlsrc" PUT="putxmlsrc"/&gt;<br />&lt;PUBLIC:EVENT Name="onMenuClick" ID="menuClick" /&gt;<br />&lt;PUBLIC:ATTACH EVENT="ondocumentready" For="element" ONEVENT="MenuInit()" /&gt;<br />&lt;PUBLIC:ATTACH EVENT="onmouseover"  for="element" ONEVENT="MenuOver()" /&gt;<br />&lt;PUBLIC:ATTACH EVENT="onmouseout" for="element" ONEVENT="MenuOut()" /&gt;<br />&lt;PUBLIC:ATTACH EVENT="onclick"  for="element" ONEVENT="MenuClick()" /&gt;<br />&lt;Script language="JavaScript"&gt;<br />var xmldoc=null;// xml文档对象变量<br />var activeMenu=null;//打开子菜单的父菜单对象变量<br />var menuContainer=null;//包含子菜单项容器对象变量<br />function putxmlsrc(str){//载入菜单数据文件<br />  xmldoc= new ActiveXObject("Microsoft.XMLDOM");//创建xml文档对象<br />  xmldoc.async=false;<br />  xmldoc.load(str);//载入菜单数据<br />}<br />function MenuInit(){//初始化菜单<br />  var parentMenuItems = xmldoc.selectNodes("//Itemlist/Item"); //读取一级菜单数据    <br />  var xmlElement = parentMenuItems.nextNode(); <br />  var newElement;     <br />  while (xmlElement != null){     <br />    newElement = document.createElement("span"); //创建菜单元素<br />    newElement.type = "parentMenu";    <br />    with (newElement){<br />      innerHTML = xmlElement.getAttribute("name"); <br />      id=xmlElement.getAttribute("value"); <br />      className="Menu";      <br />    }     <br />    with (newElement.style){     <br />      position="relative";<br />      width= 60;<br />      cursor="default";<br />    }     <br />    element.appendChild(newElement); //element指附加行为的元素     <br />    xmlElement = parentMenuItems.nextNode();       <br />  }<br />}<br />function MenuOver(){<br />  var EventSource=event.srcElement;//捕获触发事件的对象<br />  switch(activeMenu){//判断子菜单是否存在<br />    case null://不存在子菜单<br />      if(EventSource.type=="parentMenu")EventSource.className="Up_Menu";<br />      break;<br />    default:<br />      switch(EventSource.type){//判断触发事件对象类型<br />        case  "parentMenu"://移入到一级菜单<br />          if(activeMenu!=EventSource){//判断是否移入到新一级菜单<br />            removeSubMenu();//删除原有子菜单<br />            buildSubMenu(EventSource.id);//建立新子菜单<br />            EventSource.setCapture();//对新菜单设置鼠标捕获<br />            activeMenu.className="Menu";<br />            activeMenu=EventSource; //更新打开子菜单的父菜单对象变量<br />            activeMenu.className="Dn_Menu";<br />            }<br />          break;<br />        case "subMenu"://移入到子菜单<br />          EventSource.style.color="#FF0000";<br />          EventSource.style.textDecoration="underline";<br />          break;<br />      }<br />      break;<br />  }<br />}<br />function MenuOut(){<br />  EventSource=event.srcElement         <br />  switch(activeMenu){<br />    case null:<br />      if(EventSource.type=="parentMenu")EventSource.className="Menu";<br />      break;<br />    default:<br />      if(EventSource.type=="subMenu"){<br />        EventSource.style.color="#000000";<br />        EventSource.style.textDecoration="none";<br />      }<br />      break;<br />  }<br />}<br />function MenuClick(){<br />  EventSource=event.srcElement<br />  switch(EventSource.type){<br />    case "parentMenu":<br />      if(activeMenu!=EventSource){<br />        removeSubMenu();<br />        buildSubMenu(EventSource.id);<br />        EventSource.setCapture();<br />        EventSource.className="Dn_Menu";<br />        activeMenu=EventSource;<br />      }<br />      break;<br />    case "subMenu":<br />      removeSubMenu();<br />      activeMenu.className="Menu";<br />      activeMenu.releaseCapture();//释放鼠标捕获设置<br />      activeMenu=null;<br />      var eventObject = createEventObject();//创建事件对象<br />      eventObject.menuId = EventSource.id;//通过事件对象属性传递所选子菜单ID<br />      menuClick.fire(eventObject);//将事件触发到容器页面<br />      break;  <br />    default:<br />      removeSubMenu();<br />      if(activeMenu!=null){<br />        activeMenu.releaseCapture();<br />        activeMenu.className="Menu";<br />        activeMenu=null;<br />       } <br />      break;<br />  } <br />}<br />function buildSubMenu(EventSourceid){//建立子菜单<br />  menuContainer = document.createElement("div");<br />  with (menuContainer.style){ <br />    position="absolute";<br />    left=0;<br />    top=15;<br />    color="#000000";<br />    cursor="default";<br />  }<br />  eval(EventSourceid).appendChild(menuContainer);<br />  var subMenuItems = xmldoc.selectNodes("//Item[@value='"+EventSourceid+"']/SubMenu");<br />  var xmlElement = subMenuItems.nextNode();  <br />  var newElement;<br />  while (xmlElement != null){      <br />    newElement = document.createElement("div");      <br />    newElement.type = "subMenu";<br />    with (newElement){      <br />      innerHTML ="□ "+xmlElement.getAttribute("name");      <br />      id=xmlElement.getAttribute("value");<br />    }      <br />    with (newElement.style){<br />      width=75;<br />      height=18;<br />    }      <br />    menuContainer.appendChild(newElement);<br />    menuContainer.className="Up_Menu";       <br />    xmlElement = subMenuItems.nextNode();        <br />  }<br />}<br />function removeSubMenu(){//删除子菜单<br />  if(menuContainer!=null)menuContainer.removeNode(true);<br />}<br />&lt;/Script&gt;<br />&lt;/Component&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="N100A9">
				<b>Menu.xml文件：</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0" encoding="gb2312" ?&gt;//xml处理指令指明为中文编码,若不指明则不支持中文<br />&lt;Itemlist&gt;<br />  &lt;Item value="file" name="文件" &gt; <br />    &lt;SubMenu value="New" name="新建"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Open" name="打开"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Save" name="保存"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Print" name="打印"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Exit" name="退出"&gt;&lt;/SubMenu&gt;<br />  &lt;/Item&gt; <br />  &lt;Item value="Edit" name="编辑" &gt;<br />    &lt;SubMenu value="Cut" name="剪切"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Copy" name="复制"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Paste" name="粘贴"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="Del" name="删除"&gt;&lt;/SubMenu&gt;<br />  &lt;/Item&gt;<br />  &lt;Item value="Help" name="帮助"&gt;<br />    &lt;SubMenu value="Topic" name="主题"&gt;&lt;/SubMenu&gt;<br />    &lt;SubMenu value="About" name="关于"&gt;&lt;/SubMenu&gt;<br />  &lt;/Item&gt;<br />&lt;/Itemlist&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<br />
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-winmenu/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-winmenu/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>刘筱，对Dhtml、Xml有浓厚兴趣，在中国《微电脑世界》发表有关Dhtml应用文章多篇。可以通过
        <a href="mailto:liuswin@hotmail.com">liuswin@hotmail.com</a>与作者联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:49 <a href="http://www.blogjava.net/Vencent/articles/36743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML 问题: GUI 和 XML 配置数据，第 2 部::Mozilla 项目和 XUL</title><link>http://www.blogjava.net/Vencent/articles/36741.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36741.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36741.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36741.html</trackback:ping><description><![CDATA[
		<p>级别: 中级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#author">David Mertz</a>, Browser, Gnosis Software, Inc.<br /></p>
		<p>2004 年  5 月  26 日</p>
		<blockquote>David
继续关于如何在 GUI 界面配置中使用 XML 的话题。他考察了 Mozilla 基于 XML
的用户界面语言（XUL），这种语言编写的应用程序完全不依赖所选择的底层操作系统。初看起来这似乎有点奇怪，但很快您就会看到该 Mozilla
项目为构建 GUI 提供了非常强大的工具，允许您开发范围广泛的用户界面。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>在开始讨论那些并非所有
读者都熟悉的缩写字符串和奇怪的名词之前，我首先简要地介绍一些基础知识。简单地讲，Mozilla 所要做的就是呈现 XML 和
HTML——如此而已。在 Mozilla 中，您习以为常的所有 Web 浏览器控件（后退按钮、URL
文本框、书签、菜单等等）以及任何内容区域，都只是一些 XUL（XML-based User Interface Language，基于 XML
的用户界面语言）或者 HTML 数据的呈现。阅读新闻、邮件、聊天记录或编辑 HTML 的 Mozilla 应用程序同样如此——全部都只是呈现
XML。Mozilla 在其默认应用程序中提供了一组 <b>chrome</b>（非文档部件/控件），但是该框架允许通过编写少量的 XUL XML 创建您自己的应用程序，或者扩展 Mozilla 提供的应用程序。

      </p>
		<p>整
个 Mozilla 应用程序包和相关的附件（如 Firefox 和 Thunderbird），其核心就是用 XUL 编写的，XUL
是一种用于定义用户界面的 XML 语言。整个 Mozilla 项目划分成几层。最底层是 Gecko Runtime
Engine，它负责在屏幕上呈现可视化元素，即 HTML 标签和相关的属性、子元素以及 URL 引用的资源。很多 Mozilla 应用程序使用
XPToolkit 作为下一层，就是这一层上支持 XUL；但是一些应用程序喜欢使用 Mac OS X 上的 Camino
浏览器代替本地部件，作为 Gecko 引擎的界面。
</p>
		<p>当然如果没有程序逻辑，应用程序就做不了多少工作。只需要使用 JavaScript
处理程序逻辑，就可以编写完整的 Mozilla 应用程序——每个 XUL 控件激活一些配置好的 JavaScript
函数，可能还需要根据那个控件传递参数。（像文本字段、选择列表或者滚动条这样的控件还用于选择特定的值，而不仅仅是触发单个动作。）但是对于更高级的应
用程序，跨平台组件对象模块（
Cross Platform Component Object Module，XPCOM）接口提供了一种方式，让 XUL
配置的界面调用其他编程语言编写的组件——主要是使用 C++ 编写的组件，但是其他编程语言如 Python 也提供了 XPCOM
绑定。XPCOM 类似于 Windows 中的 COM，或者 CORBA。
</p>
		<p>现在我已经描述了开发 Mozilla 界面的总体框架（XUL 调用
JavaScript，JavaScript 可以通过 XPCOM 调用 C++ 组件），本文后面将专门讨论这一庞杂体系中和 XUL
有关的那一部分，毕竟这是一个关于 XML 的专栏。例子中调用的 JavaScript <code>alert()</code> 函数没有多少意义，调用自定义功能的实用应用程序可以代之以其他函数。

      </p>
		<p>
				<a name="N10068">
						<span class="atitle">一个小小的应用程序</span>
				</a>
		</p>
		<p>为了让您领略 XUL 代码，我编写了一个定制的 Mozilla 应用程序 
        <code>SimpleApp</code> ，它包括一个 XUL 文件 
        <code>SimpleApp.xul</code> 和一个外部 JavaScript 文件 
        <code>SimpleApp.js</code> 。这个应用程序仅仅在屏幕上显示几个菜单和工具栏按钮，剩下的空间显示 HTML 文档。 
        <code>SimpleApp</code> 中配置的大部分动作仅仅是弹出一些警告框，但也有一个工具栏按钮允许选择要显示的 HTML 文档 URL。在 HTML 区域中可以像在普通浏览器中那样导航：单击链接、填写表单以及完成其他操作。
      </p>
		<p>首先，看一看如何选择 HTML URL：</p>
		<br />
		<a name="fig1">
				<b>图 1. 在 SimpleApp 中选择 URL</b>
		</a>
		<br />
		<img alt="在 SimpleApp 中选择 URL" src="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/SimpleAppToolbar.jpg" height="303" width="600" />
		<br />
		<p>
				<code>SimpleApp</code> 使用了几种不同类型的菜单。对于实际的应用程序这可能并非最好的设计，但是我想同时说明如何使用由 
        <code>&lt;menubar&gt;</code> 标签创建的本地菜单，以及用 
        <code>&lt;menulist&gt;</code> 标签创建的 XUL 菜单。后一种菜单可以出现在应用程序中的任何位置，包含在嵌套区域中，或者作为弹出菜单附加到可视化内容上。但是，XUL 也允许使用 
        <code>&lt;menupopup&gt;</code> 创建系统风格的弹出菜单，本例中没有说明这种菜单（系统风格的菜单通过右击鼠标或者按住 Shift 键单击鼠标来激活，通常 
        <code>&lt;menulist&gt;</code> 附加在框架中显示的文本上。
      </p>
		<p>图 2 说明如何从本地 Mac OS X 菜单激活警告框：</p>
		<br />
		<a name="fig2">
				<b>图 2. SimpleApp 中的本地菜单</b>
		</a>
		<br />
		<img alt="SimpleApp 中的本地菜单" src="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/SimpleApp.jpg" height="328" width="598" />
		<br />
		<p>
				<code>Foo</code> 和 
        <code>Bar</code> 就像是带有子项的普通下拉菜单，尽管在截屏图像中没有显示出来。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100CB">
						<span class="atitle">观察 XUL</span>
				</a>
		</p>
		<p>现在来看一看组成 
        <code>SimpleApp</code> 的 XUL。像多数应用程序一样，它的根元素是 
        <code>&lt;window&gt;</code> 。但是，仅用于增强已有应用程序如 Mozilla 浏览器功能的实用程序，根元素应该是 
        <code>&lt;overlay&gt;</code> 。一个应用程序可以包含多个覆盖图。
      </p>
		<p>我把这个 XUL 文件分解成几部分，每一部分都有明确的功能。如果需要可以把各部分合并起来。</p>
		<br />
		<a name="code1">
				<b>清单 1. SimpleApp.xul 头和脚本</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;?xml-stylesheet href="chrome://global/skin/xul.css" type="text/css"?&gt;<br />&lt;!DOCTYPE window&gt;<br />&lt;window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"<br />        xmlns:html="http://www.w3.org/1999/xhtml"<br />        width="600" height="280"<br />        title="SimpleApp"&gt;<br />  &lt;script src="SimpleApp.js" /&gt;<br />  &lt;script type="application/x-javascript"&gt;<br />    &lt;![CDATA[ function say(txt) { alert(txt); } ]]&gt;<br />  &lt;/script&gt;<br />  &lt;script type="application/x-javascript"&gt;<br />    &lt;![CDATA[<br />      function newcontent(url) {<br />        frames['content'].location.href=url; } ]]&gt; <br />  &lt;/script&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>外部文件 
        <code>SimpleApp.js</code> 仅仅定义了一个简单的 JavaScript 函数 
        <code>eye()</code> ，它被那个带有眼睛图标的工具栏按钮激活。在实际的应用程序中，很可能要把必要的 JavaScript 函数库放在这类外部文件中。我还在 XUL 文件的正文部分定义了两个简单的 JavaScript 函数。
      </p>
		<br />
		<a name="code2">
				<b>清单 2.  SimpleApp.xul 系统菜单配置</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;menubar id="main-menu"&gt;<br />    &lt;menu label="File"&gt;<br />      &lt;menupopup&gt;<br />        &lt;menuitem label="Hello" oncommand="say('Hello world!');"/&gt;<br />      &lt;/menupopup&gt;<br />    &lt;/menu&gt;<br />  &lt;/menubar&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在清单 2 中， 
        <code>SimpleApp</code> 定义的 
        <code>File</code> 菜单包含一个子菜单项 
        <code>Hello</code> 。
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#fig2">图 2</a>显示了激活该菜单时的情景。
      </p>
		<p>现在看一看窗口内容是如何安排的：</p>
		<br />
		<a name="code3">
				<b>清单 3. SimpleApp.xul 布局框和菜单列表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;vbox&gt;<br />    &lt;hbox&gt;<br />      &lt;menulist&gt;&lt;label&gt;Foo&lt;/label&gt;<br />        &lt;menupopup&gt;<br />          &lt;menuitem label="New SimpleApp"<br />                    oncommand="window.open('SimpleApp.xul','','chrome');"/&gt;<br />          &lt;menuitem label="Something Else"<br />                    oncommand="window.open('test3.xul','','chrome');"/&gt;<br />        &lt;/menupopup&gt;<br />      &lt;/menulist&gt;<br />      &lt;menulist&gt;&lt;label&gt;Bar&lt;/label&gt;<br />        &lt;menupopup oncommand="alert('Menu item invoked.')"&gt;<br />          &lt;menuitem label="Item One"/&gt;<br />          &lt;menuitem label="Item Two"/&gt;<br />          &lt;menuitem label="Item Three"/&gt;<br />        &lt;/menupopup&gt;<br />      &lt;/menulist&gt;<br />    &lt;/hbox&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>控制 XUL 空间几何形状很有用的一种办法是将其放在以下几种不同的框中：</p>
		<ul>
				<li>
						<code>&lt;vbox&gt;</code> 和 
          <code>&lt;hbox&gt;</code> （常常一起使用）
        </li>
				<li>
						<code>&lt;scrollbox&gt;</code>
				</li>
				<li>
						<code>&lt;groupbox&gt;</code>
				</li>
		</ul>
		<p>这里没有说明 
        <code>&lt;grid&gt;</code> 元素的用法，它也可以取得类似的效果。 
        <code>&lt;vbox&gt;</code> 总是把其中的内容布置在垂直的框中（框本身是不可见的），类似地， 
        <code>&lt;hbox&gt;</code> 元素把内容布置在水平的框中。如果需要，可以增加 
        <code>height</code> 和 
        <code>width</code> 属性明确规定这些容器的大小，也可以使用 
        <code>flex</code> 、 
        <code>autosize</code> 或 
        <code>equalsize</code> 在其他元素中（比如其他框）安排框的布局。
      </p>
		<p>具体而言， 
        <code>SimpleApp</code> 中的控件都放在一个控制用的 
        <code>&lt;vbox&gt;</code> 中，其中一个子框 
        <code>&lt;hbox&gt;</code> 用于 
        <code>Foo</code> 和 
        <code>Bar</code> 菜单，另一个 
        <code>&lt;hbox&gt;</code> 放置工具栏：
      </p>
		<br />
		<a name="code4">
				<b>清单 4. SimpleApp.xul 布局框和工具栏</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;hbox&gt;<br />      &lt;toolbarbutton type="button"<br />                     oncommand="alert('Button invoked.');"&gt;<br />        &lt;image src="http://gnosis.cx/publish/images/doc.gif" /&gt;<br />      &lt;/toolbarbutton&gt;<br />      &lt;toolbarbutton type="menu"&gt;<br />        &lt;image src="http://gnosis.cx/publish/images/note.gif" /&gt;<br />        &lt;menupopup&gt;<br />          &lt;menuitem label="IBM"<br />                    oncommand="newcontent('http://ibm.com/');"/&gt;<br />          &lt;menuitem label="Google"<br />                    oncommand="newcontent('http://google.com/');"/&gt;<br />          &lt;menuitem label="TPiP"<br />                    oncommand="newcontent('http://gnosis.cx/TPiP/');"/&gt;<br />        &lt;/menupopup&gt;<br />      &lt;/toolbarbutton&gt;<br />      &lt;toolbarbutton type="menu-button" onclick="eye();"&gt;<br />        &lt;image src="http://gnosis.cx/publish/images/eye.gif"/&gt;<br />      &lt;/toolbarbutton&gt;<br />    &lt;/hbox&gt;<br />  &lt;/vbox&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>工具栏代码很有意思，Mozilla XUL 支持现代风格的工具栏，既有直接激活的按钮，也有包含下拉子菜单的按钮。贴有 note.gif 图标的按钮就是一个下拉菜单风格的按钮，如
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#fig1">图 1</a>中所示。还要注意，工具栏中实际的图像是从远程 URL 中拉回来的。这个非常简单的例子是一个完全网络化的应用程序——作为一个整体结合了整个 Web 上的资源（虽然这个例子非常简单）。
      </p>
		<p>谜团中的最后一部分是显示的 HTML 内容。为此，需要在 
        <code>html</code> 名称空间中创建一个 
        <code>&lt;iframe&gt;</code> ：
      </p>
		<br />
		<a name="code5">
				<b>清单 5.  SimpleApp.xul HTML 内容</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;html:iframe id="content-frame" name="content"<br />               src="http://gnosis.cx/TPiP/" flex="100%"/&gt;<br />&lt;/window&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>SimpleApp</code> 的布局比较合理，基本上类似于普通的浏览器。您还可以堆砌上更多的资源，得到更加华丽、更加复杂的布局。比如，在实验 XUL 的时候我创建了一个测试案例，其中包含大小古怪的按钮和各种不同的远程 HTML 页面。它揭示了更多的布局特性，不妨把它拷贝到您的系统中：

      </p>
		<br />
		<a name="code6">
				<b>清单 6.  华丽的 XUL 试验品（test.xul）</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;grid xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;<br />  &lt;columns&gt;<br />    &lt;column/&gt;<br />    &lt;column/&gt;<br />  &lt;/columns&gt;<br />  &lt;rows flex="1"&gt;<br />    &lt;row&gt;<br />      &lt;image src="http://www.mozilla.org/images/mozilla-banner.gif"/&gt;<br />    &lt;/row&gt;<br />    &lt;row flex="1"&gt;<br />      &lt;spacer width="10"/&gt;<br />      &lt;vbox align="center"&gt;<br />        &lt;spacer height="10"/&gt;<br />        &lt;description style="border:0px; width: 120px"&gt;<br />        This text can be &lt;html:b&gt; bold &lt;/html:b&gt; and can wrap to<br />        several lines.  If I add a few more words, I can get it to<br />        fill its column.  This is a weird interface, eh?<br />        &lt;/description&gt;<br />        &lt;spacer height="10"/&gt;<br />        &lt;button accesskey="A" label="A"<br />                image="http://gnosis.cx/TPiP/hugo.gif"<br />                oncommand="alert('Button A pressed!');"/&gt;<br />      &lt;/vbox&gt;<br />      &lt;spacer width="10"/&gt;<br />      &lt;iframe flex="1" src="http://google.com"/&gt;<br />    &lt;/row&gt;<br />    &lt;row flex="1"&gt;<br />      &lt;iframe flex="1" src="http://ibm.com/" /&gt;<br />      &lt;button accesskey="B" flex="1" label="Button B"<br />              oncommand="alert('Button B pressed!');"/&gt;<br />      &lt;button accesskey="C" flex="1" label="Button C"<br />              oncommand="alert('Button C pressed!');"/&gt;<br />    &lt;/row&gt;<br />  &lt;/rows&gt;<br />&lt;/grid&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101B6">
						<span class="atitle">其他部件</span>
				</a>
		</p>
		<p>这个示例应用程序只使用了少量的 XUL 控件。关于各种 XUL 元素的完备文档请参阅“XUL
Programmer's Reference Manual”，在线书籍“
        <i>Creating XPCOM Components</i>”也是非常不错的参考资料，详细介绍了 XUL 和 XPCOM 库编程。
      </p>
		<p>我们再简单地介绍几种 XUL 元素。网格和框多用于简单的布局，而 deck、stack 和 bulletin board 可以提供更多的控制。后面的 
        <code>&lt;bulletinboard&gt;</code> 可以精确定位，而不是自动浮动控件以适应容器。
      </p>
		<p>除了上述菜单之外，XUL 中还包括基本的 UI 元素，如单选框、检查框和各种不同的按钮。一些更高级的用户界面控件还有树状图、弹出窗口、编辑组件和选项卡，以及进度的显示和带有不同滚动条的大型容器的操作。</p>
		<p>多数情况下，所有这些元素都按照其用途命名。但是在 XUL 应用程序中可以包括喜欢的任何 HTML 部件。只需要将其放在 
        <code>html</code> 名称空间中并添加上，就像您在设计 DHTML 网页时所做的那样。
      </p>
		<p>在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#code6">清单 6</a> 中，我悄悄地引入了一种还没有提到过的非常有用的导航元素。那些按钮有一个属性 
        <code>accesskey</code> ，可以使用键盘或者点击鼠标激活它们的动作。同样，也可以规定您认为什么样的键盘导航最适合您的应用程序。虽然默认情况下，可以使用制表键和箭头键选择菜单项，但是快捷键可以简化很多动作。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101DE">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>在
浏览器中开发完整的应用程序似乎很奇怪，但是现在 Mozilla 还不仅如此——它是一整套组件和 GUI 体系结构。事实上，Mozilla
和其他您所能够想到的任何 GUI 库相比，可能更富有跨平台的特色，也更广泛地安装在用户系统上。您所认为的通用
GUI/部件库——Qt、wxWindows、GTK、FOX、MFC、.NET、Carbon
等等——各有不同的优缺点。但其中没有一个可以认为已经跨用户系统安装。很多只能在 Mozilla
所支持平台中的一部分上使用，而且多数安装比较困难还存在许可的问题。仅仅因为它是一个非凡的浏览器就值得安装
Mozilla；一旦拥有它，您就有了一个定制应用程序的 <i>自由的</i>平台。

      </p>
		<p>要使您的 Mozilla/XUL 应用程序完全跨平台，必须用 XUL 配置 GUI，并用 JavaScript 编写程序逻辑。这并不是讨论 JavaScript 优劣的地方，但显然有很多程序员更喜欢用其他语言开发，如 C++、Python 和 Perl。您
        <i>可以</i>这
样做，但是需要使用 XPCOM 绑定到外部库，而这样会降低可移植性，或者至少增加了移植的难度。对于 Python 和 Perl
这样的脚本语言，您可以利用通用的绑定/包装程序，编写非常通用的代码（但是仍然需要适应平台的 XPCOM，如PyXPCOM）。但是对于
C++，您需要对希望支持的每种平台编译特定版本的库，要做的工作更多一些。对于简单的应用程序 JavaScript
仍然是最好的选择，特别是如果应用程序很大程度上基于 Mozilla 框架中内在的网络功能。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-matters35/index.html">英文原文</a>.
        <br /><br /></li>
				<li>阅读 David 上一篇专栏文章，“
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters34/">XML 问题：GUI 和 XML 配置数据</a>”（
          <i>developerWorks</i>，2004 年 4 月），该文考察了 XML 在 Mac OS X 的 Aqua GUI 和 K Desktop Environment（KDE）中的应用。
        <br /><br /></li>
				<li>请访问
          <a href="http://googlebar.mozdev.org/">Mozilla Googlebar 项目</a>，用于定制 XUL 增强浏览器功能的一个很棒的应用程序/覆盖图。它为每个浏览器窗口可选工具栏中增加了多种定制的搜索部件，并改进了上下文弹出菜单。
        <br /><br /></li>
				<li>试一试
          <a href="http://www.mozilla.org/projects/calendar/">Mozilla Calendar</a>，
者是一个用 XUL 编写的成熟的应用程序，包括一些 JavaScript 代码，并通过 XPCOM 调用 C++
库。这个日程表和它的名称一样，就是一个管理约定、联系、事件和类似东西的应用程序。Mozilla Calendar 类似于 Windows 中的
Outlook，或者 Mac OS X（使用了它的开放数据格式）中的 iCal.app，但是可以几乎等同地运行在任何 Mozilla 平台上。
<br /><br /></li>
				<li>从
          <a href="http://www.mozilla.org/xpfe/xulref/">XUL Programmer's Reference
Manual</a>可以获得关于所有 XUL 元素的完备文档，这是关于 XUL 的权威参考。
        <br /><br /></li>
				<li>阅读
          <a href="http://www.mozilla.org/projects/xpcom/book/cxc/"><i>Creating XPCOM
Components</i></a>。这本书的范围超出了 XUL 本身，但它是一个非常棒的、可免费获得的出版物，介绍了整个 XPCOM 体系结构，也包括 XUL。
        <br /><br /></li>
				<li>在
          <a href="http://www-128.ibm.com/developerworks/cn/xml/"><i>developerWorks</i>XML 专区
          </a>可以找到更多的 XML 资源。

        <br /><br /></li>
				<li>在
          <i>developerWorks</i><a href="http://devworks.krcinfo.com/">Developer Bookstore</a>可以找到更中关于 XML 的书籍，包括 David Mertz 撰写的
          <a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0321112547"><i>Text Processing in Python</i></a>。
        <br /><br /></li>
				<li>使用最新的 IBM
          ®工具和中间件开发并测试您的 XML 应用程序，通过
          <a href="http://www-128.ibm.com/developerworks/cn/subscription/">订阅 developerWorks</a>，您可以从 WebSphere
          ®、DB2
          ®、Lotus
          ®、Rational
          ®和 Tivoli
          ®获得 IBM 软件，以及使用这些软件的 12 个月的许可证，它们都比您预想的要便宜得多。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-matters35/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="David Mertz" src="http://www.ibm.com/developerworks/i/p-mertz.gif" align="left" border="0" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>David Mertz 认为 WIMP 界面很快将真正消失。可以通过
        <a href="mailto:mertz@gnosis.cx">mertz@gnosis.cx</a>与 David 联系；在
        <a href="http://gnosis.cx/publish/">http://gnosis.cx/publish/</a>上详细介绍了他的生活。欢迎对过去、现在和未来的专栏文章提出意见和建议。您可以在
        <a href="http://gnosis.cx/TPiP/">http://gnosis.cx/TPiP/</a>了解 David 的新书 Text Processing in Python。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:48 <a href="http://www.blogjava.net/Vencent/articles/36741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XForms 附录:从这里获取 XForms 规范信息和样本代码</title><link>http://www.blogjava.net/Vencent/articles/36740.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36740.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36740.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36740.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 级别: 初级						Joel Rivera, 暑假实习生, IBM ResearchLen Taing, 暑假实习生, IBM Research		2002 年  9 月  01 日		本文是            developerWorks文章“            准备使用 XForms”的附录。        												返...&nbsp;&nbsp;<a href='http://www.blogjava.net/Vencent/articles/36740.html'>阅读全文</a><img src ="http://www.blogjava.net/Vencent/aggbug/36740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:47 <a href="http://www.blogjava.net/Vencent/articles/36740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 XML: 处理指令和参数::添加多个样式表支持</title><link>http://www.blogjava.net/Vencent/articles/36739.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36739.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36739.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36739.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#author">Benoit Marchal</a>, 顾问, Pineapplesoft<br /></p>
		<p>2001 年  9 月  01 日</p>
		<blockquote>这个月，我们不辞辛劳的专栏作家将多个样式表的支持添加到 XM 内容管理项目中。 在这样做时，他涉及到了 TrAX       
      <code>URIResolver</code> 并编写伪属性的解析器。如往常一样，可在 developerWorks 开放源码专区获得完整的源代码。			      
      <p><i>在“使用 XML”专栏文章中，Beno�t Marchal 每个月都报告其关于一个或多个开放源码 XML 开发项目的进展。 您可以随着他的进展，遵循他的设计决策和编码选择，也可以提出一些建议以及在您自己的项目中重用该开放源代码。</i></p></blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>继续有
关 XM 的工作。这个月，我已经添加了多个样式表支持，因此可以解决读者发来的最常见建议。 我还添加了一个将一些参数传递到样式表的选项，它使
XM 基本的发布功能更完美。
在开始继续开发更高级的功能期间，我已经包括了一个目录阅读器。（您可以下载有关这篇文章以及以前专栏文章的所有相关代码； 请参阅副栏 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#codeSB">获取代码</a>。）
      
      </p>
		<p>
				<a name="N10074">
						<span class="atitle">多个样式表</span>
				</a>
		</p>
		<p>
XM 的头两个版本沿用“用一种模式来套用所有”策略，最初看上去似乎是一个好主意，但经过证实它是无效的。 更明确地讲，到现在为止，XM 只识别一种样式表 
        
        <code>rules.xsl</code> 。正如本系列的第一篇文章中说明的那样， 我原先认为我本可以使用不同的 XSLT 模板来选择样式的变更：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:template match="db:article"&gt;<br />   &lt;!-- rules for an article here --&gt;<br />&lt;/xsl:template&gt;<br />&lt;xsl:template match="xm:Directory"&gt;<br />   &lt;!-- rules for a directory here --&gt;<br />&lt;/xsl:template&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>然
而，我自己在 ananas.org（我完全用 XM 维护的网站）上的经历说明了我最初的计划不能很好地工作。
我还收到一些读者的建议，建议我解决那些他们察觉是缺陷的问题。最后，
当我开始着手内容生成（稍后将在本文中介绍）时，更觉得有必要添加多个样式表的支持了。</p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="codeSB">
																				<b>获取代码</b>
																		</a>
																		<br />
																		<p>
跟往常一样， 可以从 CVS 资源库（请参阅
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#resources">参考资料</a>）下载该专栏文章的代码。可以从同一个地方下载 ZIP 文件。 这个月，下载文件包括样本 .xml 和 .xsl 文件。
        
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="N10098">
						<span class="smalltitle">处理指令</span>
				</a>
		</p>
		<p>
您可能记起，易用性是我优先使用 XM 的原因之一， 明确地讲，我不希望使用配置文件或“构建脚本”来选择哪个样式表适用于哪个地方（有关这一需求的完整讨论， 请阅读
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part1/index.shtml">使用 XML：将 XSLT 用于内容管理</a>）。
      
      </p>
		<p>读者建议用巧妙的命名约定来选择样式表，但对于解决方案的最好提议来自一位同事， 他提醒我使用 
        
        <code>xml-stylesheet</code> 处理指令。
      
      </p>
		<p>如果您不熟悉 
        
        <code>xml-stylesheet</code> ，则可以看于 1999 年 7 月发表的小的 W3C 建议书，其中介绍了它，xml-stylesheet 是通过 Internet Explorer 5.0 而得到普及。处理指令将样式表（XSL 或 CSS）与 XML 文档相关联。 例如：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br /><br /><br /><br /><span class="boldcode">&lt;?xml-stylesheet href="classic.xsl" type="text/xml"?&gt;<br />&lt;?xml-stylesheet href="funky.xsl" type="text/xml" alternate="yes"?&gt;</span><br /><br /><br />&lt;article&gt;<br />&lt;articleinfo&gt;<br /> &lt;title&gt;ananas.org&lt;/title&gt;<br />&lt;!-- rest of the document goes here --&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p> 一般而言，处理指令对应用程序特定的数据进行编码。您已经熟悉了处理指令，因为大多数 XML 文档都是以 XML 声明开始， 该声明本身就是特殊的处理指令。一条处理指令包含一个目标（在上面示例中， 
        
        <code> xml-stylesheet</code> ），后跟数据。 用 
        
        <code>&lt;?</code> 和 
        
        <code>?&gt;</code> 定界符将处理指令包起来。目标确定应用程序， 而对应用程序不能识别的目标，其会忽略这些处理指令。
      
      </p>
		<p>数据格式完全是自由的。XML 不指定将什么东西放进去（当然，除了 XML 声明）。 事实上，由于历史原因，处理指令可以包含 PostScript 图像或脚本等……但决不包含标记。</p>
		<p>象声明一样， 
        
        <code>xml-stylesheet</code> 有特殊地位，因为它是由 W3C 定义的。 它必须出现在文档的开始（即，在第一个元素之前），并且包含几个所谓的
        
        <i>伪属性</i>。这个数据之所以称为伪属性， 是因为其语法与 XML 属性相似。
      
      </p>
		<p>最重要的伪属性是 
        
        <code>href</code> ，它包含指向样式表的 URI。其它有用的伪属性有 
        
        <code>type</code> 和 
        
        <code>alternate</code> 。 
        
        <code>type</code> 是样式表的 MIME 类型， 它用来区别 CSS 和 XSL。如果有多个 
        
        <code>xml-stylesheet</code> 指令， 则 
        
        <code>alternate</code> 表明哪一个替代主样式表。处理器应该用备用样式表列表提示用户。 然而，因为 XM 以批处理方式工作，所以它使用不同的策略，完全忽略备用样式表。
      
      </p>
		<p>虽然 
        
        <code>xml-stylesheet</code> 是一种 W3C 标准，但 TrAX 处理器忽略它，除非另行告知。 应用程序必须明确地调用 
        
        <code>getAssociatedStylesheet()</code> 来检索处理指令，如下：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">Source document = new StreamSource(file),<br />       stylesheet = factory.getAssociatedStylesheet(document,null,null,null);<br /><br />if(null != stylesheet)<br />   transformer.transform(document,new StreamResult(System.out));<br />else<br />   throw new XMException("Cannot find the style sheet");</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>然而， 
        
        <code>getAssociatedStylesheet()</code> 带来 XM 必须避免的两个问题。首先， 
        
        <code>getAssociatedStylesheet()</code> 使高速缓存常用样式表变得困难。其次，它假设样式表存储在与文档相同的目录中。 我喜欢将样式表存储在不同的目录中，因为我发现，如果样式表都被分组在一个目录中，可以易于维护和共享样式表。
      
      </p>
		<p>
				<a name="N1010F">
						<span class="smalltitle">还传递样式表参数</span>
				</a>
		</p>
		<p>选择样式表仅仅完成了解决方案的一半。 通常，我希望做一些小小的变动，而不必编写新的样式表。对于这种情况，我喜爱的解决方案是使用参数， 如清单 1 所示：</p>
		<br />
		<a name="listing1">
				<b>清单 1：样本参数</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:stylesheet ...&gt;<br /><br />&lt;xsl:param name="sponsor" select="'none'"/&gt;<br /><br />&lt;xsl:template match="articleinfo"&gt;<br /><br /><br /><br /><br /><span class="boldcode">&lt;xsl:if test="$sponsor='dw'"&gt;</span><br /><br /><br />      &lt;center&gt;<br />         &lt;a href="http://www.ibm.com/developerWorks"&gt;<br />            &lt;img align="middle" width="136" height="24" border="0"<br />                alt="developerWorks" src="!images/buttons/dw.gif"/&gt;<br />         &lt;/a&gt;<br />      &lt;/center&gt;<br />   &lt;/xsl:if&gt;<br />   &lt;xsl:apply-templates/&gt;<br />&lt;/xsl:template&gt;<br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>还有，如何传递这些参数？W3C 没有提议一种机制，所以定义新的处理指令似乎也就不足为奇了。XM 可以识别 
        
        <code>xm-xsl-param</code> 和 
        
        <code>xml-stylesheet</code> 。 
        
        <code>xm-xsl-param</code> 的语法与其它处理指令相似，并且使用两个伪属性 
        
        <code>name</code> 和 
        
        <code>value</code> ：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br /><br /><br /><br /><span class="boldcode">&lt;?xm-xsl-param name="sponsor" value="dw"?&gt;</span><br /><br /><br />&lt;article&gt;<br />   &lt;articleinfo&gt;<br />      &lt;title&gt;XM&lt;/title&gt;<br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>显而易见，TrAX 不支持 
        
        <code>xm-xsl-param</code> ，但因为我已经确定 XM 需要替换 
        
        <code>getAssociatedStylesheet()</code> ，所以解析 
        
        <code>xm-xsl-param</code> 的工作不是很多。
      
      </p>
		<p>但这不是意味着要对文档解析两次吗？一次用于处理指令，另一次是使用 XSLT 处理器。实际上， 解析两次不会引起更多麻烦，因为处理指令必须出现在文档开始，所以 XM 只是重新解析文档的一小部分。</p>
		<p>
				<a name="N1015D">
						<span class="smalltitle">ProcessingInstructionHandler 和 PseudoAttributeTokenizer</span>
				</a>
		</p>
		<p>
				<code>ProcessingInstructionHandler</code> 是一种 SAX 
        
        <code>ContentHandler</code> ，它抽取 
        
        <code>xml-stylesheet</code> 和 
        
        <code>xm-xsl-param</code> 。
      
      </p>
		<p>处理程序截取 4 个事件。 
        
        <code>setDocumentLocator()</code> 和 
        
        <code>startDocument()</code> 用于初始化。 大多数工作都发生在 
        
        <code>processingInstruction()</code> 中。至于 
        
        <code>startElement()</code> ， 它用来停止解析，因为它标记这个开始的结束。要停止解析， 
        
        <code>startElement()</code> 抛出一个异常。 这种作法近乎黑客所使用的手段，这是有争议的；异常一般用于报告错误，然而 
        
        <code>startElement()</code> 中没有错误，但 SAX 没有提供更“光明正大”的解决方案来停止解析。
      
      </p>
		<p>虽然伪属性的语法与 XML 属性相类似，但 SAX 解析器不对它们进行译码。XM 使用它自己的解析器 
        
        <code>PseudoAttributeTokenizer</code> 来对伪属性进行译码。
      
      </p>
		<p>
				<code>PseudoAttributeTokenizer</code> 每次扫描缓冲区一个字符，查找伪属性。 它使用一种典型的算法，这种算法可以在每本编译器书籍中找到。 如果您不熟悉方面的内容，那么我推荐您阅读以 Pascal 闻名的 Niklaus Wirth 的 
        
        <i>Compiler Construction</i>（请参阅
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#resources">参考资料</a>）。
      
      </p>
		<p>要简化该代码， 
        
        <code>getc()</code> 方法返回缓冲区中的下一个字符，而 
        
        <code>putc()</code> 替换缓冲区中 
        
        <code>getc()</code> 下一次调用的字符。
      
      </p>
		<p>
				<code>PseudoAttributeTokenizer</code> 的公用接口由三个方法组成： 
        
        <code>hasMoreTokens()</code> 测试缓冲区中是否还有伪属性， 
        
        <code>nextName()</code> 返回下一个名称， 
        
        <code>nextValue()</code> 返回下一个值。
      
      </p>
		<p>让我们研究一下 
        
        <code>nextName()</code> 。它通过调用 
        
        <code>eatSpaces()</code> 来除去前导空格。接下来， 只要它发现有数字或字母，就一直循环下去，并将字符累积在变量（ 
        
        <code>token</code> ）中。因为名称只包含数字和字母， 所以任何其它字符都可以表示这个循环的结束。 
        
        <code>nextName()</code> 特别关注读入缓冲区的、返回的最后一个字符， 其中，它将用于 
        
        <code>nextValue()</code> 。
      
      </p>
		<br />
		<a name="listing2">
				<b>清单 2：nextName() 示例</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">public String nextName()<br />   throws SAXParseException<br />{<br />   token.setLength(0);<br />   int c = eatSpaces();<br />   for(;;)<br />      if(c == -1)<br />         throw new SAXParseException(UNEXPECTED_EOS,locator);<br />      // strictly speaking a name cannot start with a digit...<br />      else if(!Character.isLetterOrDigit((char)c) &amp;&amp; c != '-')<br />      {<br />         putc();   // put it back for the next call<br />         return token.length() == 0 ? null : token.toString();<br />      }<br />      else<br />      {<br />         token.append((char)c);<br />         c = getc();<br />      }<br />}</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>nextValue()</code> 与 
        
        <code>nextName()</code> 相似，但它先识别等号字符（由 
        
        <code>nextName()</code> 将它留在缓冲区中）和引号字符。 
        
        <code>nextValue()</code> 还译码预先定义的实体（ 
        
        <code>&lt;</code> 、 
        
        <code>&gt;</code> 以及类似的）。
      
      </p>
		<p>有了 tokenizer，就很容易译码处理指令。以下代码摘自 
        
        <code>ProcessingInstructionHandler</code> ，它用来识别 
        
        <code>xml-stylesheet</code> 。 
        
        <code>xm-xsl-param</code> 的代码与这类似：
      
      </p>
		<br />
		<a name="listing3">
				<b>清单 3：ProcessingInstructionHandler 摘录</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">if(target.equals("xml-stylesheet"))<br />{<br />   String href = null,<br />          type = null;<br />   boolean alternate = false;<br />   PseudoAttributeTokenizer tokenizer =<br />      new PseudoAttributeTokenizer(data,locator);<br />   while(tokenizer.hasMoreTokens())<br />   {<br />      String name = tokenizer.nextName(),<br />             value = tokenizer.nextValue();<br />      if(name.equals("href"))<br />         href = value;<br />      else if(name.equals("alternate"))<br />         alternate = value.equals("yes");<br />      else if(name.equals("type"))<br />         type = value.trim();<br />      // ignore the media attribute...<br />   }<br />   if(type != null &amp;&amp; href != null &amp;&amp; !alternate &amp;&amp;<br />      (type.equals("text/xsl") || type.equals("text/xml") ||<br />       type.equals("application/xml+xslt")))<br />   {<br />      this.href = href;<br />      params.clear();<br />      readParams = true;<br />   }<br />   else<br />      readParams = false;<br />}</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请记住，XM 会忽略备用样式表。W3C 建议书考虑到 HTTP，所以提供了优先于备用样式表的缺省样式表。XM 使用与这相同的规则， 应用它自己的缺省样式表，而不考虑备用样式表。</p>
		<p>
				<a name="N10220">
						<span class="smalltitle">TemplatesManager</span>
				</a>
		</p>
		<p>
由于 XM 可使用多个样式表， 所以对高速缓存的逻辑进行了改进。这是由 
        
        <code>TemplatesManager</code> 来负责。当 
        
        <code>StylingMover</code> 请求 
        
        <code>Templates</code> 对象时，从高速缓存（如果该对象在其中）检索该对象。如果该对象不在其中， 则 
        
        <code>TemplatesManager</code> 装入样式表并将其放入高速缓存。本质上， 
        
        <code>TemplatesManager</code> 是包含 
        
        <code>java.util.Map</code> 的封装器，并包含用于返回 
        
        <code>Transformer</code> 对象的附加方法。
      
      </p>
		<p>正如前面所解释的那样，XM 不会将文档和样式表混在一起。它使用两个目录：文档目录和规则目录。TrAX 提供 
        
        <code>URIResolver</code> 接口以控制 XSLT 处理器如何装入文件。XSLT 处理器的 
        
        <code>URIResolver</code> 与 SAX 解析器的 
        
        <code>EntityResolver</code> 相似； 当该处理器装入已导入的样式表（通过 
        
        <code>xsl:import</code> 或 
        
        <code>xsl:include</code> 元素）或文档（通过 
        
        <code>document()</code> 函数）时， 该处理器调用它的 
        
        <code>resolve()</code> 方法。
      
      </p>
		<p>
				<code>TemplatesManager</code> 使用内部类 
        
        <code>ReferenceResolver</code> ，该类从规则目录装入样式表：
      
      </p>
		<br />
		<a name="listing4">
				<b>清单 4：ReferenceResolver 示例</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">protected class ReferenceResolver<br />   implements URIResolver<br />{<br />   protected File rulesDir;<br /><br />   public ReferenceResolver(File rulesDir)<br />   {<br />      this.rulesDir = rulesDir;<br />   }<br /><br />   public Source resolve(String href,String base)<br />   {<br />      if(href.endsWith(".xsl"))<br />      {<br />         File file = new File(rulesDir,href);<br />         if(file.exists())<br />            return new StreamSource(file);<br />      }<br />      return null;<br />   }<br />}</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10279">
						<span class="smalltitle">StylingMover</span>
				</a>
		</p>
		<p>
		</p>
		<p>当然，我已经把 
        
        <code>StylingMover</code> 改写成新类。它现在用 
        
        <code>ProcessingInstructionHandler</code> 处理程序来解析文档。 它使用处理结果来选择样式表并指定参数，如
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/listing5.shtml">清单 5</a> 所示。 特别要注意 try/catch 语句；因为 
        
        <code>startElement()</code> 使用特殊异常来停止解析，所以代码必须识别那不是一个错误。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10294">
						<span class="atitle">自动生成内容</span>
				</a>
		</p>
		<p>到目前为止， 有关 XM 的工作已经涉及了基本发布特性。虽然它们很重要，但我相信 XM 的真正价值体现在从一开始我就萦绕在脑际的自动内容生成。 简而言之，这个想法是让 XM 为您生成 XML 文档。</p>
		<p>例如，许多网站都包含下载区。如果经常更改文件列表， 则要维护一个带总是最新列表的 XML 文档是困难的。最好使用一种软件来自动生成列表。 该文档可能类似于清单 6。同样可以从 SQL 数据库、邮箱或者甚至远程网站生成文档！</p>
		<br />
		<a name="listing6">
				<b>清单 6：由 XM 读取的目录</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;xm:Directory xmlns:xm="http://www.ananas.org/2001/XM/Walk/Directory"&gt;<br />    &lt;xm:File isDirectory="false" isFile="true" isHidden="false" canRead="true" <br />             isMarked="false"  lastModified="2001-07-07T18:21:10" canWrite="true"<br />             length="749"&gt;NotImplementedException.java&lt;/xm:File&gt;<br />    &lt;xm:File isDirectory="false" isFile="true" isHidden="false" canRead="true" <br />             isMarked="false" lastModified="2001-07-20T11:49:42" canWrite="true"<br />             length="6229"&gt;ContentHandlerExtractor.java&lt;/xm:File&gt;<br />    &lt;xm:File isDirectory="false" isFile="true" isHidden="false" canRead="true" <br />             isMarked="false" lastModified="2001-09-05T07:10:10" canWrite="true"<br />             length="2351"&gt;JAXPHelper.java&lt;/xm:File&gt;<br />&lt;/xm:Directory&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>上个月的专栏文章中介绍了 
        
        <code>Mover</code> ，其用于简化添加自动内容生成的过程。 这个月，我已经在代码中预先包含了目录生成，并打算下个月再讲述它。同时， 如果您对此感兴趣，可回顾一下 
        
        <code>DirectoryReader</code> 、 
        
        <code>WalkHandler</code> 和 
        
        <code>WalkMover</code> 。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102BD">
						<span class="atitle">轮到您了</span>
				</a>
		</p>
		<p>
目前，我正在用 XM 维护两个网站：ananas.org 和一个内部网。从使用 XM 而得到的实际经验对于确定如何更改软件十分有用。
欢迎您的加入，希望您下载 XM 副本，尝试它，来构建您自己的网站。 请在 ananas-discussion 邮件列表报告您的发现（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#resources">参考资料</a>）。
      
      </p>
		<p>我已经将 ananas.org 网站的代码（.xml 文档和 .xsl 样式表）添加到 CVS 资源库中， 您可以从那出发来设计您自己的网站。</p>
		<p>如果安装了早期版本的 XM，则需要更新软件以利用这个月的改进：将 
        
        <code>rules.xsl</code> 文件重命名为 
        
        <code>default.xsl</code> ，并将它移到 
        
        <code>rules</code> 目录。 这与用于选择样式表的新标准匹配。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-wxxm2/index.html">英文原文</a>.
        
        <br /><br /></li>
				<li>参与本文的
          
          <a href="javascript:void forumWindow()">论坛</a>。
        
        <br /><br /></li>
				<li>可以从
          
          <a href="http://www.ananas.org/">ananas.org</a>下载该项目的代码。在那里有到 developerWorks 上的
          
          <a href="http://www.ananas.org/xm/oss">CVS 资源库</a>以及 ananas-discussion 邮件列表的链接。 我希望您加入列表，并就该项目，提出您的想法。
        
        <br /><br /></li>
				<li>如果想要
          
          <a href="http://www.ananas.org/xm/downloads/xm.0.3.zip">ZIP 文件</a>，也可以获得它。
        
        <br /><br /></li>
				<li>XM 将
          
          <a href="http://xml.apache.org/xalan-j/index.html">Xalan</a>和
          
          <a href="http://xml.apache.org/xerces-j/index.html">Xerces-J</a>分别用作 XSLT 处理器和 XML 解析器。最初，IBM（和Lotus）开发了这两个工具，后来将代码赠予 Apache Foundation。
        
        <br /><br /></li>
				<li>
						<a href="http://service2.boulder.ibm.com/devtools/news0800/art19.htm">XML Extender for DB2</a>与 DirectoryReader 类似，但它用于 DB2 数据库。它允许您将数据库作为 XML 文档访问……可以用 XSLT 来转换 XML 文档。
        
        <br /><br /></li>
				<li>Niklaus Wirth 的
          
          <a href="http://www.cs.inf.ethz.ch/%7Ewirth/books/CompilerConstruction/"><i>Compiler Construction</i></a>（ISBN 0-2014-0353-6）是对解析的最好介绍之一。共 180 页，可以很快读完。
        
        <br /><br /></li>
				<li>在 developerWorks
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/index.shtml">XML 专区</a>中查找更多的 XML 参考资料。
        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wxxm/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="Author photo" src="http://www-128.ibm.com/developerworks/cn/i/p-bmarchal.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Beno�t Marchal 是比利时纳慕尔的顾问和作家。他是
        
        <a href="http://www.amazon.com/exec/obidos/ASIN/0789722429/pineapplesoftonl"><i>XML by Example</i></a>、
        
        <a href="http://www.amazon.com/exec/obidos/ASIN/0672320541/pineapplesoftonl"><i>Applied XML Solutions</i></a>和
        
        <a href="http://www.mightywords.com/browse/details_bc05.jsp?privateLabel=true&amp;sku=MW8DE9&amp;etailerId=1343"><i>XML and the Enterprise</i></a>的作者。他是 Gamelan 的专栏作家。有关他最新项目的详细信息，可在
        
        <a href="http://www.marchal.com/">marchal.com</a>上找到。可以通过
        
        <a href="mailto:bmarchal@pineapplesoft.com">bmarchal@pineapplesoft.com</a>与 Beno�t 联系。
      
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:45 <a href="http://www.blogjava.net/Vencent/articles/36739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML问题解答</title><link>http://www.blogjava.net/Vencent/articles/36737.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36737.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36737.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36737.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#author">郭 路</a>, Technical Manager<br /></p>
		<p>2001 年  7 月  01 日</p>
		<blockquote>自我们推出“XML在传统制造业供应链中的应用分析”专栏以来，受到了广大读者的欢迎。专栏作家郭路收到了大量读者的来信，提出了很多问题。现将读者提出的问题一一做了解答并总结整理出来，以期帮助广大读者更好的了解XML。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1003F">
						<span class="atitle">1、问：我用记事本建立的XML文件，使用中文的元素标记名，在IE中可以正常显示，但是在XML Notepad中报告却出错，请问XML元素名能否使用中文字符？</span>
				</a>
		</p>
		<p>
				<b>答：</b>可
以，XML元素名可以由字母、除英文外的别国文字、下划线、冒号、数字、连字符、句号，其中数字、连字符、句号不能为首字符，当然，如果你使用中文元素
名，应该在句首指定 或 。至于XML
Notepad不能识别中文元素名，应该说这是其软件自身的不足,目前对于各种XML解析工具或XML文本工具，均要求其支持UTF-8和UTF-16编
码，这是最基本的，但并不是所有工具都支持非Unicode编码，这就好像并不是所有浏览器都支持JavaScript一样，尽管HTML标准本身支持脚
本嵌入。需要说明的是，当我们把XML作为一种交换数据的词汇标准时，一般都是希望定义的元素标记具有典型性与广泛性，可以被互联网上的其它应用轻松识
别，从这个角度说，我们鼓励大家在建立专用的XML词汇表时，尽量采用约定俗成的，专业化、标准化、国际化的英文命名。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1004B">
						<span class="atitle">2、问：URI和URL有什么不同？</span>
				</a>
		</p>
		<p>
				<b>答：</b>URI
是统一资源标识符（Uniform Resource Identifier）的缩写，URL是统一资源定位符（Uniform Resoure
Locator）的缩写，另外还有URN也经常使用，它是统一资源名称（Uniform Resource
Name）的缩写。URL是通过"通讯协议＋网络地址"字符串来唯一标识信息位置及资源访问途径的一种方法；URN则主要用于唯一标识全球范围内由专门机
构负责的稳定的信息资源，URN通常给出资源名称而不提供资源位置；URI是一种用字符串唯一标识信息资源的工业标准（RFC2396），它使用的范围及
方式都较为广泛，在XML中用URI引用来标识元素的命名空间（Namespace），URI包括了URL和URN，是二者的超集。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10057">
						<span class="atitle">3、问：我想在VC、VB中使用SAX可以吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>可
以，在微软最新发布的MSXML3以及MSXML4
Preview中，已经包含了对SAX2的支持，MSXML开发包是一个COM组件，其V3.0的文件名为MSXML3.dll，V4.0的文件名为
MSXML4.dll，用户可以到XML技术网中下载它们的安装文件，其网址为http:
//www.chinaasp.com/xml/download/。以下是MSXML3中新增的支持SAX2的COM接口列表： <br />
IMXAttributes : IDispatch
        
        <br />IMXReaderControl : IDispatch
        
        <br />IMXWriter : IDispatch
        
        <br />IVBSAXAttributes : IDispatch
        
        <br />IVBSAXContentHandler : IDispatch
        
        <br />IVBSAXDeclHandler : IDispatch
        
        <br />IVBSAXDTDHandler : IDispatch
        
        <br />IVBSAXEntityResolver : IDispatch
        
        <br />IVBSAXErrorHandler : IDispatch
        
        <br />IVBSAXLexicalHandler : IDispatch
        
        <br />IVBSAXLocator : IDispatch
        
        <br />IVBSAXXMLFilter : IDispatch
        
        <br />IVBSAXXMLReader : IDispatch
        
        <br />
有关MSXML3中关于SAX2的详细描述请访问MSDN的在线帮助 
        
        <a href="http://msdn.microsoft.com/library/en-us/xmlsdk30/htm/sax2_developersguide_overview.asp">http://msdn.microsoft.com/library/en-us/xmlsdk30/htm/sax2_developersguide_overview.asp</a>.
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10083">
						<span class="atitle">4、问：我想通过SAX访问一个动态的XML数据流可以吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>可以，SAX允许所访问的XML数据为字符流形式，在SAX中用InputSource类表示可能的数据源，以SAX for Java为例，其连接语句如下所示：
        
        <br /><code>InputSource source ＝ new InputSource(xmlstring); SaxParser.parse(source);</code></p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10095">
						<span class="atitle">5、问：我想在浏览器中格式化显示XML，该如何实现？</span>
				</a>
		</p>
		<p>
				<b>答：</b>目前支持XML的浏览器只有IE，要在浏览器中格式化显示XML数据，需要指定样式表，可以使用CSS或XSLT来实现，以下是在XML文件中引用CSS和XSLT样式表的范句：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="600">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml:stylesheet href="example.css" type="text/css"?&gt;<br />&lt;?xml:stylesheet href="example.xsl" type="text/xsl"?&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A6">
						<span class="atitle">6、问：我知道在微软新的ADO 2.5版中提供了对XML的支持，能具体解释一下吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>是的，在ADO 2.5中可将一个数据库记录集保持为XML文档格式。同样，它可以将一个XML文档当作一个记录集打开，这就提供了一种在数据库与XML间数据转换的方法，以VB为例，可以用如下语句将一个记录集保存到XML文件：
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="600">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">Set connect = New ADODB.Connection<br />connect.ConnectionString = "DSN=NorthWind;"<br />connect.Open<br />Set _recordset ＝ connect.Execute("Select * FROM AGE")<br />_recordset.save"MateRecords.xml", adPersistXML<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100B7">
						<span class="atitle">7、问：听说在SQL Server 2000中可以通过浏览器访问数据库并返回XML记录集，我已经装了SQL Server 2000，请问要怎样可以从浏览器访问数据库？</span>
				</a>
		</p>
		<p>
				<b>答：</b>为
了通过浏览器访问SQL Server 2000数据库，你还需要安装IIS 5（如果直接使用Query
Analyzer来获取记录集就不需要IIS），然后使用SQL Server 2000自带的SQL XML Support in
IIS工具建立一个虚拟目录与实际的数据库对应，该虚拟目录是通过URL访问SQL Server数据库的入口，一个典型的HTTP访问语句如下所述：
<br /><code>http: // localhost / Northwind ? sql = select +name+ from + employees + for + xml + auto</code>
其中，localhost表示本机，Northwind表示在SQL XML Support in
IIS中建立的虚拟目录名，"?"后面跟SQL查询语句，for xml
auto子句指定了将SELECT语句映射到XML中的具体方式。即将结果集作单个表模型化，所查询的字段可作为属性或子元素返回，并且XML结果集的线
性层次关系应与数据库表在select排列中的顺序相一致。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C9">
						<span class="atitle">8、问：请问WAP是XML的一种特定格式吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>不
是，WAP是无线应用协议（Wireless Application
Protocol）的缩写，WAP中用到了XML技术，但WAP本身不是XML的一种实现方式。WAP是由一种用于将手机、PDA等掌上设备连接到互联网
的技术标准，它由一系列的协议规范组成，包括传输代理、网络安全、数据压缩、事务处理、信息显示等方面的约定。WAP技术由WAP
Forum制定并发布，该论坛的会员包括爱立信、摩托罗拉、诺基亚、Phone.com、阿尔卡特、微软、IBM、Oracle、松下、西门子、三星、朗
讯等IT业界的重量级公司，在WAP规范中采用了目前互联网的多种技术，如IP、UDP、HTTP、XML等。与通常的万维网采用HTML语言显示信息不
同，在WAP中采用了WML作为客户端交互显示的语言，WML是无线标记语言（Wireless Markup
Language）的缩写，WML标记语言完全符合XML规范，我们可以将它视作为无线应用专门定制的一个XHTML子集，之所以要制定WML而不直接使
用HTML或XHTML，主要原因在于无线应用具有带宽窄，客户端屏幕较小、分辨率低，不需要很复杂的显示功能的特点，而经过裁剪优化过的WML更符合其
需求。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100D5">
						<span class="atitle">9、问：请问目前中国有自己的XML组织吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>有，其中中国XML联盟应该是国内最早的XML研究组织，其网站为
        
        <a href="http://www.xml.org.cn/">http://www.xml.org.cn</a>，成员以上海交大电子工程系的学生为主，而由中国科学院电子商务研究中心成立的cnXML联盟则是我国XML规范制定的官方机构，其网站为
        
        <a href="http://www.xml.org.cn/">http://www.cnxml.org.cn</a>，现在国内的企业可以在cnXML上登记和发布自己的XML词汇表。另外cnXML联盟正在研究制定cnXML规范，这是一个符合中国特色的电子商务语言规范，目前cnXML草案的最新版本是v0.83。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100E9">
						<span class="atitle">10、问：WIDL也可以实现分布式系统的组件调用，它与XMLRPC、SOAP有什么不同？</span>
				</a>
		</p>
		<p>
				<b>答：</b>WIDL
是Web接口定义语言（Web Interface Definition
Language）的缩写，是用XML表示IDL的一种规范，WIDL由WebMethods公司研究制定并已提交W3C。我们知道IDL（包括OMG
IDL和MS
IDL）是一种用于编写接口规范的语言，而WIDL的目的就是定义一种用于Web的接口规范，使不同应用可以通过Web站点实现交互和相互调用。在
WIDL3.0中，WIDL由IDL组件（定义接口信息）与文档映射组件组成（定义应用接口与XML调用消息之间的映射）组成，与XML-RPC、
SOAP不同的是，WIDL指定的是应用程序所需交换的信息，而不管消息调用的网络通信实现。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F5">
						<span class="atitle">11、问：请问cXML与cnXML有什么关系？</span>
				</a>
		</p>
		<p>
				<b>答：</b>虽
然只有一字之差，但二者没有直接关系，cXML即CommerceXML，它是由Ariba公司制定的一种基于XML规范，面向B2B模式电子商务交易的
行业标准。它在众多的电子商务交易中抽象出一种以订单为中心、并紧密围绕供货方和采购方的交易模型，另外还定义了一种信息交换的机制，进而完成订单的采
购、处理与交运等一系列过程。而cnXML则是由中科院cnXML联盟制定的中国电子商务语言规范，其商务流程定义参照国际标准的OBI购买模型。巧合的
是，cXML与cnXML都是有关电子商务交易语言的规范。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10101">
						<span class="atitle">12、问：我想在工作流中使用XML来传递数据，我们的开发工具采用IBM的WebSphere，请问我应该用DTD还是Schema来制定数据规范？</span>
				</a>
		</p>
		<p>
				<b>答：</b>DTD
是传统的XML约束规则，与XML
Schema相比其局限性是显见的。如DTD本身采用与XML完全不同的语法；DTD对数据类型的支持极弱；DTD不支持命名空间等等。而W3C已于
2001/5/2日发布了XML Schema的1.0标准，因此在今后实际开发XML中显然是要优先考虑使用Schema。然而由于XML
Schema的正式版本刚刚发布，因此能真正支持它的工具几乎没有（目前绝大多数支持Schema校验的工具遵循的是MS
Schema版本，这与XML Schema
V1.0是有区别的），而DTD由于发布时间早，有许多XML工具都支持它，因此对于特定的应用而言，能否使用XML
Schema还要看环境的限制。总的来说，XML Schema是今后发展的方向，但DTD目前还是主流，另外由于DTD具有庞大的应用群，虽然XML
Schema已成为工业标准，但DTD也不会就此被完全淘汰，所以现在选择DTD的，也不需有什么后顾之忧。还有第三种选择是使用MS
Schema，在IE5、MSXML、BizTalk Server 2000中提供对这种规范的支持，正如我们刚才所说的，MS
Schema不是正统的Schema，尽管目前有支持它的工具，仍应谨慎使用，今后Schema校验工具的发展肯定是要往W3C的XML
Schema上靠的（包括IE）。就我个人意见，对于相对封闭的企业内部系统而言，由于系统本身具有较高的!
稳定性与独立性，数据的出口与入口都是已知的，可以考虑使用MS
Schema；但如果受约束的XML数据具有很强的开放性，如面向互联网应用，要考虑到对XML数据的约束规则今后可以被外部应用所兼容，就应该尽量避免
使用MS Schema。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1010D">
						<span class="atitle">13、问：我的课题题目是有关 xml在edi 中的应用。由于是刚刚接触到 xml 这方面的内容，不知道应该从哪里开始，能介绍一些有关的知识吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>EDI
其实是一种传统的电子数据交换标准，用于在不同的大型系统之间的数据交换，它有一套非常严谨的规则，包括报文规则，安全规则，传输规则等，EDI的成本很
高，目前在国内海关、银行用的较多，XML的崛起对EDI冲击很大，因为XML是完全免费的，而且容易实现，当然它还很不成熟，尤其是关于安全与数据的可
靠传输方面，它不像EDI是使用增值网的。XML要完全取代EDI是不太现实的，尽管EDI的商业规则已落伍，然而至少在20年内，我想它还会有很大的生
命力。因此最有可能的就是对现有的EDI实现进行改进，包括使用Web、XML等手段。目前在华盛顿地区的XML/EDI小组正在努力做这方面的事，他们
在研究一套适用于EDI的XML语法规则，可以通过 <a href="http://www.xmledi.com/">http://www.xmledi.com</a>了解他们的最新成果，也可以访问
        
        <a href="http://www.cenorm.be/isss/workshop/ec/xmledi/isss-xml.html">http://www.cenorm.be/isss/workshop/ec/xmledi/isss-xml.html</a>，这是ISSS下的一个ProjectGroup，也是研究这方面技术的。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10121">
						<span class="atitle">14、问：XML-Data与Schema有什么区别？</span>
				</a>
		</p>
		<p>
				<b>答：</b>在XML
中XML-Data与Schema的区别是细微的。通常我们将对数据的某种约束规则统一称之为Schema即模式，这种称法在数据库中广泛使用并被XML
所沿袭。从这一角度而言，DTD、XML-Data都可算是用于XML的某种Schema，凡是符合Schema约束的XML文档我们便称之为有效的
XML，为了区别起见，我们可以将XML-Data称之为XML-Data Schema。XML-Data
Schema最早由微软提出，并于1998年1月被W3C接受成为“建议”（Note），随后，在1999年W3C在XML-Data的基础上发布了
“XML Schema工作草案”，这也就是我们通常所说的XML Schema，XML
Schema于2001.5.2日正式发布为W3C标准。作为XML-Data的创建者，微软公司在XML Schema
V1.0尚未正式出炉前就已经在他的MSXML解析器、IE浏览器、Biztalk Server
2000中提供了对XML-Data的广泛支持（事实上它们支持的是XML-Data的一个子集），鉴于它与XML
Schema的血缘关系，我们通常也称其为Schema，即MS
Schema。基于XML-Data及其扩展的Schema有一共同特点，即Schema自身也都是标准的XML文档，这与传统的DTD规范是截然不同
的，这也是我们通常将XML约束简单划分为DTD与Schema的主要依据。需要指出的是，在IE、MSXML等工具中所支持的MS
Schema与目前W3C正式发! 布的XML Schema并不完全兼容（也就是说，在Biztalk Server
2000中建立的xsd文件未必会符合标准的XML Schema规范）。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1012D">
						<span class="atitle">15、问：请问如何在XML中实现对二进制数据（如图象、声音文件）的封装？</span>
				</a>
		</p>
		<p>
				<b>答：</b>通常有两种方法可以实现，第一种采用（外部的）未解析通用实体，如
      
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;!NOTATION bmp SYSTEM "bmp"&gt;<br />&lt;!ENTITY image1 SYSTEM "example.tif" NDATA bmp&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>第二种是将二进制数据文件进行Base64编码并直接嵌入XML元素中（也可以是其它的编码方式，但是要注意被编码的数据中不应包含符号"&gt;"）。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10140">
						<span class="atitle">16、问：请问使用SOAP的安全性怎样？</span>
				</a>
		</p>
		<p>
				<b>答：</b>SOAP
本身不提供安全特性，由于SOAP采用HTTP作为实际的数据传输协议，因此其安全性也沿袭了HTTP。通常我们可以使用标准的网络安全协议来实现基于
SOAP的数据传输安全，如SSL、S-HTTP、PCT、TLSP等。在某些情况下也可采用数据加密的方式，即在应用层先对输入参数和返回结果集进行加
密，然后再使用SOAP传递已加密的XML数据。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1014C">
						<span class="atitle">17、问：在SOAP中一般请求/响应的内容与格式如何去定义？还有如何实现客户端从服务器上获取响应的数据。也就是说用户从客户端想服务器端发送请求信息，结果用户是如何得到相应信息的？</span>
				</a>
		</p>
		<p>
				<b>答：</b>SOAP是使用HTTP协议的，其响应报头为"HTTP/1.1 200 OK"，内容类型为" text/xml"，你可以直接监听80端口，如果你是在VS环境中使用Microsoft SOAP toolkit的，可以到
        
        <a href="http://msdn.microsoft.com/xml/general/toolkit_intro.asp">http://msdn.microsoft.com/xml/general/toolkit_intro.asp</a>中下载工具包，只需通过API传入调用方法和参数值，其底层的调用是屏蔽的。有关SOAP中一般请求/响应的内容与格式定义的详细信息可参看
        
        <a href="http://www.cn.ibm.com/developerworks/xml/xmlb2b/index4.shtml">《XML 在传统制造业供应链中的应用分析（四）：选择XML信息流传递的协议 第一部分》</a>一文，也可访问
        
        <a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/">http://www.w3.org/TR/2000/NOTE-SOAP-20000508/</a>查看有关SOAP的最新提案。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10164">
						<span class="atitle">18、问：DOM2与DOM1相比有什么不同？</span>
				</a>
		</p>
		<p>
				<b>答：</b>DOM Level 2较DOM Level 1增加如下功能接口：
      
      </p>
		<ol>
				<li>视图（View）：提供视图与文档的联系</li>
				<li>样式表（Style Sheet）：提供访问和修改样式表的方法</li>
				<li>层叠样式表（CSS2）：提供CSS2兼容的方法</li>
				<li>事件（Events）：提供各种事件的接口</li>
				<li>文档遍历（Document traversal）：提供遍历文档层次的接口</li>
				<li>文档范围（Document range）：提供分割文档范围的接口</li>
		</ol>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10185">
						<span class="atitle">19、问：请问在HTML页面中该怎么使用DSO？</span>
				</a>
		</p>
		<p>
				<b>答：</b>XML
DSO是数据源对象（Data Source
Object）的缩写，它是微软为了在HTML页面中绑定使用XML数据所采用的一种专利技术，DSO在Web页中以数据岛的形式实现，即采用一个新的
"XML"标记，"XML"标记中包含一个id属性用于标识对XML DSO的引用。客户端的IE浏览器可以识别XML
DSO，并直接在客户端操作DSO数据源。一个典型的XML DSO数据源声明如下： </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xml id＝"exampledso"&gt;<br />&lt;!--Here is xml data body--&gt;<br />&lt;orderform&gt;<br />&lt;productname&gt;glove&lt;/productname&gt;<br />&lt;amount&gt;5000&lt;/amount&gt;<br />&lt;unit&gt;pair&lt;/unit&gt;<br />&lt;deadline&gt;2001.8.20&lt;/deadline&gt;<br />&lt;/orderform&gt;<br />&lt;/xml&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>也可以使用脚本语言定义DSO数据源，如：
 
        
        </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xml id＝"exampledso"&gt;&lt;/xml&gt;<br />&lt;script language="JavaScript"&gt;<br />exampledso.async=false;<br />xmldso.load("example.xml");<br />&lt;/script&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>成功声明了XML DSO后，就可以在HTML文档的其它地方通过"id"标识号（本例中为"exampledso"）来实现对DSO数据源的访问。如通过"datasrc"属性实现在HTML元素中对XML DSO的绑定：
 
        
        </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;table datasrc="exampledso" border=1 width=90%&gt;<br />&lt;tr&gt;<br />&lt;td&lt;span datafld="productname"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;td&lt;span datafld="amount"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;td&lt;span datafld="unit"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;td&lt;span datafld="deadline"&gt;&lt;/span&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>或
使用脚本语言来对"exampledso"数据源对象进行操作，如可通过下面的脚本从XML DSO数据源中得到产品的定购数量： Sub
getamount() amount.value = exampledso.recordset.Fields("amount") End Sub</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101A6">
						<span class="atitle">20、问：请问，我要做一个站点，让互联网用户可以了解查询我们公司的商品，我可以使用XML作为后台的Web数据库吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>XML
的确与数据库有相似之处，比如说它们都具有数据存储、数据有效性验证、数据查询、数据访问编程接口等特征，然而还有许多实际数据库所具备的功能是XML所
不具备的，如：索引、安全机制、事务机制、数据完整性、多用户访问，触发器、多文档查询等等。在实际应用中，对于一些数据量小、访问用户少、性能要求不高
的门户站点而言，将XML文档直接作为数据库使用是可能的，然而对于商业应用而言，后台还是应选择专门的数据库，如果访问数量较大的话，还可以考虑在数据
库与应用服务器之间采用XML作为信息缓存，其前提是数据库中对应数据的更新应是定期的，这样才能保证XML文件缓存中的数据在其生存期内与数据库中对应
数据相一致。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101B2">
						<span class="atitle">21、问：BizTalk Server 2000有哪些具体的功能，我可以用BizTalk Server 2000干什么？</span>
				</a>
		</p>
		<p>
				<b>答：</b>BizTalk
Server 2000是微软公司为商业用户在计算机网络应用中的信息交换所开发的企业级软件。BizTalk Server
2000提供了一系列工具以实现在商业网络环境中对分散的文档数据共享，并可编辑约束那些文档的规范。BizTalk Server
2000支持多种文档格式，并使用基于XML-Data的XML作为它自己的文档格式以及不同应用间信息传递的中间格式。在BizTalk
Server 2000中包含了以下工具： </p>
		<ol>
				<li>BizTalk Editor：可以导入、建立、编辑DTD、Schema和XML文档；</li>
				<li>BizTalk Mapper：允许用户将符合规范A的文档结构映射到符合规范B的文档结构；</li>
				<li>BizTalk Management Desk：建立、维护网络环境中不同应用之间的输入输出关系；</li>
				<li>BizTalk ServerAdministrator Console：BizTalk管理员控制台用于系统工程师管理、配置BizTalk服务器，包括BizTalk服务器组属性的设置，直接对文档队列进行操作管理等。</li>
		</ol>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101CD">
						<span class="atitle">22、问：SAX是W3C的正式标准吗？哪里可以获得SAX的资源？</span>
				</a>
		</p>
		<p>
				<b>答：</b>SAX
不是W3C的正式标准，事实上它与W3C没有任何瓜葛，SAX是Internet上一群XML解析器技术的热衷者共同研究的成果，David
Megginson是SAX研究开发工作的核心人物。作为一种基于事件的XML编程接口，SAX已被各种XML团体广泛认可，有关SAX的资料和下载可以
访问http://www.megginson.com/SAX获得。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101D9">
						<span class="atitle">23、问：使用浏览器浏览XML的速度比HTML快吗？</span>
				</a>
		</p>
		<p>
				<b>答：</b>通
常不会，XML与HTML的区别并不在于对浏览速度的改善，而在于XML是面向数据内容的，HTML是面向格式化显示的，计算机应用可以自动地理解XML
文档并实现对其各种操作（包括在浏览器中的格式化显示），XML的出现为万维网信息浏览模式提供了更丰富的空间。但只有在特殊情况下，人们可以在浏览
XML文档时获得速度上的好处，比如某人要查看新浪商城中的某件商品的详细信息，共有两页，第一页是关于商品的价格和功能介绍，第二页是关于生产厂家的背
景介绍，若采用HTML表示，需要建立两个HTML文件，而采用XML，只需建立一个XML文件（需结合XSLT使用），由于XML文件在浏览第一页时已
经获得，因此在浏览第二页时无需与Web服务器交换，当然，由于将两个文件的信息合一，因此在第一次浏览XML文档时速度会较慢。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-faq/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="郭路" src="http://www-128.ibm.com/developerworks/cn/i/p-guolu.gif" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>郭
路，杭州大学计算机系92届本科应用专业，曾先后就职于浙江省纺织经贸总公司计算机中心、思能软件、华企、飞时达等软件公司，担任技术主管，主要从事于企
业 MIS、GIS、ERP 及电子商务项目的开发管理和系统分析，对 IBM、微软、SUN、Autodesk
等公司的企业级产品有较深的研究及理解。 <a href="mailto:gl2_public@sina.com">mailto:gl2_public@sina.com</a></p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:44 <a href="http://www.blogjava.net/Vencent/articles/36737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML 及其相关技术认证入门::获得 XML 及其相关技术认证的理由和方法</title><link>http://www.blogjava.net/Vencent/articles/36738.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36738.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36738.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36738.html</trackback:ping><description><![CDATA[
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<p id="subtitle">
												<em>获得 XML 及其相关技术认证的理由和方法</em>
										</p>
										<img alt="" src="http://www.ibm.com/i/c.gif" class="display-img" height="6" width="1" />
								</td>
								<td class="no-print" width="192">
										<img alt="developerWorks" src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" height="18" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" align="right" border="0" cellpadding="0" cellspacing="0" width="160">
												<tbody>
														<tr>
																<td width="10">
																		<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
																</td>
																<td>
																		<table border="0" cellpadding="0" cellspacing="0" width="150">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="8" />
																										<input value="在软件开发这么一个充满竞争的世界里，能够“脱颖而出”显得十分重要。因此就有必要制定一些标准来衡量一个人对 XML 的熟悉程度。IBM 为 XML 及其相关技术提供了它自己的认证程序，而本文（由 WHIZlabs Software 的共同创始人 Pradeep Chopra 撰写）则向您显示了应对这一考试的一些策略：有用的启示、参考资料和考试样题能够帮助您踏上认证成功之路！" name="body" type="hidden" />
																										<input name="subject" value="XML 及其相关技术认证入门" type="hidden" />
																										<input name="lang" value="cn" type="hidden" />
																										<table border="0" cellpadding="0" cellspacing="0" width="143">
																												<form action="https://www-128.ibm.com/developerworks/secure/email-it.jsp" name="email">
																												</form>
																												<script language="JavaScript" type="text/javascript">
																														<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																												</script>
																												<tbody>
																														<tr valign="top">
																																<td width="8">
																																		<img src="http://www.ibm.com/i/c.gif" alt="" height="1" width="8" />
																																</td>
																																<td width="16">
																																		<img src="http://www.ibm.com/i/v14/icons/em.gif" alt="将此页作为电子邮件发送" height="16" vspace="3" width="16" />
																																</td>
																																<td width="122">
																																		<p>
																																				<a class="smallplainlink" href="javascript:document.email.submit();">
																																						<b>将此页作为电子邮件发送</b>
																																				</a>
																																		</p>
																																</td>
																														</tr>
																														<noscript>
																																<tr valign="top">
																																		<td width="8">
																																				<img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" />
																																		</td>
																																		<td width="16">
																																				<img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" />
																																		</td>
																																		<td class="small" width="122">
																																				<p>
																																						<span class="ast">未显示需要 JavaScript
的文档选项</span>
																																				</p>
																																		</td>
																																</tr>
																														</noscript>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>级别: 中级</p>
										<p>
												<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#author">Pradeep Chopra</a>, 共同创始人, Whizlabs<br /></p>
										<p>2003 年  8 月  01 日</p>
										<blockquote>在
软件开发这么一个充满竞争的世界里，能够“脱颖而出”显得十分重要。因此就有必要制定一些标准来衡量一个人对 XML 的熟悉程度。IBM 为 XML
及其相关技术提供了它自己的认证程序，而本文（由 WHIZlabs Software 的共同创始人 Pradeep Chopra
撰写）则向您显示了应对这一考试的一些策略：有用的启示、参考资料和考试样题能够帮助您踏上认证成功之路！</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>IBM 是第一个为 XML
及其相关技术提供认证的组织。随着 XML 越来越流行，这项认证也获得了人们的青睐，现在它是开发人员最希望获得的认证之一。按照 IBM
的说法，这项认证的目的是为了让开发人员具备设计和实现使用 XML 及其相关技术（如 XML Schema、XSLT 以及
XPath）的应用程序所必需的知识。</p>
										<p>IBM 认证的 XML 开发人员还：</p>
										<ul>
												<li>对 XML 基础知识有很深的理解</li>
												<li>了解 XML 概念及相关技术</li>
												<li>理解数据如何与 XML 相联系，尤其要了解信息建模、XML 处理、XML 呈现和 Web 服务这类问题</li>
												<li>全面了解与 XML 有关的 W3C 核心建议书</li>
												<li>熟悉众所周知的最佳实践</li>
										</ul>
										<p>这项考试名为“
        <a href="http://www-128.ibm.com/developerworks/cn/xml/theme/x-cert.html" target="_new">IBM Certified Developer -- XML and Related Technologies (Test 141)</a>”，自推出以来已经过了几次修改。它涵盖了从开发人员的角度出发的全部相关目标。
      </p>
										<p>我将在本文中向您显示如何成功地通过这项考试。文章本身提供了一系列答题技巧，此外还包括了一系列极其有用的
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>和大量的
        <a href="http://www.ibm.com/developerworks/xml/library/x-xmlcert/xmlcertques.html">样题</a>— 所有这些对于帮助您提高分数是绰绰有余了。
      </p>
										<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
												<tbody>
														<tr>
																<td width="10">
																		<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
																</td>
																<td>
																		<table border="1" cellpadding="5" cellspacing="0" width="100%">
																				<tbody>
																						<tr>
																								<td bgcolor="#eeeeee">
																										<a name="N1006C">
																												<b>考试细节</b>
																										</a>
																										<br />
																										<p>考试编号：141</p>
																										<p>先决条件：无</p>
																										<p>题量：57</p>
																										<p>考试形式：多选题</p>
																										<p>通过成绩：58%</p>
																										<p>考试时间：90 分钟</p>
																										<p>费用：150 美元（或根据地区定价）</p>
																										<p>
																												<a href="http://www-128.ibm.com/developerworks/cn/xml/theme/x-cert.html" target="_new">在这里找到有关这项考试的更多信息。</a>
																										</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<p>
												<a name="0">
														<span class="atitle">您需要了解什么</span>
												</a>
										</p>
										<p>在这项考试的基于方案的问题中，您经常会发现某个给定的问题可能有几个正确答案。这种情形要求您选择
        <i>最</i>合适或
        <i>最不</i>合适的选项。这使得这项考试比类似的考试（如为 Sun 认证 Java 程序员（Sun Certified Java Programmer, SCJP — 请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>）设置的考试）要难一点。
      </p>
										<p>考试由 57 道题组成，您必须答对其中的 58%（33 道题）才能及格。每道题的分数都一样。规定的考试时间是 90 分钟。这项认证考试的费用是 150 美元（或根据地区定价）。请访问
        <a href="http://www.ibm.com/developerworks/cgi-bin/click.cgi?url=http://www-1.ibm.com/certify/certs/ad_registration.shtml&amp;origin=x" target="_new">IBM 专业认证</a>站点以获取更多详细信息。
      </p>
										<br />
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
																		<br />
																		<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" align="right" cellpadding="0" cellspacing="0">
												<tbody>
														<tr align="right">
																<td>
																		<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
																		<br />
																		<table border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td valign="middle">
																										<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																										<br />
																								</td>
																								<td align="right" valign="top">
																										<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#main" class="fbox">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="1">
														<span class="atitle">您需要做什么</span>
												</a>
										</p>
										<p>准
备这项考试所需的时间比类似的考试（如 SCJP
考试）要略多一些。所涵盖的技术的数量以及考题的类型（基于方案的）都使得这项考试有些难度。一般而言，假定每天进行两个小时的准备工作，那么无论如何您
将需要大约三到六个月来进行准备。如果您对 XML 完全陌生，那么估计您要花六个月来准备；否则，如果您具备一些 XML 知识，那么三个月应该够了。</p>
										<p>您
不必通过任何资格考试就有资格参加 IBM XML
认证考试。不过，如果您认真对待这项考试，那就应该了解一些事情。您应该具备编程／脚本编制方面的一些背景知识，还应该理解基本计算机科学模型和数据结
构。特别的是，具备 XML 实践知识将是一个十分有利的条件。XML
广泛用于各种联机和脱机文档，因此您需要熟悉诸如浏览器、客户机-服务器和格式化／样式化之类的概念。您还应该牢固掌握与电子商务有关的过程，如：</p>
										<ul>
												<li>在线获取订单</li>
												<li>完成那些订单</li>
												<li>在因特网上进行金融交易</li>
												<li>与供应商和客户交换数据</li>
												<li>维护库存信息</li>
										</ul>
										<p>请访问
        <a href="http://www-128.ibm.com/developerworks/cn/xml/theme/x-cert.html" target="_new">IBM XML 认证站点</a>，以获取有关这项考试的先决条件的更多信息。
      </p>
										<p>这
项考试中的大多数试题都是基于方案的，这意味着要求您对给定体系结构的比较、局限和能力加以分析，并陈述这一体系结构与某个特定方案的适合程度。因此，拥
有设计和实现应用程序的经验十分重要。由于在任何数据敏感的应用程序中数据结构都起着至关重要的作用，因此清晰地理解以下问题是十分重要的：信息如何在数
据库里存储，各部分信息如何相互链接以及它们之间有何关系。</p>
										<p>如果您是个初学者，那么您的准备工作应该从学习 XML 基本概述开始，如一本不错的教材或一篇基础入门教程／文章（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>）。XML 及其相关技术涵盖了众多主题，您应该循序渐进地学习这些主题。虽然这份材料的大部分并不十分复杂，但完全理解 XML 在各种应用程序中的用法和它所提供的优点还是要花一些时间。Elliotte Rusty Harold 的
        <i>XML Bible</i>（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>）可以作为一个不错的起点。
      </p>
										<p>熟悉了 XML 的基础知识之后，继续开发一些实际的应用程序，这样您就能够更好地理解有关如何在应用程序中使用这一技术的基本原理。为此，您可以挑选一本更高级的教材，如
        <i>Professional XML，第二版</i>（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>），它是这项考试的最佳书籍。虽然编写该书的目的并不是为了让读者用它来准备这一特定认证，但
        <i>Professional XML</i>确
实涵盖了全部相应的主题，而且涵盖程度相当深。尽可能透彻地阅读此书；尤其要注意示例，并且不仅要努力理解技术，还要理解其用法和利弊。该书还含有到免费
工具／IDE 的链接，您可以用它们来制作类似于书中示例的样本应用程序，在日常工作中使用这些工具吧。拥有这一实践经验对您而言至关重要。 </p>
										<p>一旦您按照我所描述的那样学完了
        <i>Professional XML</i>，您也就完成了大部分准备工作。接下来，您需要细化一下您的知识。为此，我建议您阅读 Web 上的各种文章和教程。这里，W3C 规范特别有帮助。虽然考前阅读所有这些文章或教程并非绝对至关重要，但它们可以使您对细节获得更细致的理解，有助于您准确地掌握概念。
      </p>
										<p>现在，余下唯一要做的事情是实践、实践、再实践。您应该编写尽可能多的样本 XML 应用程序。阅读 XML 在各种方案中的用法。和您的考友一起讨论如何在不同的体系结构中使用 XML。研究各种与 XML 有关的技术的优缺点。例如：</p>
										<ul>
												<li>为什么在某种特定情形下使用 SAX 而不是 DOM（或者相反）？</li>
												<li>为什么使用 DTD 而不是 XML Schema（或者相反）？</li>
												<li>如何通过使用 XML Schema 来克服 DTD 的某个特定局限？</li>
												<li>XLink 较之 HTML 链接有哪些优点？</li>
												<li>XSL 较之 CSS 有哪些优点？</li>
												<li>XSL 有哪些功能，为什么它比任何其它样式语言都要强大得多？</li>
										</ul>
										<p>不要通过猜想解决这些问题，要搞清楚这些问题是如何影响实际应用程序的 — 否则，您可能无法将它们应用到考试给出的方案中去。</p>
										<p>最后，该练习类似实际考题的题目了。我已经包含了一系列
        <a href="http://www.ibm.com/developerworks/xml/library/x-xmlcert/xmlcertques.html">样题</a>供您作为起点使用，然后请寻找尽可能多的模拟试题来进行练习。您也可以使用市面上大量的考试模拟器来进行练习。当然，IBM 样题是
        <i>必需的</i>。您将在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#4">参考资料</a>中
找到到所有这些模拟考试和考试模拟器的链接 —
借此来找到您的薄弱之处，然后集中精力加以巩固。最好提前面对这些薄弱之处，而不要在考试中面对它们并得到不理想的成绩。为了帮助提高您比较薄弱的环节，
您甚至可能会考虑聘请一位私人教师，如果您对上面所描述的许多关键方面都不是十分自信，那么我强烈建议您这么做。 </p>
										<p>这项考试规定的考试时间是 90
分钟，我收到许多考生的来信，他们表示：这个时间正好够完成考试。大多数考生答完全部问题需要 70 到 80
分钟，因此没有多少剩余时间供考生进行修改。这意味着您应该尽全力来一次答对试题。当您开始在热身考试中获得好成绩并且对上面所列的大多数主题都有信心
时，您就可以参加 XML 认证考试了。</p>
										<br />
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
																		<br />
																		<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" align="right" cellpadding="0" cellspacing="0">
												<tbody>
														<tr align="right">
																<td>
																		<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
																		<br />
																		<table border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td valign="middle">
																										<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																										<br />
																								</td>
																								<td align="right" valign="top">
																										<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#main" class="fbox">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="2">
														<span class="atitle">技巧与缺陷</span>
												</a>
										</p>
										<p>以下是最后几条忠告，用来帮您规划您的考试策略：</p>
										<p>
										</p>
										<ul>
												<li>在学习某个特定主题的过程中，要尽量从宏观上去理解，而不要过分追究其细节。大多数试题都测试您对概念的
            <i>理解</i>，而不测试您所掌握的语法。学习 XML 应用程序的各个组件：

            <ul><li>这些组件之间是如何相互结合的？</li><li>哪一个组件起什么作用？</li><li>组成 Web 服务的各个组件分别是什么，它们是怎样作为一个整体工作的？</li></ul>
很多时候，您可以通过识别出某些组件不具备您要的功能来排除错误选项。例如，SAX 和 DOM 同如何呈现 XML 文档无关；又例如，您正在使用的解析器必须与您的处理 API（SAX 或 DOM）兼容。
            <br /><br /></li>
												<li>试着从实践的角度了解各种技术的用法。只是读读概念并不能达到目的 — 您
            <i>必须</i>编写样本应用程序。对类似下面的问题进行研究，以搞清楚这些技术实际上是如何工作的：

            <ul><li>某个特定 XPath 查询将产生什么结果？</li><li>如果将某个给定 XSL 样式表应用于某个给定 XML 文档，将会输出什么？</li><li>会按照给定模式或 DTD 对某个特定 XML 文档进行验证吗？</li><li>如何使用 XLink 来使链接文档维护起来更有效、更方便？</li></ul><br /></li>
												<li>不要孤立地学习这些技术。将它们与其替代技术加以比较，彻底掌握各种技术的优点与不足。例如，DOM 和 SAX、XSL 和 CSS 以及 DTD 和 XML Schema。

            <ul><li>在什么情况下 DOM 比 SAX 更好或者相反？</li><li>可以用 XSL 但不能用 CSS 做哪些事情？</li><li>XML Schema 是如何除去各种与 DTD 有关的局限的呢？</li><li>比起 DTD，XML Schema 有哪些优点？</li></ul><br /></li>
												<li>不仅要学习 XML 及其相关技术的特性，还要学习如何将它们应用到现实世界中去，以及它们如何改变我们解决问题的方式。例如：

            <ul><li>XML 如何能减少供应商和客户的集成开销成本？</li><li>XML 如何使具有不同平台、不同设备但却有相同信息的客户的要求变得更容易满足？</li><li>Web 服务背后的核心价值是什么？</li></ul></li>
										</ul>
										<br />
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
																		<br />
																		<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" align="right" cellpadding="0" cellspacing="0">
												<tbody>
														<tr align="right">
																<td>
																		<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
																		<br />
																		<table border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td valign="middle">
																										<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																										<br />
																								</td>
																								<td align="right" valign="top">
																										<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#main" class="fbox">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="3">
														<span class="atitle">结束语</span>
												</a>
										</p>
										<p>显
然，XML 的流行已成定局，掌握 XML 专业技能的人的数目和 XML
相关技术的数目都在不断增加。这项认证考试略微有些难度，与其它技术相比，它可用的参考资料要少一些。虽然 IT
业正处于低迷期，但它很快就会重新全速发展。收获果实的将是那些采取主动且进行了准备的人。因此，行动起来，制定一个计划，现在就开始准备！</p>
										<p>一路顺风 — 最重要的是，要开心！</p>
										<br />
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
																		<br />
																		<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" align="right" cellpadding="0" cellspacing="0">
												<tbody>
														<tr align="right">
																<td>
																		<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
																		<br />
																		<table border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td valign="middle">
																										<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																										<br />
																								</td>
																								<td align="right" valign="top">
																										<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#main" class="fbox">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">参考资料 </span>
												</a>
										</p>
										<ul>
												<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-xmlcert/index.html">英文原文</a>.
        <br /><br /></li>
												<li>
														<b>书籍、文章和教程</b>
														<ul>
																<li>
																		<i>
																				<a href="http://www.amazon.com/exec/obidos/ASIN/1861005059/qid=1036214947/sr=2-1/ref=sr_2_1/102-0630418-2014509">Professional XML 第二版</a>
																		</i>涵盖了考纲中的全部相关技术，并且深度适当。从认证的观点来看，它是一本
              <i>必备书籍</i>。
              <br /><br /></li>
																<li>
																		<i>
																				<a href="http://www.ibiblio.org/xml/books/bible2/">XML Bible</a>
																		</i>是一个不错的起点，但别靠它完成整个准备工作。
              <br /><br /></li>
																<li>
																		<a href="http://www.w3schools.com/">W3Schools.com</a>提供了一系列优秀教程，用来帮助您提高办事速度。
              <br /><br /></li>
																<li>
																		<a href="http://www.zvon.org/index.php?nav_id=tutorials&amp;mime=html">ZVON.org</a>也提供了一系列优秀的 XML 教程和文章。
              <br /><br /></li>
																<li>Doug Tidwell 的
              <i>developerWorks</i>教程“
              <a href="http://www.ibm.com/developerworks/education.nsf/xml-onlinecourse-bytitle/8C8A8628B3DD7EDB852567BD000A8A64?OpenDocument">Introduction to XML</a>”为初学者提供了扎实的基础知识。（2002 年 8 月）
              <br /><br /></li>
																<li>Pradeep Chopra 还写过
              <a href="http://www.ibm.com/developerworks/java/library/j-scjp/">Sun 认证 Java 程序员（SCJP）考试入门</a>（
              <i>developerWorks</i>，2002 年 10 月）。
              <br /><br /></li>
																<li>Venu Vasudevan 的
              <i><a href="http://www.xml.com/pub/a/ws/2001/04/04/webservices/index.html">A Web Services Primer</a></i>提供了另外一些有关这一主题的详细信息。
            </li>
														</ul>
														<br />
														<br />
														<br />
												</li>
												<li>
														<b>网站和组</b>
														<ul>
																<li>
																		<a href="http://www.w3.org/">W3C（万维网联盟，World Wide Web Consortium）</a>是寻找 XML 相关内容的第一个也是最好的地方。您将在这里找到所有相关规范。
              <br /><br /></li>
																<li>访问一下
              <a href="http://www.javaranch.com/index.jsp">Javaranch</a>，在那里您会发现有很多人愿意帮助您解决问题。这个讨论组十分活跃。
              <br /><br /></li>
																<li>
																		<a href="http://groups.yahoo.com/group/xml-cert">XML-CERT</a>是另外一个 XML 认证讨论组。
              <br /><br /></li>
																<li>访问
              <a href="http://www.saxproject.org/">saxproject.org</a>，在那里你会找到有关 SAX 即用于 XML 的简单 API（Simple API for XML）的全部详细信息。
              <br /><br /></li>
																<li>developerWorks
              <a href="http://www.ibm.com/developerworks/xml/">XML 专区</a>的特点是拥有大量有关 XML 及其相关技术的教程、专栏文章和技巧文章。
              <br /><br /></li>
																<li>
																		<a href="http://www.xml.com/">XML.com</a>是最权威的 XML 内容站点之一。
              <br /><br /></li>
																<li>
																		<a href="http://www.xml.org/">XML.org</a>的特点是拥有一个 XML 开发人员社区而且包含高质量的 XML 内容。
              <br /><br /></li>
																<li>
																		<a href="http://www.perfectxml.com/">PerfectXML.com</a>是另一个不错的 XML 站点。
              <br /><br /></li>
																<li>
																		<a href="http://www.xmlpitstop.com/">XMLpitstop.com</a>也是另外一个不错的 XML 站点。
              <br /><br /></li>
																<li>
																		<a href="http://b.webring.com/hub?ring=xml">XML WebRing</a>精心收集了一些 XML 站点。
            </li>
														</ul>
														<br />
														<br />
														<br />
												</li>
												<li>
														<b>练习材料</b>
														<ul>
																<li>作者曾写过一系列
              <a href="http://www.ibm.com/developerworks/xml/library/x-xmlcert/xmlcertques.html">样题</a>，它们类似于您将在 IBM XML 认证考试中所见到的试题。
              <br /><br /></li>
																<li>IBM 有它自己的免费多项选择
              <a href="http://www-1.ibm.com/certify/tests/sam141.shtml">预评估／样题</a>，用来帮助您准备这项考试。
              <br /><br /></li>
																<li>
																		<a href="http://www.xmlspy.com/">XML Spy</a>是一个可以从市面上得到的、用于 XML 的最佳 IDE。
              <br /><br /></li>
																<li>
																		<a href="http://xml.apache.org/">Apache 站点</a>中精心收集了一些使用 XML 的工具。
              <br /><br /></li>
																<li>
																		<a href="http://www.whizlabs.com/products/xmlwhiz/xmlwhiz.html">XML@Whiz</a>是唯一一个可以从市面上得到的 XML 认证考试模拟器。它对在考试中取得好成绩很有帮助。
            </li>
														</ul>
														<br />
												</li>
										</ul>
										<br />
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
																		<br />
																		<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" align="right" cellpadding="0" cellspacing="0">
												<tbody>
														<tr align="right">
																<td>
																		<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
																		<br />
																		<table border="0" cellpadding="0" cellspacing="0">
																				<tbody>
																						<tr>
																								<td valign="middle">
																										<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																										<br />
																								</td>
																								<td align="right" valign="top">
																										<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xmlcert/#main" class="fbox">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="author">
														<span class="atitle">关于作者</span>
												</a>
										</p>
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td colspan="3">
																		<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
																</td>
														</tr>
														<tr align="left" valign="top">
																<td>
																		<br />
																</td>
																<td>
																		<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
																</td>
																<td width="100%">
																		<p>Pradeep Chopra 是
        <a href="http://www.whizlabs.com/">WHIZlabs Software</a>的
共同创始人之一，这是一家电子学习组织，专注于从事 IT 认证考试模拟器和企业技能评估系统的开发。Pradeep
毕业于印度德里（Delhi）的印度理工大学（Indian Institute of Technology），他已经编写了 J2EE 领域的许多
IT 认证考试模拟器、教程和文章。可以通过 <a href="mailto:pradeep@whizlabs.com">pradeep@whizlabs.com</a>与他联系。
      </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:44 <a href="http://www.blogjava.net/Vencent/articles/36738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧：XML 格式的 Javadoc::为报表使用 XML 格式的 Javadoc 输出</title><link>http://www.blogjava.net/Vencent/articles/36736.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36736.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36736.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36736.html</trackback:ping><description><![CDATA[
		<p>级别: 中级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#author">Jack Herrington</a>, 主编, Code Generation Network<br /></p>
		<p>2005 年  5 月  16 日</p>
		<blockquote>在 Java 代码中蕴涵着许多有价值的信息：所有类和接口，以及它们的实例变量和方法。您可以使用这些数据来创建文档，构建代码生成器，或者为项目报表提供度量标准。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>Javadoc
是一个非常分解良好的应用程序。很多人认为它只是一个从一组 Java™ 文件中读取代码和注释来创建 HTML
的程序。但事实上，这款工具分为两个部分。第一部分是代码分析引擎，用来解析代码和注释。第二部分生成 HTML，但结果是，您可以使用称为 <b>doclets</b> 的扩展来改变这一部分。</p>
		<p>对于本技巧，我使用 JELDoclet（参阅 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#resources">参考资料</a>） 从一组测试 Java 文件生成一个 XML 输出文件。然后，再使用 XSL 把这个 XML 文件格式化成一个简单的 HTML 文件。该 HTML 文件展示了 XML 文件所包含的数据。</p>
		<p>下载 JELDoclet 后，使用下面的命令语法在一组文件上运行 JELDoclet： </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />javadoc -doclet JELDoclet -docletpath .. *.java<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p> JELDoclet 的 <code>test</code> 目录包含一组测试 Java 文件。这个命令解析 test 目录中的所有 Java 文件，并且创建一个称为 out.xml 的文件。这个文件包含了 Javadoc 树中的所有信息。清单 1 展示了这个输出 XML 文件的一部分。</p>
		<br />
		<a name="code1">
				<b>清单 1. JELDoclet 输出 XML 文件</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;jel&gt;<br />&lt;class superclass="Object" name="MyInterClass"&gt;<br />  &lt;extend name="MyInterface"&gt;<br />  &lt;/extend&gt;<br />  &lt;comment&gt;<br />  My interface implemented<br />  &lt;/comment&gt;<br />  &lt;fields&gt;<br />    &lt;field visibility="protected"<br />     fulltype="java.lang.String"<br />     type="String" name="_prot_string"&gt;<br />       &lt;comment&gt;<br />       A protected string<br />       &lt;/comment&gt;<br />    &lt;/field&gt;<br />    &lt;field visibility="public"<br />     fulltype="java.lang.String"<br />     type="String" name="_pub_string"&gt;<br />       &lt;comment&gt;<br />       A public string<br />       &lt;/comment&gt;<br />    &lt;/field&gt;<br />  &lt;/fields&gt;<br />  &lt;methods&gt;<br />    &lt;constructor visibility="public" name="MyInterClass"&gt;<br />       &lt;comment&gt;<br />       A no-argument constructor<br />       &lt;/comment&gt;<br />    &lt;/constructor&gt;<br />    &lt;constructor visibility="public" name="MyInterClass"&gt;<br />       &lt;params&gt;<br />         &lt;param fulltype="java.lang.String"<br />          type="String" comment="A string."<br />          name="aString"&gt;<br />         &lt;/param&gt;<br />...<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>jel</code> 标签包含了一系列 <code>class</code> 标签 —— 每个类对应一个。在 <code>class</code> 标签中是字段、方法和构造函数。XML 文件也包含相关的注释。</p>
		<p>
				<a name="N1007F">
						<span class="atitle">从 XML 创建 HTML </span>
				</a>
		</p>
		<p>为这个 XML（<a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#code1">清单 1</a>中）生成 HTML 的第一步是从清单 2 中的基本标签模板开始。</p>
		<br />
		<a name="code2">
				<b>清单 2. 基本 HTML 模板</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;xsl:stylesheet<br /> xmlns:xsl=http://www.w3.org/1999/XSL/Transform<br /> version="2.0"&gt;<br /><br />&lt;xsl:output method="html" /&gt;<br /><br />&lt;xsl:template match="/"&gt;<br />  &lt;html&gt;&lt;head&gt;&lt;title&gt;XDoclet output&lt;/title&gt;<br />  &lt;xsl:call-template name="css" /&gt;<br /><br />  &lt;/head&gt;<br />  &lt;body&gt;<br />    &lt;xsl:for-each select="/jel/class"&gt;<br /><br />      &lt;h1&gt;<br />        &lt;xsl:choose&gt;<br />          &lt;xsl:when test="@abstract='true'"&gt;Interface:<br />          &lt;xsl:value-of select="@name" /&gt;&lt;/xsl:when&gt;<br />          &lt;xsl:otherwise&gt;Class<br />          : &lt;xsl:value-of select="@name" /&gt;<br />           ( &lt;xsl:value-of select="@superclass" /&gt; )<br />          &lt;/xsl:otherwise&gt;<br />        &lt;/xsl:choose&gt;<br />      &lt;/h1&gt;<br /><br />      &lt;h2&gt;Instance Variables&lt;/h2&gt;<br />      &lt;xsl:apply-templates select="fields/field" /&gt;<br /><br />        &lt;h2&gt;Constructors&lt;/h2&gt;<br />        &lt;xsl:apply-templates select="methods/constructor" /&gt;<br /><br />      &lt;h2&gt;Methods&lt;/h2&gt;<br />      &lt;xsl:apply-templates select="methods/method" /&gt;<br /><br />      &lt;hr/&gt;<br />    &lt;/xsl:for-each&gt;<br />  &lt;/body&gt;<br />  &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在清单 2 的开始，我创建了 <code>html</code> 根标签和 <code>head</code> 部分。然后，我迭代了输入文件中的每个类。对于每个类，我在 <code>h1</code> 标签中输出类或接口的名称，并为 <code>fields</code>、<code>constructors</code> 和 <code>methods</code> 应用模板。接着，我通过结束 <code>body</code> 和 <code>html</code> 标签而结束整个清单。</p>
		<p>用于构建字段 HTML 的模板非常简单，如清单 3 所示。</p>
		<br />
		<a name="N100C2">
				<b>清单 3. 字段模板</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;xsl:template match="field"&gt;<br />  &lt;p class="field"&gt;<br />    &lt;xsl:value-of select="@visibility" /&gt;<br />    &lt;xsl:text&gt; &lt;/xsl:text&gt;<br />    &lt;xsl:value-of select="@type" /&gt;<br />    &lt;xsl:text&gt; &lt;/xsl:text&gt;<br />    &lt;xsl:value-of select="@name" /&gt;<br />  &lt;/p&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>简洁的内容：我只输出了可见性、类型和名称。我使用了一个带有 <code>class</code> 字段的 <code>paragraph</code> 标签把它们括起来。后面在 CSS 中将用到 <code>class</code> 字段。</p>
		<p>方法和构造函数模板与字段模板类似，如清单 4 所示。</p>
		<br />
		<a name="N100DF">
				<b>清单 4. 方法和构造函数模板</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;xsl:template match="method"&gt;<br />  &lt;p class="method"&gt;<br />    &lt;xsl:value-of select="@visibility" /&gt;<br />    &lt;xsl:text&gt; &lt;/xsl:text&gt;<br />    &lt;xsl:value-of select="@type" /&gt;<br />    &lt;xsl:text&gt; &lt;/xsl:text&gt;<br />    &lt;xsl:value-of select="@name" /&gt;(<br />    &lt;xsl:apply-templates select="params" /&gt;<br />  )&lt;/p&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="constructor"&gt;<br />  &lt;p class="method"&gt;<br />    &lt;xsl:value-of select="@visibility" /&gt;<br />    &lt;xsl:text&gt; &lt;/xsl:text&gt;<br />    &lt;xsl:value-of select="@name" /&gt;(<br />    &lt;xsl:apply-templates select="params" /&gt;<br />  )&lt;/p&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这里惟一的诀窍是，我需要将参数列表输出到每个构造函数或方法中。我使用 <code>xsl:apply-templates</code> 标签来处理，这个标签用来为 <code>params</code> 标签找到正确的模板 —— 在本例中，清单 5 展示了这个模板。</p>
		<br />
		<a name="N100F5">
				<b>清单 5. 参数模板</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;xsl:template match="params"&gt;<br /> &lt;xsl:for-each select="param"&gt;<br />  &lt;xsl:if test="position()&gt;1"&gt;, &lt;/xsl:if&gt;<br />  &lt;xsl:value-of select="@type" /&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;<br />  &lt;xsl:value-of select="@name" /&gt;<br /> &lt;/xsl:for-each&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这里最吸引人的地方是，我想要在列表中的两个参数间插入逗号。因此我使用 <code>xsl:if</code> 命令，在第 2 个参数或后面的参数上插入逗号。</p>
		<p>XSL 模板的最后一部分是 CSS，它使输出内容更加容易阅读（参阅清单 6）。</p>
		<br />
		<a name="N1010A">
				<b>清单 6. CSS 模板</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;xsl:template name="css"&gt;<br />&lt;style&gt;<br />    body { font-family: Arial, Verdana, sans serif;<br /><br />       font-size: small; }<br />    .method, .field { padding-left:50px; }<br />&lt;/style&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>使用诸如 Arial 或 Verdana 这样的 sans-serif 字体，以使输出更加容易阅读。您可能使用的是 Courier 字体，但是我认为它会使页面看起来非常单调，并且让人觉得好像是用古老的打印机输出来的。最后，输出的结果看起来像图 1 那样。</p>
		<br />
		<a name="N10116">
				<b>图 1. 浏览器显示的最终 HTML</b>
		</a>
		<br />
		<img alt="最终 HTML" src="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/figure01.gif" height="430" width="600" />
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10125">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>格
式化 HTML 仅仅是您可以对 Javadoc 工具的 XML 输出所做的事情之一。您可以像 XDoclet 所做的一样，使用 Javadoc
树中的信息（这里导出为 XML）来加强代码生成器的功能。您可以像 Eclipse 或 IntelliJ
一样，执行代码引用分析和重构。您也可以得到关于代码基的度量标准。获得 Java 代码完整的、结构化的 XML 表示，有助于提高您的生产力。 </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li> 您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/xml/library/x-tipjdoc/" target="_blank">英文原文</a>。<br /><br /></li>
				<li>访问 W3C 的 <a href="http://www.w3c.org/Style/XSL">XSL 标准站点</a>，它使您便于参考 XSL 技术和标准。<br /><br /></li>
				<li>检查 W3C 的 <a href="http://www.w3c.org/TR/xpath">XPath 页面</a>，它提供了版本和标准信息。<br /><br /></li>
				<li>下载 <a href="http://saxon.sf.net/">Saxon</a>，它是流行的 XSL 处理器，在撰写这篇文章时我用到了它。<br /><br /></li>
				<li>阅读  Michael Kay 的 <a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0764569090"><i>XSLT 2.0 Programmer's Reference</i></a>，它是 XSLT 的圣经，是一部介绍精彩、非常有价值的参考文献。<br /><br /></li>
				<li>当您手忙脚乱时，请拿起 Michael Kay 著作的 <a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0764569104"><i>XPath 2.0 Programmer's Reference</i></a> —— 终极参考，作者曾编写过 W3C 规范。<br /><br /></li>
				<li>阅读 Jack D. Herrington 著作的 <a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=1930110979"><i>Code Generation in Action</i></a>，它讲述了为各种目标（不只限于数据库访问）生成代码。<br /><br /></li>
				<li>参阅 <a href="http://java.sun.com/j2se/javadoc">Javadoc 首页</a> 了解关于 Sun Microsystems 的 Javadoc 工具的更多信息。<br /><br /></li>
				<li>了解更多关于 <a href="http://jeldoclet.sourceforge.net/">JELDoclet</a> 的信息，它是本文用于创建输入 XML 的 Doclet 扩展。<br /><br /></li>
				<li>浏览 <a href="http://www.doclet.com/">Doclet.com</a>，它是用于 Javadoc 工具的 Doclet 扩展的知识库。<br /><br /></li>
				<li>试用 <a href="http://xdoclet.sourceforge.net/xdoclet/index.html">XDoclet</a>，它是优秀的代码生成器，最初基于 Javadoc 框架。<br /><br /></li>
				<li>在 <a href="http://www-128.ibm.com/developerworks/cn/xml/">developerWorks XML 专区</a> 可以找到很多 XML 参考资料。<br /><br /></li>
				<li>了解如何才能成为 <a href="http://www-03.ibm.com/certify/certs/adcdxmlrt.shtml">IBM 认证的 XML 及相关技术的开发人员</a>。<br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-tipjdoc/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p> Jack Herrington  是一名有着 20 多年工作经验的杰出工程师，现任 <a href="http://www.codegeneration.net/">Code Generation Network</a> 公司的主编。他同时也是 <a href="http://www.codegeneration.net/cgia"><i>Code Generation in Action</i></a> 一书的作者。您可以通过电子邮件 <a href="mailto:jack_d_herrington@codegeneration.net?subject=Tip&amp;cc=dwxed@us.ibm.com">jack_d_herrington@codegeneration.net</a> 与他联系。
	</p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:43 <a href="http://www.blogjava.net/Vencent/articles/36736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML认证教程，第 4 部分: XSL样式单</title><link>http://www.blogjava.net/Vencent/articles/36733.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36733.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36733.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36733.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#author">IBM</a>, 作者<br /></p>
		<p>2003 年  3 月  01 日</p>
		<blockquote>对于一批XML数据，应用处理程序要综合XML文档、文档类型说明（Dtd/Schema） 以及样式单三方面要素来处理和显示它。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="0">
						<span class="atitle">什么是样式单</span>
				</a>
		</p>
		<p>对于一批XML数据，应用处理程序要综合XML文档、文档类型说明（Dtd/Schema）
以及样式单三方面要素来处理和显示它。</p>
		<p>在XML文档中只包含了数据信息，并没有涉及文档如何显示。不错，制定XML标准的
目的是要使数据结构化，赋予其明确的语意，使之易于进行数据交换。XML早已不再
把目光局限在文字图象的显示上，而是要建立它们之间的内在关系。可以说，XML文
档本身是重内容而不重形式。</p>
		<p>可是，XML结构化地组织信息固然好，但如果不加修饰地把一大堆枯燥的数据摆在那里，也足以令人眼花头痛。</p>
		<p>样式单(StyleSheet)是一种专门描述结构文档表现方式的文档，它既可以描述这些
文档如何在屏幕上显示，也可以描述它们的打印效果，甚至声音效果。样式单一般不
包含在XML文档内部，而以独立的文档方式存在。</p>
		<p>样式单可以实现非常复杂的显示效果，但由于样式描述与数据描述相分离，显示细节
的描述并不影响文档中数据的内在结构。</p>
		<p>样式单的最大优点是：XML关于文档浏览的基本思想是将数据与数据的显示分别定义。
这样一来，XML格式文档不会重蹈某些HTML文档结构混杂、内容繁乱的覆辙，XML的
编写者也可以集中精力于数据本身，而不受显示方式的细枝末节的影响。不仅如此，
样式单还带来另一个好处，即定义不同的样式表可以使相同的数据呈现出不同的显示
外观，从而适合于不同应用，甚至能够在不同的显示设备上显示。这样，XML数据就
可以得到最大程度上的重用性，满足不同的应用需求。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="1">
						<span class="atitle">XSLT</span>
				</a>
		</p>
		<p>W3C已经给出了两种样式单语言的推荐标准，一种是层叠样式单CSS（Cascading
Style Sheets），另一种是可扩展样式单语言XSL（eXtensible Stylesheet
Language）。本章讲的是XSL。
</p>
		<p>XSL本身就是一个XML文档，它是通过XML进行定义的，遵守XML的语法规则，是XML
的一种具体应用。因此系统可以使用同一个XML解释器对XML文档及其相关的XSL文
档进行解释处理。XSL由两大部分组成：第一部分描述了如何将一个XML文档进行转
换，转换为可浏览或可输出的格式；第二部分则定义了格式对象FO（fomatted
object）。由于到目前为止，W3C还未能出台一个得到多方认可的FO，因此本章主
要XML变换－－XSL transformations（XSLT）。现在一般所说的XSL大都指的
是XSLT。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">XSLT的应用</span>
				</a>
		</p>
		<p>XSLT主要的功能就是转换，它将一个没有形式表现的XML内容文档作为一个源树，
将其转换为一个有样式信息的结果树。在XSLT文档中定义了与XML文档中各个逻辑
成分相匹配的模板，以及匹配转换方式。它可以很好地描述XML文档向任何一个其
它格式的文档作转换的方法，例如转换为另一个逻辑结构的XML文档、HTML文档、
XHTML文档、VRML文档、SVG文档等等，不一而足。</p>
		<p>使用XSL定义XML文档显示方式的基本思想是：通过定义转换模板，将XML源文档
转换为带样式信息的可浏览文档。</p>
		<p>限于目前浏览器的支持能力，大多数情况下是转换为一个HTML文档进行显示。</p>
		<p>在XML中声明XSL样式单的方法为：&lt;?xml-stylesheet type="text/xsl" href="mystyle.xsl"?&gt;
        
        
        <br />至于具体的转换过程，既可以在服务器端进行，也可以在客户端进行。
      
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">XSLT样式单文档举例</span>
				</a>
		</p>
		<p>下面是一个具体的xslt样式单文档：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br /> &lt;?xml version="1.0" encoding="gb2312" ?&gt; <br /> &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/tr/WD-xsl"&gt; <br /> &lt;xsl:template match="/"&gt; <br />	 &lt;HTML&gt; <br />		&lt;HEAD&gt; <br />		&lt;TITLE&gt;学生花名册&lt;/TITLE&gt; <br />			&lt;STYLE&gt; .title{font-size:15pt; font-weight:bold; <br />				color:blue } .name{color:red}<br />			&lt;/STYLE&gt; <br />		&lt;/HEAD&gt; <br />		&lt;BODY&gt; <br />			&lt;P class="title" &gt;学生花名册&lt;/P&gt; <br />			&lt;xsl:apply-templates select="学生花名册"/&gt; <br />		&lt;/BODY&gt; <br />	&lt;/HTML&gt; <br /> &lt;/xsl:template&gt; <br /><br /> &lt;xsl:template match="学生花名册"&gt; <br />	 &lt;table BORDER="1"&gt; <br />		&lt;THEAD&gt; <br />		  &lt;td&gt; &lt;B&gt;姓名&lt;/B&gt; &lt;/td&gt;<br />		  &lt;td&gt; &lt;B&gt;籍贯&lt;/B&gt; &lt;/td&gt; <br />		  &lt;td&gt; &lt;B&gt;年龄&lt;/B&gt; &lt;/td&gt; <br />		  &lt;td&gt; &lt;B&gt;电话&lt;/B&gt; &lt;/td&gt; <br />		&lt;/THEAD&gt;<br />		&lt;xsl:for-each select="学生" order-by="名字"&gt; <br />		&lt;tr&gt; <br />		  &lt;td&gt;&lt;B&gt;&lt;xsl:value-of select="名字"/&gt;&lt;/B&gt;&lt;/td&gt; <br />		  &lt;td&gt;&lt;xsl:value-of select="籍贯"/&gt;&lt;/td&gt; <br />		  &lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt; <br />		  &lt;td&gt;&lt;xsl:value-of select = "电话号码"/&gt;&lt;/td&gt; <br />		&lt;/tr&gt;<br />		&lt;/xsl:for-each&gt;<br />	   &lt;/table&gt; <br /> &lt;/xsl:template&gt; <br /> &lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">模板在XSLT中的应用</span>
				</a>
		</p>
		<p>将上例的XML文档用XSL样式转换为HTML文档的步骤是：先用XML解释器将XML文档
解释成DOM对象，相当于建立了原文档的一个节点树。然后用XML解释器解释XSL文
档，用模板匹配的方法去遍历XML节点树，将树中的节点按模板的设定转换为模板指
示的显示语言，即HTML语言。</p>
		<p>要了解这段程序，就要先了解模板。xsl:template是模板元素，用于定义模板，通
常每个xsl:template有一个节点匹配属性，由"match="指定。在对模板进行匹配时
使用"xsl:apply-templates"，用"select"属性选择要匹配的模板，相当于一个
调用的过程。比如在
        
        
        <br />
&lt;xsl:apply-templates select="学生花名册"/&gt; 
        
        
        <br />

这段语句中用到了xsl:apply-templates，于是系统就跳到了用&lt;xsl:template
match="学生花名册"&gt;括起的“函数”中生成HTML代码。
      
      
      </p>
		<p>如果在xsl:apply-templates语句中没有指定select属性，那么就调用所有可以调
用的模板。</p>
		<p>接着介绍xslt常用的几条语句。
        
        
        <br /></p>
		<ul>
				<li>介绍一下XSL的几条主要语句：</li>
				<li>xsl:stylesheet 声明语句</li>
				<li>xsl:for-each select = "" 循环语句，遍历与引号中的属性值相同的节点</li>
				<li>xsl:value-of select = "" 赋值语句，取出引号中指定的属性值</li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">分析XSLT代码执行过程</span>
				</a>
		</p>
		<p>在作过XML声明和XSL声明之后，系统最先匹配XML源树的根节点。根节点用"/"表
示，它的匹配方法在一对&lt;xsl:template match="/"&gt;括起的源码中声明。按照
这段代码，首先生成带有样式信息的HTML文档的开头一段代码: </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br /> &lt;HTML&gt; <br />  &lt;HEAD&gt; <br />    &lt;TITLE&gt;学生花名册&lt;/TITLE&gt; <br />    &lt;STYLE&gt; .title{font-size:15pt; font-weight:bold; color:blue }<br />	.name{color:red}<br />    &lt;/STYLE&gt; <br />  &lt;/HEAD&gt; <br />  &lt;BODY&gt; <br />    &lt;P class="title" &gt;学生花名册&lt;/P&gt;  <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接着，系统看到了&lt;xsl:apply-templates select="学生花名册"/&gt;的指示，于是，
它在XML源树中寻找标记为“学生花名册”的节点进行匹配。就象函数调用一样，现在系
统跳到了用&lt;xsl:template match="学生花名册"&gt;括起的“函数”中继续生成下面的
HTML代码： </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />  &lt;table BORDER="1"&gt; <br />     &lt;THEAD&gt; <br />       &lt;td&gt; &lt;B&gt;姓名&lt;/B&gt; &lt;/td&gt;<br />       &lt;td&gt; &lt;B&gt;籍贯&lt;/B&gt; &lt;/td&gt; <br />       &lt;td&gt; &lt;B&gt;年龄&lt;/B&gt; &lt;/td&gt; <br />       &lt;td&gt; &lt;B&gt;电话&lt;/B&gt; &lt;/td&gt; <br />      &lt;/THEAD&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>现在，系统又接到了新的指示 &lt;xsl:for-each select="学生" order-by="名字"&gt;。
这条指示要求系统寻找标记为“student”的子节点，并按照“名字”下的内容将这些节
点排序，然后一一处理。 </p>
		<p>对于每一个“学生”子树中的内容，系统为其生成表中一行的内容。每一行包含四列，
分别把标记为“名字”、“籍贯”、“年龄”、“电话号码”的子节点的内容填进去。
其中“名字”下的内容还是粗体显示。对应到本例中的XML数据，生成的HTML代码为: </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;B&gt;李华&lt;/B&gt;&lt;/td&gt; <br />      &lt;td&gt;河北&lt;/td&gt; <br />      &lt;td&gt;15&lt;/td&gt; <br />      &lt;td&gt;62875555&lt;/td&gt; <br />    &lt;/tr&gt; <br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;B&gt;张三&lt;/B&gt;&lt;/td&gt; <br />      &lt;td&gt;北京&lt;/td&gt; <br />      &lt;td&gt;14&lt;/td&gt; <br />      &lt;td&gt;82873425&lt;/td&gt; <br />    &lt;/tr&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>处理完&lt;xsl:for-each select="学生" order-by="名字"&gt;中的内容，系统继续生成HTML代码:</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;/table&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>至此，系统已处理完&lt;xsl:template match="学生花名册"&gt;中的所有内容，可以“函数
返回”了。
系统返回到&lt;xsl:template match="/"&gt;括起的源码中，完成HTML最后两行代码的生成： </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />	&lt;/BODY&gt;<br />	&lt;/HTML&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>把上面的HTML代码串起来，就是生成的转换结果文件。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">XSLT文件文档结构</span>
				</a>
		</p>
		<p>前面说过，XSLT文档本身是XML文档，因此文档的第一句自然是：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0" encoding="gb2312"?&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接下来是样式单部分：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />  &lt;xsl:stylesheet version="1.0" <br />       xmlns:xsl="http://www.w3.org/tr/WD-xsl"&gt;<br />	... ...<br />  &lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>xmlns:xsl指示了XSL的命名空间，在XSLT标准中，定义了XSLT的命名空间为
http://www.w3.org/1999/XSL/transform,然而在ie5中不支持这个名字
空间，需要用到微软自己的名字空间http://www.w3.org/tr/WD-xsl。</p>
		<p>XSLT在进行转换时，首先遍历XML源文档树，找到要处理的节点，然后将定义好
的模板信息施加到该节点中。 
        
        
        <br />
下面将要介绍xslt样式单的语法。
      
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="7">
						<span class="atitle">样式单模板xsl:template</span>
				</a>
		</p>
		<p>xsl:template元素有一个mode属性，可以根据需要去匹配不同模式的模板。
若将前例作如下修改：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />	&lt;xsl:template match="/" mode="blue"&gt; <br />		...<br />	&lt;TITLE&gt;学生花名册&lt;/TITLE&gt; <br />	&lt;STYLE&gt; .title{font-size:15pt; font-weight:bold; color:blue }<br />		...<br />	&lt;xsl:template match="/" mode="red"&gt; <br />		...<br />	&lt;TITLE&gt;学生花名册&lt;/TITLE&gt; <br />	&lt;STYLE&gt; .title{font-size:15pt; font-weight:bold; color:red }<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果要将TITLE输出为蓝色，则用下面语句匹配：
        
        
        <br />&lt;xsl:apply-templates select="/" mode="blue"/&gt;
      
      
      </p>
		<p>如果要将title输出为红色，则写为：
        
        
        <br />
&lt;xsl:apply-templates select="/" mode="red"/&gt; 
      
      
      </p>
		<p>此外，模板总是与节点相对应的，一个节点可能对应于不同的模板，那么如何确定各
模板匹配的先后次序呢？XSLT中可为xsl:template设置优先级，写法是：
        
        
        <br />
&lt;xsl:template match="student" priority="n"&gt;   //n为优先级数
      
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="8">
						<span class="atitle">xsl:value-of计算节点值</span>
				</a>
		</p>
		<p>在使用XSLT进行转换时，常常需要获取节点值，使用xsl:value-of元素可达到
这个目的，如下例：
        
        
        <br />&lt;xsl:value-of select="籍贯"/&gt;
      
      
      </p>
		<p>得到的是学生原籍的值，select属性指定要获取的是哪一个节点的节点值。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="9">
						<span class="atitle">xsl:for-each循环处理</span>
				</a>
		</p>
		<p>使用xsl:for-each可对所选节点依次进行处理，如例中在生成表格处理中，就是
利用循环将各个学生的信息取出放入表格中的，写法是：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />	&lt;xsl:for-each select="student" order-by="name"&gt; <br />		... <br />	&lt;/xsl:for-each&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以认为&lt;xsl:for-each select=""&gt;能实现多个
&lt;xsl:apply-templates select=""&gt;的功能。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="10">
						<span class="atitle">xsl:sort排序处理</span>
				</a>
		</p>
		<p>对于用xsl:for-each或xsl:apply-templates匹配的节点，可使用xsl:sort将
所选节点内容进行排序</p>
		<ol>
				<li>按大小写排序
          
          
          <br />&lt;xsl:sort case-order="upper-first" select="@id"/&gt;
以id为关键字按大写优先排序 
          
          
          <br />

&lt;xsl:sort case-order="lower-first" select="@id"/&gt;
以id为关键字按小写优先排序 
        
        
        </li>
				<li>按字母顺序排序
          
          
          <br />
&lt;xsl:sort order="ascending" select="@id "/&gt;
以id为关键字按字母升序排序 
          
          
          <br />

&lt;xsl:sort order="descending" select="@id "/&gt;
以id为关键字按字母降序排序 
        
        
        </li>
				<li>按数据类型排序
          
          
          <br />
&lt;xsl:sort data-type="text" select="@id"/&gt;
以id为关键字按文本类型排序，如对于一组id数据101，2，44，305
来说，排序结果是101，2，305，44 
          
          
          <br />

&lt;xsl:sort data-type="number" select="@id"/&gt;
以id为关键字按数据类型排序，上面一组数据的排序结果是2，44，101，305 
          
          
          <br />

另外，还有一种指定排序的方法，就是在前面学生花名册例中所使用的order-by：
&lt;xsl:for-each select="student" order-by="name"&gt;
也可使得输出学生时按名字排序。

        
        
        </li>
		</ol>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="11">
						<span class="atitle">元素与属性创建</span>
				</a>
		</p>
		<p>XSLT是一个动态的样式单，在处理过程中可产生新的元素或元素属性，方法如下：</p>
		<table border="1">
				<tbody>
						<tr>
								<td>内 容</td>
								<td>元 素</td>
								<td>举 例</td>
								<td>转换结果</td>
						</tr>
						<tr>
								<td>创建元素</td>
								<td>xsl:element</td>
								<td>&lt;xsl:element name="TITLE"&gt;学生花名册&lt;/xsl:element&gt;</td>
								<td>学生花名册</td>
						</tr>
						<tr>
								<td>创建属性</td>
								<td>xsl: attribute</td>
								<td>&lt;TITLE&gt;&lt;xsl:attribute name="style"&gt;color:blue &lt;/xsl:attribute&gt;学生花名册&lt;/TITLE &gt;</td>
								<td>&lt;TITLE style="color:blue"&gt;学生花名册&lt;/TITLE&gt;</td>
						</tr>
						<tr>
								<td>创建文本</td>
								<td>xsl:text （可以保护文本中的空白字符）</td>
								<td>&lt;xsl:text&gt; 这是学生花名册 &lt;/xsl:text &gt;</td>
								<td>这是学生花名册</td>
						</tr>
						<tr>
								<td>创建处理指令</td>
								<td>xsl:processing-instruction</td>
								<td>&lt;xsl:processing-instruction name="xml-stylesheet"&gt; href="book.css" type="text/css" &lt;/xsl:processing-instruction&gt;</td>
								<td>&lt;?xml-stylesheet href="book.css" type="text/css"?&gt;</td>
						</tr>
						<tr>
								<td>创建注释</td>
								<td>xsl:comment</td>
								<td>&lt;xsl:comment&gt; 以下是学生花名册，请勿删改！ &lt;/xsl:comment&gt;</td>
								<td>&lt;!-- 以下是学生花名册，请勿删改！--&gt;</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="12">
						<span class="atitle">节点拷贝</span>
				</a>
		</p>
		<p>在对XML文档进行处理时，XSLT还可以通过拷贝的方式复制节点，方法是利用
xsl:copy和xsl:copy-of。其中xsl:copy只拷贝当前节点，不包括子节
点和属性；而xsl:copy-of的拷贝内容则包括当前节点、子节点和属性。
例如对于：
        
        
        <br />&lt;p id="p1"&gt;A &lt;B&gt;is a char&lt;/B&gt; &lt;/p&gt;

      
      
      </p>
		<p>如果样式单写为如下形式：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />	&lt;xsl:stylesheet version="1.0" <br />	xmlns:xsl="http://www.w3.org/1999/XSL/transform"&gt; <br />	&lt;xsl:template match="p"&gt; <br />	  &lt;DIV&gt;<br />		&lt;xsl:text&gt; copy-of : &lt;/xsl:text&gt; <br />		&lt;xsl:copy-of select="."/&gt; <br />	  &lt;/DIV&gt; <br />	  &lt;DIV&gt;<br />		&lt;xsl:text&gt; copy : &lt;/xsl:text&gt; <br />		&lt;xsl:copy/&gt; <br />	  &lt;/DIV&gt; <br />	&lt;/xsl:template&gt; <br />	&lt;/xsl:stylesheet&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>转换后生成如下代码：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />	&lt;DIV&gt; <br />	  copy-of : &lt;p id="p1"&gt;A &lt;B&gt;is a char&lt;/B&gt; &lt;/p&gt;<br />	&lt;/DIV&gt;<br />	&lt;DIV&gt; <br />	  copy : &lt;p/&gt;<br />	&lt;/DIV&gt; <br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由此可见，两种拷贝方式结果大相径庭。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="13">
						<span class="atitle">输出格式与编码问题</span>
				</a>
		</p>
		<p>XSLT是一个转换语言，它的目的是将XML源文档转换为另一种格式文档，它的输出结
果可以是HTML文档，也可以是带CSS的XML文档。具体的输出格式由xsl:output 指
定。如果要输出为HTML文档，则写为：

&lt;xsl:output method="html"/&gt;

</p>
		<p>同样，要输出XML文档写为：
&lt;xsl:output method="xml"/&gt;

</p>
		<p>如果文档中不出现xsl:output，将缺省输出为XML文档，但如果在匹配模板时使用了
&lt;HTML&gt;标记，则输出为HTML文档。输出为HTML文档时系统都会自动加上下面语句：

&lt;!DOCTYPE html PUBLIC "-//W3C//Dtd HTML 4.0 transitional//EN"&gt;

</p>
		<p>此外，还可以利用xsl:output指定编码方式，如UTF-8，UTF-16，GB2312等。例如：
&lt;xsl:output method="html" encoding="GB2312"/&gt;

它指定了该XSLT的输出结果是HTML格式，编码方式为中文。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>IBM has authored this article</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:42 <a href="http://www.blogjava.net/Vencent/articles/36733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web 的未来：XHTML 2.0::变更概述</title><link>http://www.blogjava.net/Vencent/articles/36734.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36734.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36734.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36734.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#author">Nicholas Chase</a>, 总裁, Chase and Chase, Inc.<br /></p>
		<p>2003 年  1 月  01 日</p>
		<blockquote>多
年以来，HTML 只是在不断变大，却从未变小，因为新版本必须维护向后兼容性。这一情况将得以改变。XHTML 2.0 的第一个工作草案于
2002 年 8 月 5
日发布，一大新闻就是取消了向后兼容性；该语言终于得以继续发展。那么，作为一名开发人员您将得到什么回报呢？健壮的表单和事件表现如何呢？它们是研究不
需要大量 JavaScript 的框架以及甚至层次结构菜单的更佳方法。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>本文概述了 XHTML 2.0 中的新增功能以及将来可能会如何使用它。读者应该熟悉 HTML 和／或 XHTML 1.0。熟悉级联样式表（Cascading Style Sheet (CSS)）是有帮助的，但不是必需的。</p>
		<p>
				<a name="1">
						<span class="atitle">告别向后兼容性，引入结构</span>
				</a>
		</p>
		<p>


当万维网联盟（World Wide Web Consortium (W3C)）于 2002 年 8 月 5 日发布 XHTML 2.0 的第一个工作草案时，
最让人吃惊的是：与其先前的版本不同，它不是向后兼容的。
对于先前的发行版，如从 HTML 4.01 转到 XHTML 1.0 以及后来从 XHTML 1.0 到 XTHML 1.1，变化都是添加一些内容；
可以读取 XHTML 1.0（过渡的）文档的浏览器也可以理解 HTML 4.01 文档。而 XHTML 2.0 不是那样的。</p>
		<p>如果您在两年前宣布我们今天将研究不带 
        <code>img</code> 标记或 
        <code>bold</code> 标记的 HTML 版本，那么大多数 Web 开发人员都会用怀疑的眼光看着您。然而，现在就是这样。除了彻底替换表单和框架外，XHTML 2.0 还除去了 
        <code>b</code> 、 
        <code>i</code> 和 
        <code>img</code> 标记（以及 
        <code>big</code> 、 
        <code>small</code> 和 
        <code>tt</code> ），
甚至不赞成使用 
        <code>br</code> ，以准备从将来的发行版中除去它。但这是为什么呢？
      </p>
		<p>原因在于大多数标记都是
        <i>表示性的</i> 。它们的唯一目的就是给予浏览器指令，规定有关其内容应该如何显示，
但却完全未提供有关其内容是什么的信息。例如，请考虑下面两个句子：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />Presentational elements are, &lt;i&gt;for the most part&lt;/i&gt;, &lt;b&gt;gone&lt;/b&gt;.<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>和</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />Presentational elements are, &lt;em&gt;for the most part&lt;/em&gt;, &lt;strong&gt;gone&lt;/strong&gt;.<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在没有样式表的情况下，这两个句子在浏览器中看起来是一样的，但只有第二个句子提供了有关原因的信息。
事实上，从一开始 
        <code>em</code> （强调）和 
        <code>strong</code> 标记就出现在 HTML 中了，
但多年以来作者们基本上已经忽略了它们，而专注于表现形式，这是以牺牲内容为代价的。
      </p>
		<p>但这并不意味着只要您想使某些内容变成粗体或斜体，就应该将它们硬塞进这两个标记中。
相反，除去表示性元素的整个目的是设法完成 CSS 的发明者的初衷，
即应该根据内容所表示的东西来标记内容，而样式表应该用于美化内容。例如， 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code1">清单 1</a>使用类别（class）来指出内容类型。
      </p>
		<br />
		<a name="code1">
				<b>清单 1. 使用类别指定内容类型</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;html&gt;<br /><br />&lt;head&gt;&lt;title&gt;Employee Notice&lt;/title&gt;<br /><br />&lt;style type="text/css"&gt;<br /><br />    .duedate { color: red;<br /><br />               font-weight: bold; }<br /><br />    .holiday { color: green;<br /><br />               font-style: italic }<br /><br />&lt;/style&gt;<br /><br />&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br />&lt;h1&gt;Notice&lt;/h1&gt;<br /><br />&lt;p&gt;Employees should take note of the following important dates:&lt;/p&gt;<br /><br />&lt;ul&gt;<br /><br />    &lt;li class="duedate"&gt;8/28/2002 (Progress reports due)&lt;/li&gt;<br /><br />    &lt;li class="holiday"&gt;9/1/2002 (Labor Day)&lt;/li&gt;<br /><br />    &lt;li class="duedate"&gt;10/28/2002 (Final reports due)&lt;/li&gt;<br /><br />&lt;/ul&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在该页面中，日期类型可以由内容本身来确认，浏览器可以使用类别信息来决定如何为其设计样式，
如 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#figure1">图 1</a>中所示。
      </p>
		<br />
		<a name="N100AB">
				<b>图 1. 类别可以确定显示哪一类内容，样式表可以对它进行适当的格式化</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/figure1.jpg" height="337" width="454" />
		<br />
		<p>用这种观点研究它：断开（ 
        <code>br</code> ）标记的目的无外乎是为了显示，因为实际上它并无任何内容。XHTML 2.0
不赞成使用 
        <code>br</code> 标记，而提倡使用 
        <code>line</code> 标记。 
        <code>line</code> 标记指定一种特殊的内容：
通常是以后跟换行和回车这种方式呈现的一行文本或其它内容。例如，文本：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;p&gt;<br /><br />public class HelloWorld {&lt;br /&gt;<br /><br />public static void main (String[] args){&lt;br /&gt;<br /><br />System.out.println("Hello world!");&lt;br /&gt;<br /><br />}&lt;br /&gt;<br /><br />}<br /><br />&lt;/p&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>变成</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;p&gt;<br /><br />&lt;line&gt;public class HelloWorld {&lt;/line&gt;<br /><br />&lt;line&gt;public static void main (String[] args){ &lt;/line&gt;<br /><br />&lt;line&gt;System.out.println("Hello world!"); &lt;/line&gt;<br /><br />&lt;line&gt;}&lt;/line&gt;<br /><br />&lt;line&gt;}&lt;/line&gt;<br /><br />&lt;/p&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这样，文档就有了一个表示行的实际对象，同样，段（ 
        <code>p</code> ）标记表示一段内容。
      </p>
		<p>为什么所有这些都很重要呢？因为 Web 不仅正日益成为人与人之间通信的场所，
而且还日益成为软件应用程序（如服务器和搜索引擎索引器）之间进行通信的场所。
而且，每个人（或者说几乎每个人）都使用相同浏览器的时代已经一去不复返了。
开发人员正不断为不同设备（如 PDA 和移动电话）重新设计内容。语音触发的（voice-activated）系统已经离我们不远了。内容的结构意义正变得几乎与内容本身一样重要。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">节</span>
				</a>
		</p>
		<p>
因此，XHTML 2.0 添加了节（section）和标题（heading）。HTML 一直都包含编号的标题 ― 
        <code>h1</code> 到 
        <code>h6</code> ，
直到 2002 年 8 月 5 日的工作草案，还未将其撤消，但这只是一个时间问题。
而 XHTML 2.0 使用通用标题和节。例如，可以嵌套节，从而赋予标题含义。
以前用编号标题呈现的文档（ 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code2">清单 2</a>）：
      </p>
		<br />
		<a name="code2">
				<b>清单 2. 文档中的编号标题</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<br />
														<br />&lt;html&gt;<br /><br />&lt;head&gt;&lt;title&gt;Adding sections&lt;/title&gt;&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br />   &lt;h1&gt;The Web's future: XHTML 2.0&lt;/h1&gt;<br /><br />   &lt;p&gt;by Nicholas Chase&lt;/p&gt;<br /><br />   &lt;h2&gt;Good-bye backward compatibility, hello structure&lt;/h2&gt;<br /><br />   &lt;p&gt;Why backward compatibility is over.&lt;/p&gt;<br /><br />   &lt;h3&gt;Presentation versus Structure&lt;/h3&gt;<br /><br />   &lt;p&gt;Using style sheets rather than presentational elements.&lt;/p&gt;<br /><br />   &lt;h3&gt;Lines&lt;/h3&gt;<br /><br />   &lt;p&gt;Line breaks are deprecated.&lt;/p&gt;<br /><br />   &lt;h2&gt;Sections&lt;/h2&gt;<br /><br />   &lt;p&gt;Creating more reasonable sections.&lt;/p&gt;<br /><br />   &lt;h2&gt;Navigation lists and menus&lt;/h2&gt;<br /><br />   &lt;p&gt;Hierarchical menus.&lt;/p&gt;<br /><br />   &lt;h2&gt;Links, links, everywhere&lt;/h2&gt;<br /><br />   &lt;p&gt;Adding links.&lt;/p&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以用通用标题和节替换（
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code3">清单 3</a>）：
      </p>
		<br />
		<a name="code3">
				<b>清单 3. 通用标题和节</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<br />
														<br />&lt;html&gt;<br /><br />&lt;head&gt;&lt;title&gt;Adding sections&lt;/title&gt;&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br />   &lt;section&gt;<br /><br />      &lt;h&gt;The Web's future: XHTML 2.0&lt;/h&gt; <br /><br />      &lt;p&gt;by Nicholas Chase&lt;/p&gt;<br /><br />      &lt;section&gt;<br /><br />         &lt;h&gt;Good-bye backward compatibility, hello structure&lt;/h&gt;<br /><br />         &lt;p&gt;Why backward compatibility is over.&lt;/p&gt;<br /><br />         &lt;section&gt;<br /><br />            &lt;h&gt;Presentation vs. Structure&lt;/h&gt;<br /><br />            &lt;p&gt;Using style sheets rather than presentational elements.&lt;/p&gt;<br /><br />         &lt;/section&gt;<br /><br />         &lt;section&gt;<br /><br />             &lt;h&gt;Lines&lt;/h&gt;<br /><br />             &lt;p&gt;Line breaks are deprecated.&lt;/p&gt;<br /><br />         &lt;/section&gt;<br /><br />      &lt;/section&gt;<br /><br />      &lt;section&gt;<br /><br />         &lt;h&gt;Sections&lt;/h&gt; <br /><br />         &lt;p&gt;Creating more reasonable sections.&lt;/p&gt;<br /><br />      &lt;/section&gt;<br /><br />      &lt;section&gt;<br /><br />          &lt;h&gt;Navigation lists and menus&lt;/h&gt;<br /><br />          &lt;p&gt;Hierarchical menus.&lt;/p&gt;<br /><br />      &lt;/section&gt;<br /><br />      &lt;section&gt;<br /><br />          &lt;h&gt;Links, links, everywhere&lt;/h&gt;<br /><br />          &lt;p&gt;Adding links.&lt;/p&gt;<br /><br />      &lt;/section&gt;<br /><br />   &lt;/section&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这种结构有两个优点。首先，应用程序（如搜索引擎 crawler）能够更容易地了解内容的相对重要性，
其次，节是自包含的。在 HTML 中，节以其标题开始，所以在标题的前面不会出现内容（如介绍性内容）。 
        <code>section</code> 
元素取消了这种约束，因为其内部的任何内容都是节的一部分。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">导航列表和菜单</span>
				</a>
		</p>
		<p>
增加了一个会让 Web 开发人员大大受益的结构，那就是导航列表。由 
        <code>nl</code> 标记指定的导航列表的工作原理与其“表亲”有序列表（ 
        <code>ol</code> ）和无序列表（ 
        <code>ul</code> ）非常相似，但有一点不一样：导航列表的项仅在列表激活时才出现。
因此，导航列表与层次结构的弹出菜单十分相似，这种弹出菜单很受欢迎，因为它们提供了许多导航信息，而且不会占据太多的屏幕空间。
例如，肥皂剧站点可能有以下菜单（ 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code4">清单 4</a>）：
      </p>
		<br />
		<a name="code4">
				<b>清单 4. 使用导航列表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;nl&gt;<br /><br />   &lt;name&gt;Character Options&lt;/name&gt;<br /><br />   &lt;li href="stay.html"&gt;Stay&lt;/li&gt;<br /><br />   &lt;nl&gt;<br /><br />      &lt;name&gt;Leave&lt;/name&gt;<br /><br />      &lt;li href="newjob.html"&gt;Job transfer&lt;/li&gt;<br /><br />      &lt;li href="divorce.html"&gt;Divorce&lt;/li&gt;<br /><br />      &lt;li href="fataldisease.html"&gt;Fatal disease&lt;/li&gt;<br /><br />   &lt;/nl&gt;<br /><br />   &lt;li href="backburner.html"&gt;Back Burner&lt;/li&gt;<br /><br />&lt;/nl&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>当用户激活名称（ 
        <code>Character Options</code> ）时，出现列表项。
关于当用户激活主列表时子列表（如 
        <code>Leave</code> 菜单）是否会出现，还是用户必须激活子列表项本身以使其出现，工作草案并未说清楚。
最终作者可能通过样式或事件来控制这一行为。在任何情况下，当输入焦点从主元素移开时，列表项就会消失。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">链接，链接无处不在</span>
				</a>
		</p>
		<p>您可能已经注意到：即使打算将前一个示例作为菜单，
但它没有锚（ 
        <code>a</code> ）标记。而 
        <code>href</code> 属性已经被正确放在了 
        <code>li</code> 元素上。这不是导航列表的特性，而是 XHTML 2.0 的新特性。与超文本相关的属性（如 
        <code>href</code> 、 
        <code>target</code> 和 
        <code>accesskey</code> ）现在是公共属性集合（Common Attribute Collection）的一部分，它包括核心属性（ 
        <code>class</code> 、 
        <code>id</code> 和 
        <code>title</code> ）、国际化属性（ 
        <code>xml:lang</code> ，
它替换了 XHTML 1.1 中的 
        <code>lang</code> ）和事件属性，事件属性来自 XML Events 建议书，正如您将在下面看到的。
      </p>
		<p>这意味只要将 
        <code>href</code> 属性添加到任何元素，就可以将它转换成链接，而不一定要用锚标记包围单个元素。
      </p>
		<p>这是否表示经过四年的努力，XLink 已经被 XHTML 2.0 采用了吗？总而言之，没有。
事实上，XLink 和 XHTML 2.0 中规定的链接之间的差异是那些正从事各自建议书的开发人员之间争论的根源，
所以在这个最初的公开工作草案和最后的建议书之间可能会做些更改。
同时，可以组合使用该功能、导航列表、 
        <code>link</code> 元素，以及资源描述框架（Resource Description Framework (RDF)）来复制 XLink 的大多数功能。
      </p>
		<p>XForms 是一个与 XML 相关的建议书，并确实已经成为 XHTML 2.0 的一部分。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">XForms</span>
				</a>
		</p>
		<p>XML 表单语言（XML Forms Language (XForms)）
是研究表单的一种全新方法 ― 它象 XHTML 的其余部分一样 ― 内容、结构和表现是完全独立的。XForms 页面指定一个模型，
该模型拥有有关表单自身的信息，然后，可以在页面周围散布表单元素，而不是被局限于单个表单元素。
这意味着，您甚至可以在页面的同一区域中合并不同表单的元素。
可以通过实例文档填充表单，实例文档是从表单元素上的 XPath 表达式引用的。
表单元素自身也代表了特殊类型的对象，而不是描述在页面上它们是如何显示的。
当更新表单元素中的数据时，会更新实例文档。
当用户提交表单时，实际发送的是实例文档。例如，采用下面的简单表单（ 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code5">清单 5</a>）：
      </p>
		<br />
		<a name="code5">
				<b>清单 5. 简单的 HTML 表单</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<br />
														<br />&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br /><br />&lt;head&gt;<br /><br />    &lt;title&gt;Preference Form&lt;/title&gt;<br /><br />&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br /><br /><br />&lt;h1&gt;Preferences Form&lt;/h1&gt;<br /><br />&lt;form action="myformprocessor.jsp"&gt;<br /><br />&lt;p&gt; <br /><br />    Username: &lt;input type="text" name="userid" /&gt;<br /><br />    &lt;br /&gt;<br /><br />    Password: &lt;input type="password" name="pass"/&gt;<br /><br />&lt;/p&gt;<br /><br /><br /><br />&lt;p&gt;<br /><br />    Area preference:<br /><br />        &lt;select name="seatingpreference"&gt;<br /><br />             &lt;option value="1"&gt;One&lt;/option&gt;<br /><br />             &lt;option value="2"&gt;Two&lt;/option&gt;<br /><br />             &lt;option value="3"&gt;Three&lt;/option&gt;<br /><br />        &lt;/select&gt;<br /><br />&lt;/p&gt;<br /><br />&lt;p&gt;<br /><br />    &lt;input type="submit" /&gt;<br /><br />&lt;/p&gt;<br /><br />&lt;/form&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code6">清单 6</a>显示了 XForms 版本的表单：
      </p>
		<br />
		<a name="code6">
				<b>清单 6. XForms 版本的表单</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<br />
														<br />&lt;html xmlns="http://www.w3.org/1999/xhtml" <br /><br />      xmlns:xforms="http://www.w3.org/2002/01/xforms"&gt;<br /><br />&lt;head&gt;<br /><br />    &lt;title&gt;Preference Form&lt;/title&gt;<br /><br /><br /><br />    &lt;xforms:model&gt;<br /><br /><br /><br />        &lt;xforms:submitInfo method="postxml"/&gt;<br /><br /><br /><br />        &lt;xforms:instance xmlns=""&gt;<br /><br />            &lt;preferences&gt;<br /><br />                &lt;person userid=""&gt;<br /><br />                    &lt;password&gt;&lt;/password&gt;<br /><br />                &lt;/person&gt;<br /><br />                &lt;seatingpreference&gt;&lt;/seatingpreference&gt;<br /><br />            &lt;/preferences&gt;<br /><br />        &lt;/xforms:instance&gt;<br /><br />    &lt;/xforms:model&gt;<br /><br /><br /><br />&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br /><br /><br />&lt;h1&gt;Preferences Form&lt;/h1&gt;<br /><br /><br /><br />&lt;p&gt; <br /><br />    &lt;xforms:input ref="preferences/person@userid"&gt;<br /><br />        &lt;xforms:caption&gt;Username: &lt;/xforms:caption&gt;<br /><br />    &lt;/xforms:input&gt;<br /><br /><br /><br />    &lt;br /&gt;<br /><br /><br /><br />    &lt;xforms:secret ref="preferences/person/password"&gt;<br /><br />        &lt;xforms:caption&gt;Password: &lt;/xforms:caption&gt;<br /><br />    &lt;/xforms:secret&gt;<br /><br />&lt;/p&gt;<br /><br /><br /><br />&lt;p&gt;<br /><br /><br /><br />    &lt;xforms:selectOne ref="preferences/seatingpreference" selectUI="listbox"&gt;<br /><br />        &lt;xforms:caption&gt;Area preference:   &lt;/xforms:caption&gt;<br /><br />        &lt;xforms:item&gt;<br /><br />            &lt;xforms:value&gt;1&lt;/xforms:value&gt;<br /><br />            &lt;xforms:caption&gt;One&lt;/xforms:caption&gt;<br /><br />        &lt;/xforms:item&gt;<br /><br />        &lt;xforms:item&gt;<br /><br />            &lt;xforms:value&gt;2&lt;/xforms:value&gt;<br /><br />            &lt;xforms:caption&gt;Two&lt;/xforms:caption&gt;<br /><br />        &lt;/xforms:item&gt;<br /><br />        &lt;xforms:item&gt;<br /><br />            &lt;xforms:value&gt;3&lt;/xforms:value&gt;<br /><br />            &lt;xforms:caption&gt;Three&lt;/xforms:caption&gt;<br /><br />        &lt;/xforms:item&gt;<br /><br />    &lt;/xforms:selectOne&gt;<br /><br /><br /><br />&lt;/p&gt;<br /><br />&lt;p&gt;<br /><br />    &lt;xforms:submit&gt;<br /><br />        &lt;xforms:caption&gt;Submit Report&lt;/xforms:caption&gt;<br /><br />    &lt;/xforms:submit&gt;<br /><br />&lt;/p&gt;<br /><br /><br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<b>术语说明</b>：XForms 建议书特别说明了不存在单个表单的 XForms。它是多个 XForms 页面，不再是单个 XForm 页面。
      </p>
		<p>表单一般需要进行验证。换句话说，数据字段必须包含有效数据等。XForms
使用 XML 模式来约束所提交的数据。另外，可以通过添加 XML Events（它也包括在 XHTML 2.0 中）来进一步增强 XForms 页面的功能。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">XML Events</span>
				</a>
		</p>
		<p>您可能已经熟悉了通过添加如 
        <code>onclick</code> 和 
        <code>onmouseover</code> 之类的事件在 Web 页面上使用事件。不会再有了。这些熟悉的属性已经被集成到
XHTML 2.0 中的 XML Events 模块所替代。XML Events 提供了一种通用的方法来指定事件发生时应该采取的操作。
它的优点是您不受限于如鼠标单击之类的预定义事件。
相反，可以定义您自己的事件以及触发它们时会发生什么。
      </p>
		<p>XML Events 包含下列组件。如鼠标单击之类的事件可以作为目标。例如，在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code7">清单 7</a>所示的页面中：
      </p>
		<br />
		<a name="code7">
				<b>清单 7. 要单击的页面</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<br />
														<br />&lt;html&gt;<br /><br />  &lt;head&gt;&lt;title&gt;Rides&lt;/title&gt;&lt;/head&gt;<br /><br />  &lt;body&gt;<br /><br />     &lt;ul id="ridelist"&gt;<br /><br />        &lt;li href="monorail.html"&gt;Monorail&lt;/li&gt;<br /><br />        &lt;li href="Matterhorn.html"&gt;Matterhorn&lt;/li&gt;<br /><br />        &lt;li href="coaster.html"&gt;Roller coaster&lt;/li&gt;<br /><br />     &lt;/ul&gt;<br /><br />  &lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>用户可能单击第二个 
        <code>li</code> 元素 Matterhorn。当这发生时，鼠标单击事件从文档根行进到目标（ 
        <code>li</code> ）并再次返回。顺序是：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />(root) -- html -- body -- ul -- li -- ul -- body -- html -- (root)<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>向下行进到目标称为捕捉
（capture）阶段，而再次向上行进称为冒泡（bubbling）阶段（并不是所有的事件都会冒泡）。在行进期间的任何时候，事件都可以传递已经被注
册为观察器的对象（这表示它正在观察特定的事件），如果它看到事件，则执行特定操作。侦听器创建观察器。例如，在下面的序列中：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;ev:listener observer="ridelist" event="mousedown" handler="#myscript"/&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>侦听器使 
        <code>ul</code> 元素（或者更准确一点说，是整个列表）成为观察器，
因而，当用户单击任何列表项目时，观察器（ 
        <code>ridelist</code> ）执行 
        <code>myscript</code> （但仍必须确定调用任意脚本的机制）。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="7">
						<span class="atitle">XFrames</span>
				</a>
		</p>
		<p>

广受指责的框架也在 XHTML 2.0 中被替换了。XFrames
的第一个工作草案于 2002 年 8 月 6 日初次登场，此前一天 XHTML 2.0 宣布它将使用 XFrames 并试图解决传统 HTML 框架出现的问题。
大多数问题是有关难于创建书签和刷新页面，以及不支持框架的搜索引擎无法索引适当内容。</p>
		<p>在 XFrames 文档中，所包含内容的 URI 成为整个文档 URI 的一部分。
例如，下面 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#code8">清单 8</a>中的页面可能表示带三个框架的 HTML 页面：
      </p>
		<br />
		<a name="code8">
				<b>清单 8. XFrames 页面</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;html&gt;<br /><br />&lt;head&gt;&lt;title&gt;XFrames&lt;/title&gt;&lt;/head&gt;<br /><br />&lt;body&gt;<br /><br />&lt;row&gt;<br /><br />    &lt;frame id="header" /&gt;<br /><br />    &lt;column&gt;<br /><br />        &lt;frame id="menu"/&gt;<br /><br />        &lt;frame id="content"/&gt;<br /><br />    &lt;/column&gt;<br /><br /><br /><br />&lt;/row&gt;<br /><br />&lt;/body&gt;<br /><br />&lt;/html&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请注意，没有指定每个框架的 URI，但每个框架都有其自己唯一的标识符。
因此，这个文档的 URI 可能是：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />site.xfm#frames(header=header.xhtml,menu=menu.xhtml,content=main.xhtml)<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>然后，理解 XFrames 的浏览器将每个框架的内容与适当的 URI 相关联。当用户单击链接并更改个别框架的内容时，页面的整个 URI 都会更改，
所以它始终显示用户正在查看的实际内容，“收藏”和“后退”按钮提供了准确的内容。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="8">
						<span class="atitle">图像作为对象</span>
				</a>
		</p>
		<p>
2002 年 8 月 5 日工作草案的最后一个主要的更改包括
除去了 
        <code>img</code> 标记并用 
        <code>object</code> 标记替代它。 
        <code>object</code> 标记实际上在 HTML 4.01 中就已经出现，
但开发人员主要将它用于嵌入多媒体和 Java applet。
然而，它一直都能支持图像。使用 object 标记的主要优点在于，它被设计成向下级联。
换句话说，如果浏览器不能显示一个特定对象，那么它将显示该对象的内容。
例如，遇到下列代码片断的浏览器首先试图装入电影。如果装入电影失败，则装入图像。如果装入图像失败，那么它只显示文本。
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />&lt;object data="rides.mpeg" type="application/mpeg"&gt;<br /><br />    &lt;object data="rollercoaster.jpg" type="image/jpg"&gt;<br /><br />        Jack tries to expand his horizons on the racing coasters.<br /><br />    &lt;/object&gt;<br /><br />&lt;/object&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="9">
						<span class="atitle">后续步骤</span>
				</a>
		</p>
		<p>

2002 年 8 月 5 日的 XHTML 2.0 工作草案中唯一可以确定的事就是不能确定任何事情。
在现在的草案和被作为建议书采纳的过程中，几乎可以肯定它将在某些方面发生变化，
但强调结构和语义的目标不可能变化。出于这个原因，
最好研究您现在构建的页面，并开始养成适当使用结构和样式的习惯。
使用标记来指定某些事物是什么，而不是如何显示它们，并使用 CSS 来完成其余工作。
总的来说，更多地考虑文档的结构以及您想要它们干什么，而不必太多地考虑它们将如何显示。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/wa-xhtml/index.html">英文原文</a>.
        <br /><br /></li>
				<li>请参阅
          <a href="http://www.w3.org/TR/xhtml2">XHTML 2.0</a>的最新版本，以了解它目前包含哪些内容。
        <br /><br /></li>
				<li>请查找有关如何用
          <a href="http://www.w3.org/TR/xml-events">XML Events</a>控制页面和任何 XML 文档中事件的信息。
        <br /><br /></li>
				<li>请阅读使用
          <a href="http://www.w3.org/TR/xforms/">XForms</a>的下一代 Web 表单。
        <br /><br /></li>
				<li>请阅读文章“
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xforms/index.shtml">Get ready for XForms</a>”（
          <i>developerWorks</i>，2002 年 9 月），
学习有关 XForms 的更多知识。
        <br /><br /></li>
				<li>请快速阅读
          <a href="http://www.w3.org/TR/xframes/">XFrames</a>。
        <br /><br /></li>
				<li>请阅读
          <a href="http://www.w3.org/TR/xhtml-modularization">Modularization of XHTML</a> 或阅读

          <i>developerWorks</i>Web 体系结构专区上的
          <a href="http://www.ibm.com/developerworks/cn/cnedu.nsf/xml-onlinecourse-bytitle/95279FA45716812B48256B5400285DDE?OpenDocument">XHTML的模块化</a>教程（2001 年 10 月），了解 XHTML 2.0 是如何构造的。
        <br /><br /></li>
				<li>请在
          <a href="http://www.xml.com/pub/a/2002/08/07/deviant.html">XHTML 2.0 The Latest Trick</a>
中参考 Kendall Grant Clark 有关 XHTML 2.0 以及 Semantic Web 的注释。
        <br /><br /></li>
				<li>请在
          <a href="http://www.xml.com/pub/a/2002/03/13/xlink.html">XLink: Who Cares?</a> 中阅读
Bob DuCharme 有关 XLink 及其前景的想法。

        <br /><br /></li>
				<li>下载
          <a href="http://www.x-smiles.org/">X-Smiles</a>，它是一种 XForms 浏览器。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-wa-xhtml/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Nicholas
Chase 曾参与过很多公司（如 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa
Bay Buccaneers 等）的网站开发。Nick 曾是一名高中物理教师、低辐射废物设备管理人员、在线科幻杂志编辑、多媒体工程师和
Oracle 讲师。
最近，他成为 Site Dynamics Interactive Communications（位于佛罗里达州的 Clearwater）的
CTO，
而且还是三本有关 Web 开发书籍的作者，包括 <i>Java and XML from Scratch</i>(Que) 和即将出版的
        <i>Primer Plus XML Programming</i>(Sams)。他乐意听取读者意见，可以通过
        <a href="mailto:nicholas@nicholaschase.com">nicholas@nicholaschase.com</a>与他联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:42 <a href="http://www.blogjava.net/Vencent/articles/36734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧: 使用 CSS2 显示 XML 文档::XSLT 的一种不太“昂贵”的替代方法</title><link>http://www.blogjava.net/Vencent/articles/36730.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36730.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36730.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36730.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#author">David Mertz，博士</a>, 审查者, Gnosis Software, Inc.<br /></p>
		<p>2001 年  12 月  01 日</p>
		<blockquote>没
有定制编辑器和查看器，阅读 XML 数据是相当困难的。一种查看 XML 的轻量型方法就是：将级联样式表（cascading style
sheet (CSS2)）附加到 XML 文档上，然后使用最新的 Web 浏览器来查看这些 XML 文档（Mozilla 非常棒，通常 IE
就足够了）。developerWorks 专栏作家 David Mertz 在本技巧文章中讨论了这一替代方法。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>阅读 XML
文档对于人类来说并不容易。XML
文档全是文本，但是各部分的可视安排未必很好地对应于各部分之间概念上的连接。而且，在标记当中查找内容使得略读也很困难。当然，XML
的主要目的并不是作为供人类直接查看的一种格式。通常，在 XML 源代码能够为人们所理解前，都
将其转换成其它格式。对于面向散文的文档，目标通常是 HTML 页面或 PDF 文件（通过“格式编排对象 [FO]（Formatting
Object，FO）”标记），也可以是一个打印页面。常用 XSLT 来执行到人类可读格式的转换。对于面向数据的 XML 文档，目标一般是
DBMS 数据格式或读取 XML 文 件的应用程序提供的内存表示。</p>
		<p>但是，developerWorks
的读者通常都是开发人员。我们的重点是介绍可以并且应该不让最终用户烦恼的许多事物。当在格式转换的幕后行踪中出现问题时，我们的工作就是详查中间格式
（包括 XML）。通常，在开发过程期间，我们还要负责开发样本或测试 XML 文档，
以模拟可能发生的情况或进入到分布式应用程序中的某一阶段（在实际的生成器或客户存在之前）。</p>
		<p>与一些格式比较，原始格
式的 XML 比较好管理。与二进制格式不同，在文本编辑器或文本查看器中打开 XML 文档也不是不可能。但是，标记很难可视地进行解析，特别是在
XML 编写者没有为便于解析而排列垂直和水平空白的情况下。如果您的工作主要是阅读原始 XML 文档，请查看我 以前评论过的 XML
编辑器之一（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#resources">参考资料</a>）。但是，对于只是偶尔查看 XML 源文件的人（或当许多人需要查看这些文件时），XML 编辑器往往显得太贵；不仅因为获得许可证的费用，还有学习曲线方面。
      </p>
		<p>
				<a name="N10056">
						<span class="atitle">使用 Web 浏览器</span>
				</a>
		</p>
		<p>
几乎所有开发人员都已安装了一个非常好的 XML 查看器……好吧，至少是相当不错的。最新版本的 Internet Explorer 和
Mozilla/Netscape 都努力同时解释 XML 文档与 HTML 文档。其它象 Opera 和 Konquorer
那样的浏览器也实现 CSS2 ― Opera 5+ 工作得很完美，Konqueror 2.2 是一个相当好的浏览器。大体上，Mozilla 和
Netscape 6 在显示以 CSS2 样式表中表示的样式的 XML 文档上做得非常好，而且准确。Internet
Explorer（至少是版本 6）做得也不错，只是好象忽略了 <code>display: inline</code> 属性。这使得 IE6 不太适合于显示面向散文的 XML 文 档（但它对于面向数据的 XML 文档仍然不错）。不过，IE6 在显示分层树中缺少 CSS2 样式表的 XML 文档方面确有优势，而且它允许折叠子树。
      </p>
		<p>通
常，我不是使用 XMetal（带有我 developerWorks 同事 Beno?t Marchal 提供的一些
XMetal“规则”），就是用我称之为“智能 ASCII”来编写源代码，并使用我编写的 txt2dw.py 工具将它转换为
XML。txt2dw.py 工具将文本转换成 developerWork 的 XML 手稿格式。作为练习，我决定只使用文本编辑器（加上
Mozilla 0.9.5）编写这一技巧文章。练习帮助我彻底掌握 Web 浏览器加上 CSS2 方法。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10066">
						<span class="atitle">构建样式表</span>
				</a>
		</p>
		<p>这里展示了我是如何处理这些事物的。我用适当的 XML 方言写了一些字（使用先前的技巧作为模板）。然后，创建一个要使用的空的 dW.css CSS2 文件，并把下列行添加到我的 XML 文档中充当样式表声明：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />			  dW.css" type="text/css"?&gt;<br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>到
目前为止，只有这个样式表声明，Mozilla 还不能对查看文档结构有任何帮助。接下来要做的就是构建一个 CSS2 样式表来修饰 XML
文档。一个容易的方法是从 XML 文档的顶部开始，然后按您的方式往下做。例如，developerWorks article.dtd
文档中的第一项是表示专栏的名称等的 <code> 。 我将使这部分看上去很大并用粗体，还把它居中以示强调。事实上，甚至在这
        <i>之前</i>，我就知道还有一些缺省值是整个文档应该具有的（我们可以根据需要，为各个上下文重设这些值）。清单 1 显示了我的 CCS2 文件的前几行。
      </code></p>
		<br />
		<a name="code1">
				<b>清单 1. 初始样式表内容</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<span class="boldcode">$DOCUMENT </span>
														<br />        {<br /><br /><br /><br /><br /><br /><span class="boldcode">font-family</span><br />        : "Times New Roman";<br /><br /><br /><br /><br /><br /><span class="boldcode">font-size</span><br />        : 12pt;<br /><br /><br /><br /><br /><br /><span class="boldcode">margin-top</span><br />        : 5px;<br /><br /><br /><br /><br /><br /><span class="boldcode">margin-left</span><br />        : 10px;<br /><br /><br /><br />}<br /><br /><br /><br /><br /><br /><span class="boldcode">*</span><br />         {<br /><br /><br /><br /><br /><br /><span class="boldcode">display</span><br />        : block;<br /><br /><br /><br /><br /><br /><span class="boldcode">background-color</span><br />        : white;<br /><br /><br /><br /><br /><br /><span class="boldcode">padding</span><br />        : 2px;<br /><br /><br /><br />}<br /><br /><br /><br /><br /><br /><span class="boldcode">seriestitle</span><br />         {<br /><br /><br /><br /><br /><br /><span class="boldcode">font-weight</span><br />        : bold;<br /><br /><br /><br /><br /><br /><span class="boldcode">font-size</span><br />        : 18pt;<br /><br /><br /><br /><br /><br /><span class="boldcode">text-align</span><br />        : center;<br /><br /><br /><br />}<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>从这时开始，我继续到下一个遇到的元素（在这个示例中是 ），一个接着一个。在添加了一些块级别的元素后，我知道有必要确保所有内联元素都以这种方式出现。为此，浏览 DTD 帮助提醒我相关的元素。所以，我在清单 2 中包含了几行。</p>
		<br />
		<a name="code2">
				<b>清单 2. 处理内联元素</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<span class="boldcode">/* Inline Typographic Elements */<br /><br /><br /><br /></span>
														<br />
														<br />
														<br />
														<span class="boldcode">a, i, b, sub, sup, p&gt;code</span>
														<br />         { <br /><br /><span class="boldcode">display</span><br />        : inline;<br /><br /><br /><br /><br /><br /><span class="boldcode">background-color</span><br />        : inherit; }<br /><br /><br /><br /><br /><br /><span class="boldcode">a</span><br />                       { <br /><br /><span class="boldcode">color</span><br />        : blue;<br /><br /><br /><br /><br /><br /><span class="boldcode">text-decoration</span><br />        : underline; }<br /><br /><br /><br /><br /><br /><span class="boldcode">i</span><br />                       { <br /><br /><span class="boldcode">font-style</span><br />        : italic; }<br /><br /><br /><br /><br /><br /><span class="boldcode">b</span><br />                       { <br /><br /><span class="boldcode">font-weight</span><br />        : bold; }<br /><br /><br /><br /><br /><br /><span class="boldcode">b[class="red"]</span><br />          { <br /><br /><span class="boldcode">color</span><br />        : red; }<br /><br /><br /><br /><br /><br /><span class="boldcode">b[class="blue"]</span><br />         { <br /><br /><span class="boldcode">color</span><br />        : blue; }<br /><br /><br /><br /><br /><br /><span class="boldcode">b[class="green"]</span><br />        { <br /><br /><span class="boldcode">color</span><br />        : green; }<br /><br /><br /><br /><br /><br /><span class="boldcode">sub</span><br />                     { <br /><br /><span class="boldcode">vertical-align</span><br />        : sub }<br /><br /><br /><br /><br /><br /><span class="boldcode">sup</span><br />                     { <br /><br /><span class="boldcode">vertical-align</span><br />        : super }<br /><br /><br /><br /><br /><br /><span class="boldcode">sub,sup</span><br />                 { <br /><br /><span class="boldcode">font-size</span><br />        : small }<br /><br /><br /><br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>再
添加一些块级别元素，您就完成了一个非常漂亮的 XML 文档的表示。更好的是，将来每次我需要查看相同 XML
方言表示的文档时，要做的这少许工作是有用的。假设使用了最新的 Web 浏览器，不需要先将 XML 源代码转换成 HTML 或 PDF
格式（developerWorks 作为其自己处理过程程的一部分执行这一操作），就可以查看完全相同的有用外观。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10192">
						<span class="atitle">最终外观</span>
				</a>
		</p>
		<p>
开发 CSS2 样式表以匹配 XML 文档的方言，这一过程非常简单。当然，您会发现要担心不同的特定标记。而且，对于更多面向数据的文档，您几乎肯定要在定义的某些地方使用一些 
        <code>display: table</code> 属性。进行少量工作来设置 CSS2 样式表，使检验 XML 文档大为轻松。
      </p>
		<p>让我向您展示一张我所使用过的本文档的图片：图 1。可以在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#resources">参考资料</a>链接中找到相应的源码，但是读者可能使用不同的浏览器版本和平台，这样产生的效果会有所不同（如果您的浏览器有些方面不合理，请升级）：
      </p>
		<br />
		<a name="fig1">
				<b>图 1. 用 Mozilla 查看的、由 CSS2 样式表指导的本文档视图</b>
		</a>
		<br />
		<img alt="Mozilla 与 XML/CSS2 一起运行" src="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/css2-tip.jpg" height="500" width="524" />
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-tipcss2/index.html">英文原文</a>.
        <br /><br /></li>
				<li>请参加有关本文的
          <a href="javascript:void forumWindow()">论坛</a>。
        <br /><br /></li>
				<li>在
          <a href="http://www-128.ibm.com/developerWorks/cn/xml/x-matters/part6/index.shtml">XML 问题 #6</a>中，我评论了许多定制 XML 编辑器（多数支持 CSS2）。
        <br /><br /></li>
				<li>产生在您面前的本技巧文章的资料包括作为本技巧文章基础的
          <a href="http://gnosis.cx/publish/programming/css2-tip.xml">XML 文件</a>。另外值得注意的是：我编写这一技巧文章期间使用（并修改）的
          <a href="http://gnosis.cx/publish/programming/dW.css">CSS2 样式表</a>。 而且，为符合必要的 XML 方言，我在编写本技巧文章时一直在一个窗口中打开
          <a href="http://gnosis.cx/publish/programming/article.dtd">developerWorks DTD</a>。
        <br /><br /></li>
				<li>查看 CSS 特性的一个非常好的在线资料是 Miloslav Nic 编写的
          <a href="http://www.zvon.org/xxl/CSS2Tutorial/General/htmlIntro.html">CSS2 Tutorial</a>。尤其是 CSS 属性的索引很有价值。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipcss2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="作者照片：David Mertz" src="http://www.ibm.com/developerworks/i/p-mertz.gif" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>David Mertz 运用完全非结构化的头脑来编写结构化的文档格式。可以通过 mertz@gnosis.cx 与 David 联系；
        <a href="http://gnosis.cx/publish/">http://gnosis.cx/publish/</a>上详细介绍了他的生活。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:41 <a href="http://www.blogjava.net/Vencent/articles/36730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于数据的 XML: XLink 和数据::使用 XLink 简化数据表示</title><link>http://www.blogjava.net/Vencent/articles/36732.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36732.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36732.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36732.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/#author">Kevin Williams</a>, 首席 XML 设计师, Equient（Veridian 的一个部门）<br /></p>
		<p>2001 年  7 月  01 日</p>
		<blockquote>本专栏讨论了表示数据时如何使用 XLink 指针使 XML 文档变得更紧凑、更灵活。样本代码显示了带有或不带 XLink 指针的发票示例，加上一个将 XLinks 用于可按 URL 寻址的数据库的示例。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>近来，W3C 将一个称为 XLink
的规范升级到“推荐”状态。在本专栏中，将研究 XLink
以及如何使用它来简化数据的表示和传输。</p>
		<p>
				<a name="N10048">
						<span class="atitle">究竟什么是 XLink 呢？</span>
				</a>
		</p>
		<p>
引用 W3C XLink 规范：“XML 链接语言（XLink）... 允许在 XML
文档中插入元素以创建并描述资源之间的链接。”然后，规范宣称使用
XLink 定义的链接类似于 HTML
超级链接，从而导致许多程序员得出这就是该规范的唯一目的结论。但是，还有另一种方法可以使用
XLink 来获取巨大利益：显示数据资源之间的关系。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10051">
						<span class="atitle">操作中的 XLink</span>
				</a>
		</p>
		<p>
设想一个典型的订单跟踪应用程序，假定对于大型制造公司。描述订单的
XML
文档通常将包含下达订单的顾客信息、订单状态和订单上带有数量和价格的独立行项。文档用户可能想以不同的方法使用它。在财务部，请求订单数据的人员可能只
对需要让顾客付款的总价感兴趣
－
而发票上独立行项的详细信息（除数量和价格外）却是不相关的。相反，顾客要求订单时（也许为了在线查看），他们可能想查看更多信息，例如，行项上一个部件
的可读名称。将带有全部详细信息的整个文档传送给每个顾客并不一定会有意义：理想的做法是仅传送订单的基本框架（对于仅对基本内容感兴趣的顾客），它带有
指向更详细信息的指针。XLink
提供了完成该任务的出色方法。</p>
		<p>完整的订单文档有些类似于“清单 1”。</p>
		<br />
		<a name="N1005D">
				<b>清单 1. 完整的发票文档（带有嵌入式的顾客和部件信息）</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br />&lt;order&gt;<br />  &lt;orderDate&gt;7/23/2001&lt;/orderDate&gt;<br />  &lt;shipDate&gt;7/26/2001&lt;/shipDate&gt;<br />  &lt;customer&gt;<br />    &lt;customerID&gt;18273&lt;/customerID&gt;<br />    &lt;customerName&gt;Fred Q. Customer&lt;/customerName&gt;<br />    &lt;billingAddress&gt;<br />      &lt;address1&gt;100 Main St.&lt;/address1&gt;<br />      &lt;city&gt;Anywhere&lt;/city&gt;<br />      &lt;state&gt;AZ&lt;/state&gt;<br />      &lt;zip&gt;12345&lt;/zip&gt;<br />    &lt;/billingAddress&gt;<br />    &lt;shippingAddress&gt;<br />      &lt;address1&gt;800 Corporate Dr.&lt;/address1&gt;<br />      &lt;address2&gt;Suite 314&lt;/address2&gt;<br />      &lt;city&gt;Anywhere&lt;/city&gt;<br />      &lt;state&gt;AZ&lt;/state&gt;<br />      &lt;zip&gt;12345&lt;/zip&gt;<br />    &lt;/shippingAddress&gt;<br />  &lt;/customer&gt;<br />  &lt;lineItem&gt;<br />    &lt;part&gt;<br />      &lt;partID&gt;W-127&lt;/partID&gt;<br />      &lt;partName&gt;Widget&lt;/partName&gt;<br />      &lt;partSize&gt;2-inch&lt;/partSize&gt;<br />      &lt;partColor&gt;Blue&lt;/partColor&gt;<br />    &lt;/part&gt;<br />    &lt;quantity&gt;17&lt;/quantity&gt;<br />    &lt;unitPrice&gt;0.20&lt;/unitPrice&gt;<br />  &lt;/lineItem&gt;  <br />  &lt;lineItem&gt;<br />    &lt;part&gt;<br />      &lt;partID&gt;S-387&lt;/partID&gt;<br />      &lt;partName&gt;Sprocket&lt;/partName&gt;<br />      &lt;partSize&gt;1-inch&lt;/partSize&gt;<br />      &lt;partColor&gt;Red&lt;/partColor&gt;<br />    &lt;/part&gt;<br />    &lt;quantity&gt;31&lt;/quantity&gt;<br />    &lt;unitPrice&gt;0.40&lt;/unitPrice&gt;<br />  &lt;/lineItem&gt;  <br />&lt;/order&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>不仅“清单
1”中的完整发票包含顾客可能不需要（或正好要废弃）的信息，而且，如果使用本地的
XML
存储数据，该文档还会产生问题：如果在每个文档中嵌入每个部件的详细信息，重复的部件信息会浪费大量磁盘空间。但是，假设此时正在从关系数据库中按需要取
出信息。存储这种信息类型的数据库的典型设计将包含三个主控表：定义制造商所有顾客的“顾客”表、描述制造商销售的所有部件的“部件”表和与这两个表相关
的“订单”表，它显示哪一个顾客订购了哪一种部件、订购时间和数量。这提示我们如何将该文档分成几个可控制的部分。</p>
		<p>因此，“清单 2”使用 XLink 结构引用正好包含 
        <code>customer</code> 和 
        <code>part</code> 
元素的文档来替换这些元素。结果文档将有些类似于“清单 2、3、4 和
5”。
      </p>
		<br />
		<a name="N10075">
				<b>清单 2. 带有 XLink 简单链接的已修改发票文档</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br />&lt;order xmlns:xlink="http://www.w3.org/1999/xlink"&gt;<br />  &lt;orderDate&gt;7/23/2001&lt;/orderDate&gt;<br />  &lt;shipDate&gt;7/26/2001&lt;/shipDate&gt;<br />  &lt;customer xlink:href="customers/18273.xml"&gt;18273&lt;/part&gt;<br />  &lt;lineItem&gt;<br />    &lt;part xlink:href="parts/W-127.xml"&gt;W-127&lt;/part&gt;<br />    &lt;quantity&gt;17&lt;/quantity&gt;<br />    &lt;unitPrice&gt;0.20&lt;/unitPrice&gt;<br />  &lt;/lineItem&gt;  <br />  &lt;lineItem&gt;<br />    &lt;part xlink:href="parts/S-387.xml"&gt;S-387&lt;/part&gt;<br />    &lt;quantity&gt;31&lt;/quantity&gt;<br />    &lt;unitPrice&gt;0.40&lt;/unitPrice&gt;<br />  &lt;/lineItem&gt;  <br />&lt;/order&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="N10081">
				<b>清单 3. customers/18273.xml</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br />&lt;customer&gt;<br />  &lt;customerID&lt;18273&lt;/customerID&gt;<br />  &lt;customerName&gt;Fred Q. Customer&lt;/customerName&gt;<br />  &lt;billingAddress&gt;<br />    &lt;address1&gt;100 Main St.&lt;/address1&gt;<br />    &lt;city&gt;Anywhere&lt;/city&gt;<br />    &lt;state&gt;AZ&lt;/state&gt;<br />    &lt;zip&gt;12345&lt;/zip&gt;<br />  &lt;/billingAddress&gt;<br />  &lt;shippingAddress&gt;<br />    &lt;address1&gt;800 Corporate Dr.&lt;/address1&gt;<br />    &lt;address2&gt;Suite 314&lt;/address2&gt;<br />    &lt;city&gt;Anywhere&lt;/city&gt;<br />    &lt;state&gt;AZ&lt;/state&gt;<br />    &lt;zip&gt;12345&lt;/zip&gt;<br />  &lt;/shippingAddress&gt;<br />&lt;/customer&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="N1008D">
				<b>清单 4. parts/W-127.xml</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br />&lt;part&gt;<br />  &lt;partID&gt;W-127&lt;/partID&gt;<br />  &lt;partName&gt;Widget&lt;/partName&gt;<br />  &lt;partSize&gt;2-inch&lt;/partSize&gt;<br />  &lt;partColor&gt;Blue&lt;/partColor&gt;<br />&lt;/part&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="N10099">
				<b>清单 5. parts/S-387.xml</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br />&lt;part&gt;<br />  &lt;partID&gt;S-387&lt;/partID&gt;<br />  &lt;partName&gt;Sprocket&lt;/partName&gt;<br />  &lt;partSize&gt;1-inch&lt;/partSize&gt;<br />  &lt;partColor&gt;Red&lt;/partColor&gt;<br />&lt;/part&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
您大概可以看出用该方法构造信息结构的明显优势。如果财务部仅仅想给顾客
18273
发送帐单（该标识在财务软件中），则只需要检索订单文档以获取所需信息。可以在一个比嵌入了所有额外信息的原始文档小得多的文档中找到该信息。可以设置应
用程序，这样在线检索该发票的顾客会看到自动显示的信息（在初始呈递时，呈递该页面的样式表单可以获取顾客和部件的详细信息），或者详细信息作为超级链接
出现，以供顾客遍历。带有超级链接的结构化文档更加灵活和强大；顾客只检索到相关部分。</p>
		<p>
您可能想知道这个策略对系统有什么好处。毕竟，可能会在需要时使用在处理过程中生成的
XML 文档在关系数据库中存储数据，而不是在本地 XML
数据库中存储。可以用几种方式利用该方法。如果顾客信息和部件信息的变更率相对较低，则创建或更改顾客和部件时，可以生成
XML
文档来表示它们，这样就确保了该数据的请求不需要代价巨大的附加数据库调用。它还允许创建顾客和部件目录，而完全不需要访问关系数据库。如果正在使用可按
URL 寻址的关系数据库 － 大多数关系型数据库已经或者将很快提供该功能
－
可以创建一个允许在处理过程中检取信息的访问器（例如，一个存储过程），如“
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/listing6.shtml">清单 6</a>”中的假想示例。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100AD">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>本专栏演示了如何使用 XLink
的基本功能来简化文档结构和降低网络传输的开销。它仅讨论使用简单链接的方法；XLink
还提供了扩展的链接功能，可以用它将许多资源关联在一起（例如，可以创建一个
XLink 链接库，在顾客与订单之间建立关系）。随着 XML
和相关帮助器技术的不断成熟，在确定如何实现信息系统时，程序员将拥有更大的灵活性，允许协调解决方案以最大限度地满足顾客的需要。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-xdxlnk/index.html">英文原文</a>.
        <br /><br /></li>
				<li>要了解有关 XLink 的更多信息，请查阅
          <a href="http://www.w3.org/TR/xlink">W3C Recommendation</a>。
        <br /><br /></li>
				<li>要快速查看如何使用
          <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/index.shtml">XLink for
hyperlinking or for external reference</a>，请查阅 Brett McLaughlin
的新近技巧。
        <br /><br /></li>
				<li>查看 Kevin Williams 以前的专栏和文章：

          <ul><li>用于数据的 XML：
              <a href="http://www.ibm.com/developerworks/library/x-xdarch.html">Using
XML Schema archetypes</a></li><li>用于数据的 XML：
              <a href="http://www.ibm.com/developerworks/xml/library/x-xdarc2.html">
Applying XML Schema archetypes</a></li><li>Soapbox：Kevin 说明了他提倡
              <a href="http://www.ibm.com/developerworks/xml/library/x-sbsch.html">
XML Schema for data-centric XML apps</a>的原因。
            </li><li><a href="http://www.ibm.com/developerworks/library/x-struct/">XML
Structures for Existing Databases</a>，从 Wrox 出版的

              <i>Professional XML Databases</i>一书中摘录的一章。
            </li></ul><br /></li>
				<li>了解
          <a href="http://www-4.ibm.com/software/data/db2/extenders/xmlext/index.html&amp;origin=x">
DB2 XML Extender</a>和构建在 DB2 中的 XML 支持。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/events/solutionsevent/&amp;origin=x">
Solutions 2001 开发人员大会</a>于 8 月 13 日到 16
日在旧金山召开；可在 
          <a href="http://216.140.182.181/solutions/guest/AgendaBuilder.html&amp;origin=x">
AgendaBuilder</a> 中搜索或浏览 230 多个会议的描述。有 20 多个专注于
XML 及其相关技术的会议，包括：

          <ul><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=144">
Hands-on: Integrating XML with DB2</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=117">
Hands-on: Voice XML Tools/Building Killer Apps</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=48">
XSL by Example: An Introduction to XML Transformations</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=43">
Parsing and Programming XML Documents using Java
Technology</a></li></ul><br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xdata/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Kevin Williams 是 Equient 的首席 XML 设计师，Equient 是 Veridian
专门从事信息管理系统的 XML 设计的一个部门。他还与人合著了几本关于
XML 的书籍，由 Wrox Press 出版。可通过 
        <a href="mailto:kevin@realworldxml.com">kevin@realworldxml.com</a>
与他联系以获取说明。在他的网站 
        <a href="http://www.realworldxml.com/">www.realworldxml.com</a>
上可以找到任意的 XML
想法、技巧、窍门和个人的激昂演说。您知道，是给孩子们看的！
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:41 <a href="http://www.blogjava.net/Vencent/articles/36732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧：XML 中如何使用 XLink::XLink 是用于基本链接或用于嵌入外部资源</title><link>http://www.blogjava.net/Vencent/articles/36729.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:37:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36729.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36729.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36729.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/#author">Brett McLaughlin</a>, Enhydra 策略顾问, Lutris Technologies<br /></p>
		<p>2001 年  7 月  01 日</p>
		<blockquote>XLink 是一种与 XML 相关的规范，它使您在 XML 文档中获得生动的链接效果。在这篇短小的技巧文章中，学习如何通过 XLink 在 XML 文档中包含其它 XML 文档的部件。代码示例演示了这项技术。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>自两年
多前，发布了 XML以来，开发了数量令人难以置信的、都与 "X" 相关的事物。正如该事实所证明，您可以发现当今许多与 XML
相关的规范：XPointer、XLink、XSD（XML
Schema）、RDF、RSS、XHTML，甚至还可以说出一些。在本文中，我简要探索了 XLink，定义了引用其它文档的 XML
链接机制的一种特别有用的规范。</p>
		<p>对于 HTML 作者来说，开始 XLink 听起来非常象 
        
        <code>&lt;a href="http://www.nickelcreek.com"&gt;Check out Nickel Creek!&lt;/a&gt;</code> 中所熟悉的 
        
        <code>a</code> 元素。但 XLink 提供的远远不止是单向链接。使用 XLink，可以创建双向链接。还可以定义如何处理链接，并且更重要的是，可以允许从
        
        <i>任何</i> XML 元素（而不是仅仅从 
        
        <code>a</code> 元素）链接。由于所有这些原因，很值得我们去了解 XLink。
      
      </p>
		<p>
				<a name="1">
						<span class="atitle">操作中 XLink</span>
				</a>
		</p>
		<p>让我从为您显示一个小的 XML 文档开始，这个文档表示了我的几把吉他。
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/listing1.shtml">清单 1</a>使用了一些 XLink 构造。
      
      </p>
		<p>首先，您注意到我引用了 XLink 名称空间，以便该文档访问 XLink 属性和功能。其次，我只涵盖了 "simple" 类型的 XLink，该类型是由 
        
        <code>xlink:type</code> 属性指定的。那是由于支持 XLink 的浏览器很少，目前，只发现 Mozilla 和 Netscape 6 支持。（我还无法在 IE 6.0 中测试过，但版本 5.5 是无 XLink 支持。）所以您只需要了解 XLink 的基本特征
      
      </p>
		<p>现在，您有一些基本的 XML 可以使用。为了利用 XLink，您所要做的就是使用包含链接的元素上的一些属性。请看文档的 
        
        <code>guitar</code> 元素，它对每个吉他都指定了一个弦乐器制作匠（吉他制造者）。我已经讨论过设置成值 "simple" 的 
        
        <code>xlink:type</code> 属性的用法。然后该元素使用 XLink 指定链接到的 URL。为了指定这个 URL，该元素使用 
        
        <code>xlink:href</code>
属性。在这一点上，您可能认为，“这没有什么大不了的”，它就象 HTML 一样。这一点上，您是对的。缺省情况下（当然，这里假定浏览器支持
XLink），当单击该链接时，这会设置一个替换当前窗口的链接。、如果希望在一个新窗口中打开链接的目标，那么可以通过添加 <code>xlink:show</code> 属性，给它一个 "new" 值来实现；缺省是 "replace"，这是普通的 HTML 行为。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">XLink 的潜力</span>
				</a>
		</p>
		<p>到现在为止，我只讲述了基本链接。如果想访问作为资源的远程位置，譬如图像链接，事情会变得很有趣。请查看清单 1 中的 
        
        <code>description</code> 元素。它将 
        
        <code>xlink:show</code>
属性值设置成 "embed"。这意味着会在该页面中直接处理该资源（在本示例中，显示所描述吉他的图像文件）。这实质上是告诉支持 XLink
的浏览器，在 XML 中直接插入指定的文档。如果考虑的不仅仅是一个图像而是另一个 XML 文档时，可能性确实还远远不止这些。 </p>
		<p>更深一步，您可以指定资源
        
        <i>什么时候</i>出现。计时是由 
        
        <code>xlink:actuate</code>
属性来处理，它定义什么时候资源是 "read" 以及显示。值为 "onLoad" 时，如清单 1
中所示，当初始文档装入时，就载入该资源，这时还应当显示该资源。您还可以指定 "onRequest"
值，这意味着只有当单击该链接时，才会显示该资源。对于低宽带设置，这很方便，使得用户可以选择他想花功夫等待的资源。 </p>
		<p>我知道本文仅是 XLink 一瞥，但它应当给您一个好的开始。关于 XLink 的详细信息，请查看
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/#resources">参考资料</a>中的规范。您还应该密切注视新的支持 XLink 的浏览器的功能列表，一旦支持 XLink，就使用它吧。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-xlink/index.html">英文原文</a>.
        
        <br /><br /></li>
				<li>有关 XLink 的详细信息，请查看
          
          <a href="http://www.w3.org/TR/xlink/">XLink 规范</a>。
        
        <br /><br /></li>
				<li>当您已开始使用 XLink，请查看
          
          <a href="http://www.w3.org/TR/xptr">XPointer</a>，它将更多的、更高级的链接添加到 XLink。
        
        <br /><br /></li>
				<li>通过 Doug Tidwell 的系列文章
          
          <a href="http://www.ibm.com/developerworks/xml/library/buildappl/abstract.html">Building an XML application</a>研读您的 XML。
        
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/certify/certs/adcdxmlrt.shtml">IBM 认证开发人员</a>将对您有的 XML 和相关技术的知识进行认证。
        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="Brett McLaughlin" src="http://www-128.ibm.com/developerworks/cn/i/p-brett.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Brett McLaughlin (
        
        <a href="mailto:brett@newinstance.com">brett@newinstance.com</a>) 是 Lutris Technologies 的 Enhydra 策略顾问，他致力于研究分布式系统体系结构。他是
        
        <i>Java and XML</i>(O'Reilly)
的作者。他还参与了诸如 Java Servlet、Enterprise JavaBeans 技术、XML
和商家对商家应用程序等技术的研究。他与 Jason Hunter 一起创建了 JDOM 项目，该项目为在 Java 应用程序中使用 XML
提供了一个简单的 API。他还是 Apache Cocoon 项目、EJBoss EJB 服务器的活跃开发人员，以及 Apache
Turbine 项目的共同创始人。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:37 <a href="http://www.blogjava.net/Vencent/articles/36729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML #1:XML 和语义：实际情况</title><link>http://www.blogjava.net/Vencent/articles/36728.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36728.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36728.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36728.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#author">Uche Ogbuji</a>, CEO 兼首席顾问, Fourthought, Inc.<br /></p>
		<p>2001 年  2 月  01 日</p>
		<blockquote>这
篇对 XML 和语义的讨论揭开了这个由 Uche Ogbuji 撰写的专栏的序幕，本专栏讨论了 XML
知识管理方面的问题，包括元数据、语义、资源描述结构
(RDF)、主题映射和自主主体。本专栏从实践的角度来剖析这个主题，因此它针对的读者是程序员，而不是针对理论家。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>“XML 编程思想”这个新专栏将讨论 XML 和
        <i>知识体系结构</i> (KA)
的交汇处。知识体系结构听起来象是一句行话，但它其实只是一个涵盖面很广的术语，是指当今
XML
逐步走向成熟时出现的一些非常有用的技术。元数据管理、语义透明性和自主主体都是
XML 独有的概念，但 XML
对统一结构化语法和半结构化语法的承诺有助于将几乎不可能的事变成切实可行的。
      </p>
		<p>
区分本专栏和许多此类主题讨论的主要特征是我将针对程序员展开讨论，而不是针对理论家。我将讨论一些开发工具和技术，它们可以让开发人员使用
XML
更好地收集和浏览隐藏在数据中的知识，无论这些数据是在公司的数据库中还是在
Web
上。这听上去象是在夸夸其谈，但本专栏的各篇文章其实是一个循序渐进的过程，决不会脱离常识。</p>
		<p>
本专栏的前两篇文章介绍了预备知识，因此它们可能会稍微偏离我的基本规则“重代码，轻理论”。前两篇专栏文章将讨论
XML
的语义和相关词汇。我只用现有产品来讨论其创始过程，以供开发人员了解，但现在还不会展示许多实用代码。</p>
		<p>
				<a name="1">
						<span class="atitle">究竟什么是语义？</span>
				</a>
		</p>
		<p>那么，什么是语义？因为语义这个单词的特殊性，每个人对语义定义的观点都各有不同。一般来说，语义是构建在公用语法上的系统中
XML 数据的一层规范。这就引出了许多标记了 
        <i>XML
语义</i>的概念。
      </p>
		<p>它们包括：</p>
		<ul>
				<li>元素类型名称、属性名称和某些情况下内容术语的解释</li>
				<li>用于用有效文档引导事务的处理规则（也称作商业规则）</li>
				<li>一个文档中的结构化元素与另一个文档中的结构化元素之间的关系</li>
		</ul>
		<p>当然，在这三概念之间有一些重叠。</p>
		<p>
				<b>反观语义</b>
				<br />
两年前，我写了一篇文章在 
        <i>Sunworld</i>（现在称作
        <i>Unix
Insider</i>：请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#resources">参考资料</a>）上发表，这篇文章研究了新的 XML
如何适应电子数据交换 (EDI) 的世界。促使 EDI 回到 70
年代的事件之一就是对统一商业事务词汇的承诺，以便改进不同公司的信息系统之间的电子通信自动化。
      </p>
		<p>EDI 为特定业界定义了一种特殊语法和一套特殊语义 --
一些是普通语义，而另一些是非常特殊的语义。XML
目前有明确的语法和结构，但它没有提
        <i>语义透明性</i>。语义透明性可以使
XML 机器建立元素（比如， 
        <code>PurchaseOrder</code> 或 
        <code>PO</code> ）和根据该元素执行专门操作的高阶处理之间的关系。总而言之，它意味着数据中的表达式如实地表示了相应概念的含义。语义透明性的最终测试是如果某个人
        <i>
只</i>使用适用于 XML 处理软件的机制，他能否正确理解 XML
数据的含义。
      </p>
		<p>显然，单靠 XML 根本无法实现语义透明性，这正是那么多 XML
技术专家关注语义透明性的原因。如果 XML
系统不能实现语义透明性，那么这些系统可能就不符合有三十几年历史的
EDI，就不能成为一种自动电子交易的方式。</p>
		<p>关于 XML 实现语义透明性的必要性还有一些争论。在完成 XML 1.0
规范之前，各种团体都期望开发语义透明性的机制。实际上，某些创意没有考虑到
XML；它们期望（至今仍是这样）成为集
SGML、XML、EDI、表格式报表和其它机器格式的术语于一身的通用权威。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">关于 ISO BSR</span>
				</a>
		</p>
		<p>机器可读语义的业界元老自有其 EDI 基础：自 1998 年开始开发的 ISO
基本语义字典
(BSR)，其主旨是“充当参考中心，辅助跨商业、工业和管理的数据的通用、多语言理解”。这个宏伟的目标似乎只有
ISO 才能承担，然而 BSR 却迟迟不能完成。</p>
		<p>目前已经建立了基本规则（出版物 ISO 16668:2000），ISO
已经收集了一个试用集合，有几千项，例如 
        <code>AccountsPayables</code> 、 
        <code>ContactParty.CustomerAssigned.Identifier</code> 
和 
        <code>Contract</code> 。一旦完成，BSR 可以让程序员使用合成 XML
模式，如以下 DTD 片段：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;!ELEMENT <br />        AccountsPayables.Contact (ContactParty.CustomerAssigned.Identifier)&gt; <br />&lt;!ELEMENT <br />        ContactParty.CustomerAssigned.Identifier (#PCDATA)&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
假设那些元素是由制造公司使用的报表格式，该公司将其会计工作外包给另一家公司。那么，XML
词汇的开发人员将从以下方式中得到语义透明性的好处：</p>
		<ul>
				<li>开发人员确保所使用的元素类型名称符合 BSR
中的等价概念，以最小化元素含义的多义性。制造商可以与会计人员讨论数据，并确保双方都认同所表达的内容。</li>
				<li>
由于术语的含义非常清楚，因此将此格式映射成会计学的标准格式比完成此类任务的常规做法更简单，它甚至可以自动完成。即使制造商使用
EDI，而会计人员使用 XML，这种简单映射仍是可行的。</li>
				<li>BSR 中的含义指出了元素之间的关系，例如 
          <code>ContactParty.CustomerAssigned.Identifier</code> 
元素和报表中别处或另一个文档中的 
          <code>Contract</code> 元素。
        </li>
		</ul>
		<p>即便在这个初级阶段，也可以使用 BSR
进行实验，因为全球信息定位服务 (GILS) 已经创造了试用 BSR 项的 RDF
模式和 XML 模式编译。GILS
是美国政府的倡议，它涵盖了用于寻找结构化信息的技术和资源。GILS BSR
编译是一个有价值的资源，它已经涵盖了在常规政府与私人交流中使用的常用术语。</p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<p>
																				<b>UN/CEFACT</b>：联合国贸易促进及电子商务中心
          <br /><b>CEN/ISSS</b>：欧洲标准化委员会／信息领域标准化体系
          <br /><b>DISA</b>：数据互换标准协会
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>但是，请注意这个初始集合是实验性的。不仅描述非常粗略，而且
XSchema 和 RDFS 表示中还有语法错误。</p>
		<p>我建议查看 BSR，因为它影响着重要组织，如
UN/CEFACT（全球范围）、CEN/ISSS（欧洲）和 DISA（美国）。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">统一欧洲和美国的术语</span>
				</a>
		</p>
		<p>CEN/ISSS 值得一提，这个组织在 XML/EDI
的领域中做了大量工作。CEN/ISSS
是负责促进欧盟中信息系统标准化的委员会。虽然据官方声称，它的
XML/EDI 工作仍处于试行阶段，但 CEN/ISSS
已经创建了一个综合结构，用于将 EDI 的 UN/EDIFACT 风格转换成
XML。这个转换结构包括 DTD 生成规则和熟悉 EDI
的开发人员可以试用的样本。其结果的确很复杂，但 EDI
的悠长历史确保了这两个字段和 XML/EDI
中使用的消息流都是非常明确的。</p>
		<p>显然，开发 EDI 的组织在处理 XML 语义方面跳跃了一大步。其中不带
EDI 标记的主要代表是 Microsoft。在 1999 年，Microsoft 推出了
BizTalk 结构。BizTalk 是
Microsoft、其伙伴和业界组织用于注册模式、进程描述和样本 XML
文件的库。其旨在充当 XML
格式和相关进程的交换所，这是它成为实现语义透明性的重要力量。</p>
		<p>部分是因为它是由一家公司开发的，部分是因为常用行业政策，BizTalk
已经成为激烈争论的主题。某些人将它看作是 Microsoft
通过在语义问题上建立霸权以达到掠夺 XML
的目的。不管政策如何，现在已经出现了在 BizTalk
结构中工作的工具。许多工具都是类似于 XML
解决方案的映射软件，它们提供了 GUI
以便将一个词汇映射成词汇。同样，开发人员可以开始使用基于 SOAP 的
BizTalk XML 消息格式的公开规范。遗憾的是，如果要执行重要的 BizTalk
消息传递，需要使用 Microsoft 的商业 BizTalk 服务器产品。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">该领域中的新生事物</span>
				</a>
		</p>
		<p>我没有涵盖部分相关的工作，如 OMG 的 XML 元数据交换 (XMI)，或 Unisys
的通用库 (UREP)，因为它们的主要目的是交换应用程序开发模型（虽然 XMI
和 UREP 与 XML 有一些关系）。</p>
		<p>在这篇文章中，我讨论了 XML
语义这个舞台上的一些重要演员。然而，现在该领域中的许多活动来自于新生代，如
ebXML、UDDI 和
eCo，以及纵向联合行业组织的工作。在下一篇文章中，我将讨论这些新加入者更实际的方面。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-sbsrch.html">英文原文</a>.
        <br /><br /></li>
				<li>Uche Ogbuji 撰写的
          <a href="http://www.sunworld.com/swol-02-1999/swol-02-xmledi.html">XML:
The future of EDI?</a> 讨论了即将问世的 XML 可能会替代
EDI；这篇文章接触了有关语义的问题。
        <br /><br /></li>
				<li>Robin Cover 在 1998 年研讨会上发表的论文
          <a href="http://www.oasis-open.org/cover/xmlAndSemantics.html">XML
和语义透明性</a>权威地总结了这些问题。
        <br /><br /></li>
				<li>国际标准组织 (ISO)
          <a href="http://forum.afnor.fr/afnor/WORK/AFNOR/GPN2/TC154WG1/index.htm">
基本语义字典 (BSR)</a>
是构建关于跨行业、国家和语言的数据元素含义的主要权威的创始人。
        <br /><br /></li>
				<li>
						<a href="http://www.gils.net/">全球信息定位服务 (GILS)</a>
创造了 
          <a href="http://www.gils.net/rdf/">RDF 模式</a>和
          <a href="http://www.gils.net/xml/bsr.xsd">XML 模式</a>格式的 ISO BSR
的早期编译。
        <br /><br /></li>
				<li>
						<a href="http://www.cenorm.be/isss">CEN/ISSS</a>
是负责信息系统标准化的欧洲委员会，它已经产生了 XML/EDI 试行项目的
          <a href="http://www.cenorm.be/isss/workshop/ec/xmledi/interim.html">中期报告</a>，这是该领域中最先进的成果之一。
        <br /><br /></li>
				<li>口号是“库、模板、代理”的
          <a href="http://www.xmledi-group.org/">XML/EDI 小组</a>从事于以 XML
格式促进 EDI 实践，通常是自动处理公司之间的事务。
        <br /><br /></li>
				<li>Microsoft 的
          <a href="http://biztalk.org/">Biztalk</a>
是表示商业事务的模式库和 XML 消息的结构。BizTalk 
          <a href="http://msdn.microsoft.com/xml/articles/biztalk/biztalkfwv2draft.asp">
文档和消息规范</a>已经公开。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="" src="http://www-128.ibm.com/developerworks/cn/i/p-uche.jpg" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Uche Ogbuji 是
        <a href="http://fourthought.com/">Fourthought Inc.</a>
的顾问兼创始人，该公司是专为企业知识管理应用提供 XML
解决方案的软件供应商和顾问。Fourthought 开发了 
        <a href="http://4suite.org/">4Suite</a>和
        <a href="http://fourthought.com/4SuiteServer">4Suite
Server</a>，它们是 XML 中间件的开放源码平台。Ogbuji
先生是一位出生于尼日利亚的计算机工程师和作家，他现居住于美国科罗拉多州的博耳德。可通过

        <a href="mailto:uche@fourthought.com">uche@fourthought.com</a>
与他联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:36 <a href="http://www.blogjava.net/Vencent/articles/36728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML 培训系列:制作教程的 XSLT 和基于 Java 的工具 -- 为 developerWorks 量身定做但也完全适用于您</title><link>http://www.blogjava.net/Vencent/articles/36726.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36726.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36726.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36726.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#author">Doug Tidwell</a>, 计算机传道士, eveloperWorks<br /></p>
		<p>2001 年  6 月  01 日</p>
		<blockquote>让
我们看看 developerWorks 是如何使用基于 Java 的开放源码工具来生成定制的 XSLT 应用程序，这些工具对生成
developerWorks 基于 HTML 的教程所需的单调冗长的工作进行了自动化处理。它也称为
Toot-O-Matic，目前适用于任何开发者，可以作为一个 XSLT 样本来进行观察也可以对它进行适当修改以满足您的培训需求。Doug
Tidwell 解释了其设计目标和 XML 文档设计。他还描述了 13 个代码样本来演示如何从一个 XML
源文档生成大量的包含定制图形、ZIP 文件以及两个 PDF 文件的 HTML 面板时使用的技术。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>在 developerWorks，我们非常高兴地公开 Toot-O-Matic 的源代码，
这是一个基于 XML 的工具，用来制作我们的教程。在本文中，
将讨论当构建工具时我们所做的设计决定，介绍如何使用它来
编写您自己的教程，还介绍了一些源代码的组织结构。希望这个工具
能对您有所帮助，并为您在如何使用 XML 和 XSLT 样式表通过各种有用方法
来操纵结构化数据方面提供一些建议。</p>
		<p>
				<a name="1">
						<span class="atitle">Toot-O-Matic
设计目标</span>
				</a>
		</p>
		<p>Toot-O-Matic 项目是从以下几个设计目标开始的：</p>
		<ul>
				<li>更方便地制作 developerWorks 教程</li>
				<li>“自食其力”（表示我们实际使用的都是我们倡导的技术）</li>
				<li>了解通过 XSLT 样式表能实现的程度</li>
		</ul>
		<p>首先，我将详细说明这些目标，然后将论述教程的实际设计。</p>
		<p>
				<a name="N10061">
						<span class="smalltitle">更方便地制作教程</span>
				</a>
		</p>
		<p>好几年前，在 developerWorks
构建我们的第一个教程时，创建的工作量是难以置信的
单调冗长。作者和编辑需要在类似 Microsoft Word
的工具中编写和编辑内容， 然后再开始发布过程。通常第一步是创建教程的
PDF 版本。高质量的可打印版 教程是很受欢迎的，并且很容易从 Microsoft
Word 的格式化文档中创建 （比从大量的 HTML
文件中创建要容易得多）。</p>
		<p>一旦完成了字处理文档，就将教程转换成 HTML。我们将那个单一的 HTML
文件分割成小段， 然后将标准的 IBM
页眉和页脚添加到每个小段中。这就产生了多个 HTML 文件 （通常是 50 到
100 个），而我们需要将这些文件链接在一起。链接到一起后，
如果您正在查看某一章节的第三个面板，那么单击 
        <b>Next</b>
会进入第四个面板， 而单击 
        <b>Previous</b>
会进入第二个面板。然后还需要创建一个菜单面板；
从这个菜单面板中，可以直接链接到任何特定章节的第一个面板。最后，
每个面板还有必须测试的鼠标经过的效果。
      </p>
		<p>
在作者和编辑忙于编写实际内容的同时，我们的图形设计人员在创建章节标题
和教程自身面板的图形。为了确保标题文本的一致性外观，设计人员创建了包含那些文本的图形，
并将它们绘制在适当的背景上。对于某些标题，设计人员还同时制作了
鼠标经过时的普通版本和突出显示版本。</p>
		<p>
正如您可能预想到的一样，构建教程的大量过程是手工编码并且很容易出错
（特别是当您在清晨 5:30
兴奋地完成编码以便赶在日出前放上网站时）。我们
希望能够尽量多地自动完成这些步骤，这样既可以节省时间又可以将错误
的几率降到最低。</p>
		<p>
				<a name="N10079">
						<span class="smalltitle">自食其力</span>
				</a>
		</p>
		<p>另一个设计目标是真正使用我们所倡导的技术。当然我们确实也意识到具有讽刺意义的一点是：
我们极力倡导开放的、基于标准的计算技术，但又不得不使用封闭源码的专有工具
（例如 Microsoft Word）来创建内容。（注：直到出版时，我们还未听到
有关 Microsoft Office Linux 版本的任何声明。）从 XML 文档和 XSLT
样式表 构建工具的另一个引人之处是可以使我们向世界展示 XML 和 XSLT
在今天可以做到的
有用工作。选择这些技术来操纵结构化数据对我们来说是毫不费力之事。</p>
		<p>
				<a name="N10082">
						<span class="smalltitle">了解通过 XSLT
样式表能实现的程度</span>
				</a>
		</p>
		<p>在实现最后一个目标时（即了解通过 XSLT 样式表究竟能实现多少功能），
Toot-O-Matic 运用了 XSLT 的所有高级功能，包括多个输入文件、
多个输出文件和扩展功能。通过样式表，它将单个 XML 文档转换成：</p>
		<ul>
				<li>Web 化的相互链接的 HTML 文档</li>
				<li>整个教程的菜单</li>
				<li>教程每个章节的目录</li>
				<li>包含所有章节标题和教程标题的 JPEG 图形</li>
				<li>letter 大小的 PDF 文件</li>
				<li>A4 大小的 PDF 文件</li>
				<li>包含用户在其机器上运行教程所需的所有文件的 ZIP 文件</li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">教程布局</span>
				</a>
		</p>
		<p>
XML 文档结构在过去的 18 个月中不断完善，在我们真正走近它之前，
先来看一下教程的布局。由于我们不需要从旧的使用 XML 标记的
教程着手，因此能够专注于想要的最终结果，
        <i>然后</i>设计自己 的 XML
文档结构，这样就便于将符合 XML 的文档转换为我们所需的输出格式。
      </p>
		<p>
				<a name="N100AF">
						<span class="smalltitle">菜单面板</span>
				</a>
		</p>
		<p>用户首先看到的部分就是菜单面板。菜单面板看上去如下：</p>
		<br />
		<a name="figure1">
				<b> 图 1.
教程菜单面板
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/menupanel.jpg" align="middle" />
		<br />
		<p>在本例中，字符串 "Building tutorials with the Toot-O-Matic"
以及所有章节标题 （"1. Installing and configuring Toot-O-Matic"
等等）都是由工具创建的 JPEG 图形。如果将
鼠标移动到给定章节上，那么其背景色会更改：</p>
		<br />
		<a name="figure2">
				<b>图 2.
鼠标经过菜单项时的效果
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/mouseover1.gif" align="middle" />
		<br />
		<p>在图 2
中，注意出现了一个作为工具提示的菜单项文本。这对于视力不佳的用户很有用，
并且与 W3C 定义并由 IBM 扩充的 Web Accessibility Guidelines
一致。</p>
		<p>还请注意到面板顶部和底部的导航控件。主页眉和页脚是根据 IBM
的公司网站标准定义的； 当您使用 Toot-O-Matic
创建自己的教程时可能要更改这个区域。导航栏中包含了 诸如 "Main
menu"、"Section menu"、"Feedback"、"Previous" 和 "Next"
这些项。尽管
在这个面板中禁用了某些项，但它们是出现在教程的所有面板中。</p>
		<p>
在导航控件上方是四个图标，允许用户下载教程的替代版本或将教程作为电子邮件发送给朋友：</p>
		<br />
		<a name="figure3">
				<b>图 3. 教程图标
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/icons.gif" align="middle" />
		<br />
		<p>
从左到右，这些图标依次允许用户：下载包含本地运行教程所需的所有文件的
ZIP 文件， 下载 letter 大小的 PDF 文件，下载 A4 大小的 PDF
文件，以及向朋友发送推荐这个教程
的电子邮件。所有这些图标在教程的每个面板上都会出现，它们的位置和相关链接
是由 Toot-O-Matic 生成的。</p>
		<p>
				<a name="N100F1">
						<span class="smalltitle">单个面板</span>
				</a>
		</p>
		<p>单个面板看上去如下：</p>
		<br />
		<a name="figure4">
				<b>图 4.
教程信息面板
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/panel1.jpg" align="middle" />
		<br />
		<p>教程中的大多数面板都使用这种设计。注意，在面板的顶部包含文本
page 1 of 6。导航栏 中还包含到主菜单和章节菜单的活动链接。</p>
		<p>
				<a name="N1010B">
						<span class="smalltitle">章节菜单</span>
				</a>
		</p>
		<p>单击 "Section menu" 链接会显示当前章节中所有标题的列表：</p>
		<br />
		<a name="figure5">
				<b>图 5.
教程章节索引面板
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/sectionmenu.jpg" align="middle" />
		<br />
		<p>可以单击任何面板标题直接转到该面板。通过样式表的神奇功能，
会自动出现每个面板的标题以及到每个面板的超链接。</p>
		<p>
				<a name="N10125">
						<span class="smalltitle">Feedback 面板</span>
				</a>
		</p>
		<p>Toot-O-Matic 会自动生成 feedback
面板。面板包含一段简要的文字，然后是一个反馈意见表。当用户 单击
"Submit feedback"
按钮时，用户的意见和建议会自动进入我们的反馈意见数据库。以下是 一个
feedback 面板示例：</p>
		<br />
		<a name="figure6">
				<b>图 6. Feedback
面板
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/feedbackpanel.jpg" align="middle" />
		<br />
		<p>一旦将某个给定面板标识为 feedback
面板后，就会在教程的每个面板的导航栏中显示到该面板的链接。</p>
		<p>
				<a name="N1013F">
						<span class="smalltitle">E-mail 面板</span>
				</a>
		</p>
		<p>相对较新的一个添加功能是 "e-mail a friend"
面板。这允许用户与朋友们一起分享喜爱的教程。单击 "e-mail it!" 图标
显示的面板类似下图：</p>
		<br />
		<a name="figure7">
				<b>图 7. E-mail
面板
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/emailpanel.gif" align="middle" />
		<br />
		<p>
				<a name="N10156">
						<span class="smalltitle">ZIP 文件</span>
				</a>
		</p>
		<p>教程的 ZIP 文件版本包含了查看教程所需的所有 HTML 文件，
以及所有支持图形和其它文件。当 Toot-O-Matic 构建这个文件时，
它会包含所有生成的 HTML 和 JPEG 文件，以及在教程 XML 源文件
中引用的任何资源。</p>
		<p>
				<a name="N1015F">
						<span class="smalltitle">PDF 文件</span>
				</a>
		</p>
		<p>教程的 PDF
版本支持高质量的打印输出，以供想要脱机阅读教程的用户使用。教程首
页包含了教程的标题和目录：</p>
		<br />
		<a name="figure8">
				<b>图 8. PDF
文件的首页
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/pdffile1.jpg" align="middle" />
		<br />
		<p>在目录中，章节标题和页号都是超链接；如果是在联机查看 PDF 文件，
则可以使用这些链接直接转到特定章节。如果是在阅读打印出来的 PDF
文件， 那么目录也仍然很有用。除目录中的链接之外，教程中的交叉引用和
对 Web 页面的任何引用也都是超链接。</p>
		<p>
教程主体中的页面中包含了每个面板的文本及其说明，它们之间用一条水平线分隔。</p>
		<br />
		<a name="figure9">
				<b>图 9.
教程主体中的某一页
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/pdffile2.jpg" align="middle" />
		<br />
		<p>PDF 文件中的所有格式和布局问题都是由 Toot-O-Matic 处理的。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">XML
文档设计</span>
				</a>
		</p>
		<p>好了，我已经全面介绍了 developerWorks 教程出现的所有不同形式，
下面讨论将会成为我们的教程的 XML 文档结构。首先，要介绍一下我们使用
的一些显而易见的结构化原则：</p>
		<ul>
				<li>一个 
          <code>&lt;tutorial&gt;</code> 应该包含一个 
          <code>&lt;title&gt;</code> 和一个或多个 
          <code>&lt;section&gt;</code> 。
        </li>
				<li>一个 
          <code>&lt;section&gt;</code> 应该包含一个 
          <code>&lt;title&gt;</code> 和一个或多个 
          <code>&lt;panel&gt;</code> 。
        </li>
				<li>一个 
          <code>&lt;panel&gt;</code> 应该包含一个 
          <code>&lt;title&gt;</code> 和一个 
          <code>&lt;body&gt;</code> ，
然后可能一个 
          <code>&lt;body&gt;</code> 
再包含面板中一列或两列内容的标记。
        </li>
		</ul>
		<p>这些决定是显而易见的，因为我们的教程一直是用这种方式构成的。</p>
		<p>
				<a name="N101CD">
						<span class="smalltitle">单独的面板</span>
				</a>
		</p>
		<p>第一个主要的设计决定就是确定应该如何标记一个单独的
&lt;panel&gt;。我们决定了以下结构：</p>
		<br />
		<a name="listing1">
				<b>清单 1.
教程文档结构</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;panel&gt;<br />  &lt;title&gt;Title of the panel&lt;/title&gt;<br />  &lt;body&gt;<br />    &lt;image-column&gt; -or- &lt;example-column&gt; (one or the other or neither)<br />    &lt;text-column&gt;<br />      Basic HTML markup (&lt;p&gt;, &lt;ol&gt;, &lt;li&gt;, &lt;b&gt;, &lt;i&gt;, &lt;u&gt;, &lt;a&gt;, etc.)<br />    &lt;/text-column&gt;<br />  &lt;/body&gt;<br />&lt;/panel&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这种结构允许教程作者使用他们熟悉的大多数标记，
同时又可将教程内容转换成各种格式。 
        <code>&lt;image-column&gt;</code> 
和 
        <code>&lt;example-column&gt;</code> 元素
定义了左边列的内容（如果存在的话）。Toot-O-Matic 文档
（Toot-O-Matic 软件包附带的教程）描述了该工具支持的所有元素和属性；
其中大多数都与你们知道并喜欢使用的 HTML 元素类似。
      </p>
		<p>
				<a name="N101EB">
						<span class="smalltitle">文件名</span>
				</a>
		</p>
		<p>
目标是要将单个 XML 文件转换为 Web 化的相互链接的 HTML
文档。要实现这一点，
需要一些标准方法来命名所有作为输出创建的文件。将文件名属性添加到 
        <code>&lt;tutorial&gt;</code> 元素
中就定义了文件名的基本部分。如果文件名属性是 "xyz"，那么第 1
章节中的 HTML 文件就被 命名为 
        <code>xyz-1-1.html、xyz-1-2.html</code> 等，而第 2
章节中的文件则被命名 为 
        <code>xyz-2-1.html、xyz-2-2.html</code> ，依此类推。对于链接，
如果现在位于第 2 个 
        <code>&lt;section&gt;</code> 的第 4 个 
        <code>&lt;panel&gt;</code> ， 那么要知道 
        <b>Previous</b>
链接应该指向文件 
        <code>xyz-2-3.html</code> 。如果当前面板
不是最后一个，那么 
        <b>Next</b> 链接应该指向文件 
        <code>xyz-2-5.html</code> 。第 2 章的 章节索引名为 
        <code>index2.html</code> ，因此 "Section"
菜单应该指向那个文件。当创建 主菜单面板时，如果在教程中有 7 个 
        <code>&lt;section&gt;</code> ， 则需要创建到 
        <code>xyz-1-1.html、xyz-2-1.html</code> 直到 
        <code>xyz-7-1.html</code> 的链接。
      </p>
		<p>对于由 ZIP 和 PDF 图标引用的文件名，我们再次使用 
        <code>filename</code> 属性。继续前一个 示例，ZIP 文件将命名为 
        <code>xyz.zip</code> ，两个 PDF 文件将命名 为 
        <code>xyz-ltr.pdf</code> 和 
        <code>xyz-a4.pdf</code> 。知道 
        <code>filename</code> 属性 的值允许我们在教程的每个 HTML
文件的主页眉中构建这些链接。使用一种一致的命名约定
使得在面板之间构建链接成为可能。
      </p>
		<p>
				<a name="N1023D">
						<span class="smalltitle">Feedback 面板</span>
				</a>
		</p>
		<p>feedback 面板是由第一个包含 &lt;feedback-form&gt; 元素的
&lt;panel&gt; 确定的。该元素类似于：</p>
		<br />
		<a name="listing2">
				<b>清单 2. 生成 feedback
面板的 XML 元素</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;feedback-form <br />  action-url="http://www9.software.ibm.com/dworks/ratings.nsf/   <br />    RateOnlineCourse?CreateDocument" <br />  zone="Web" <br />  redirect-url="http://www.ibm.com/developerworks/thankyou/feedback-java.html" /&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果要将 Toot-O-Matic 用于您自己的需求，可以将 
        <code>action-url</code> 和 
        <code>redirect-url</code> 属性
更改为匹配您站点的值。
      </p>
		<p>
				<a name="N1025B">
						<span class="smalltitle">E-mail 面板</span>
				</a>
		</p>
		<p>
最近推出的 e-mail 面板需要两个新字段，它们作为属性 添加在 
        <code>&lt;tutorial&gt;</code> 元素中。以下是 XML 源示例：
      </p>
		<br />
		<a name="listing3">
				<b>清单 3. 用于创建 e-mail
面板的属性</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;tutorial filename="tootomatic" <br />. . .<br />  email-link="http://xyz.ibm.com/dW-tutorials/education/tootomatic"<br />  abstract="developerWorks is proud to present the Toot-O-Matic, <br />  an XML-based tool that uses XSLT style sheets and Java code to convert<br />  an XML source file into a variety of text and binary outputs. <br />  This tutorial is the documentation for the tool, covering installation,<br />  a tag guide, troubleshooting, and writing tips."&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在这个清单中， 
        <code>email-link</code> 和 
        <code>abstract</code> 
属性是由 e-mail 面板 使用的。要构建 e-mail 面板，我们使用标准的
JavaScript 文件 
        <code>emailfriend.js</code> 来
管理面板。以下是我们生成的使得 e-mail 面板起作用的 HTML 示例：
      </p>
		<br />
		<a name="listing4">
				<b>清单 4. 生成的用于调用
e-mail 面板的 HTML 标记</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;a href="javascript:void newWindow()" border="0"&gt;<br />  &lt;img alt="E-mail this tutorial to a friend" border="0" <br />   src="../i/icon-email.gif"&gt;<br />&lt;/a&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>（我整理了这个清单，这样您可以看得更清楚。由 Toot-O-Matic 生成的
实际的 HTML 文件中包含的空白字符更少。）</p>
		<p>目录结构的简要概括是：Toot-O-Matic
在给定的子目录中生成它的所有文件， 这个目录可以在命令行或 
        <code>&lt;tutorial&gt;</code> 元素中指定。所有
公共资源（ 
        <code>emailfriend.js</code> 、标准的鼠标经过图形等）都
存储在 
        <code>../i</code> 目录中。如果在单个机器上存储了多个
Toot-O-Matic 生成 的教程，那么公共文件将仅存储一次。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">XSLT
源代码</span>
				</a>
		</p>
		<p>好了，我已经论述了在定义 XML 文档结构时所解决的设计问题，现在我们将
讨论如何使用 XSLT 样式表将 XML 文档转换成需要的结果。首先，使用
XSLT mode 属性 以多种方式处理相同结构的信息：</p>
		<br />
		<a name="listing5">
				<b>清单 5. 使用 XSLT mode 属性</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:template match="/"&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="build-main-index"/&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="build-section-indexes"/&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="build-individual-panels"/&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="generate-graphics"/&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="generate-pdf-file"&gt;<br />      &lt;xsl:with-param name="page-size" select="'letter'"/&gt;<br />    &lt;/xsl:apply-templates&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="generate-pdf-file"&gt;<br />      &lt;xsl:with-param name="page-size" select="'a4'"/&gt;<br />    &lt;/xsl:apply-templates&gt;<br />    &lt;xsl:apply-templates select="tutorial" mode="build-zip-file"/&gt;<br />  &lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
这个示例显示了如何使用多种不同方式来处理相同的基本数据。我们使用方式 
        <code>build-main-index</code> 来 构建教程的主索引页面，使用 
        <code>build-individual-panels</code> 方式来构建单独的面板，等等。
注意： 
        <code>generate-pdf-file 方式</code> 使用 
        <code>page-size</code> 参数来正确设置 页面大小（同时生成 letter 和
A4 两种大小的 PDF 文件）。
      </p>
		<p>
				<a name="N102C3">
						<span class="smalltitle">生成主菜单面板</span>
				</a>
		</p>
		<p>主菜单由标准的页眉和页脚组成，
在页眉和页脚之间是教程的所有章节列表。单击任何章节标题
可以转至该章节的第一个面板。要增强面板的视觉外观，
可以使用生成的图形和鼠标经过效果来显示面板标题。</p>
		<p>生成章节列表的样式表是简单明了的。页眉和页脚是从样板文本中生成的；章节列表是使用 
        <code>&lt;xsl:for-each&gt;</code> 元素生成的：
      </p>
		<br />
		<a name="listing6">
				<b>清单 6.
生成菜单面板链接的 XPath 语句</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:for-each select="section"&gt;<br />  &lt;a&gt;<br />    &lt;xsl:attribute name="href"&gt;<br />      &lt;xsl:value-of select="concat($fn, '-', position(), '-1.html')"/&gt;<br />    &lt;/xsl:attribute&gt;<br />    ...<br />    &lt;img width="335" height="26" border="0"&gt;<br />      ...<br />      &lt;xsl:attribute name="src"&gt;<br />        &lt;xsl:value-of <br />          select="concat('imagemaster/menu-', position(), '.jpg')"/&gt;<br />      &lt;/xsl:attribute&gt;<br />    &lt;/img&gt;<br />  &lt;/a&gt;<br />  &lt;br/&gt;<br />&lt;/xsl:for-each&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>（为使示例更加简洁，我除去了某些 XPath 表达式，那些表达式生成各种锚点属性和图像标记。）例如，对于第一章 
        <code><span class="boldcode">(position()=1)</span></code> ， 样式表生成以下 HTML：
      </p>
		<br />
		<a name="listing7">
				<b>清单 7.
菜单面板链接样本</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;a href="xyz-1-1.html" onMouseOut="iOut('menu1');" <br />   onMouseOver="iOver('menu1'); self.status=menu1blurb; return true;"&gt;<br />  &lt;img border="0" height="26" name="menu1" <br />       src="imagemaster/menu1.jpg" width="335"/&gt;<br />&lt;/a&gt;<br />&lt;br/&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在以上清单中，所有黑体的 1 都是由 XPath 
        <code>position()</code> 函数生成的。
      </p>
		<p>
				<a name="N102F8">
						<span class="smalltitle">生成单独的 HTML 面板</span>
				</a>
		</p>
		<p>下一个任务是生成组成教程的单独的 HTML
面板。教程的页眉和页脚是由样板生成的，
并且面板主体中的大多数标记实际上等同于它们的 HTML
对应标记。生成单独面板 的最有趣的事是：我们使用 XSLT
扩展来将转换的输出重定向到不同文件。</p>
		<p>使用与 Apache XML 项目 的 Xalan 样式表引擎一起交付的文本重定向扩展来实现这个功能。在使用扩展之前，要先在样式表的根元素 
        <code>&lt;xsl:stylesheet&gt;</code> 元素中声明：
      </p>
		<br />
		<a name="listing8">
				<b>清单 8.
样式表扩展定义</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <br />  version="1.0"<br />  xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"<br />  extension-element-prefixes="redirect"&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中， 
        <code>org.apache.xalan.xslt.extensions.Redirect</code> 
是 实现了该扩展的 Java 类名， 
        <code>redirect</code> 
是用来调用扩展的名称空间
前缀。声明了这个扩展之后，就可以使用它将转换输出管道输出到不同文件。 
        <code>
Redirect</code> 扩展 的一个重要特性就是使用 XPath
表达式来生成文件名：
      </p>
		<br />
		<a name="listing9">
				<b>清单 9.
样式表扩展调用</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;redirect:write select="concat($fn, '-', <br />                               $sectionNumber, '-', <br />                               position(), '.html')"&gt;<br />  &lt;!-- other processing goes here --&gt;<br />&lt;/redirect:write&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>假设前缀是 
        <code>xyz</code> ，以上的 XPath 
        <code>concat</code> 
函数调用 将为 
        <code>&lt;tutorial&gt;</code> 的第 5 个 
        <code>&lt;section&gt;</code> 的 第 4 个 
        <code>&lt;panel&gt;</code> 
创建名称 
        <code>xyz-5-4.html</code> 。
（为简化处理过程， 
        <code>&lt;tutorial&gt;</code> 标记的文件名属性
存储在变量 
        <code>fn</code> 中，当前 
        <code>&lt;section&gt;</code> 的 
        <code>position()</code> 存储 在变量 
        <code>sectionNumber</code> 
中。）链接点和引用的生成是贯穿在 XML 源文档
的整个处理过程之中的。这就确保了在源文档更改时保持引用的正确性和一致性。
      </p>
		<p>
				<a name="N1035A">
						<span class="smalltitle">生成章节索引</span>
				</a>
		</p>
		<p>
要生成章节索引，需要创建一个 HTML 文件，其中包含给定 
        <code>&lt;section&gt;</code> 的 所有 
        <code>&lt;panel&gt;</code> 
的排序列表。使用一个简单的 
        <code>&lt;xsl:for-each&gt;</code> 语句
检索出所有面板标题；由于所有文件名都是动态生成的，也可以创建到所有面板
的超链接。以下是用于该任务的 XSLT 模板的简要摘录：
      </p>
		<br />
		<a name="listing10">
				<b>清单 10.
生成章节索引</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;ol&gt;<br />  &lt;xsl:for-each select="panel"&gt;<br />    &lt;li&gt;<br />      &lt;a&gt;<br />        &lt;xsl:attribute name="href"&gt;<br />          &lt;xsl:value-of <br />        select="concat($fn, '-', $sectionNumber, '-', position(), '.html')"/&gt;<br />        &lt;/xsl:attribute&gt;<br />        &lt;xsl:value-of select="title"/&gt;<br />      &lt;/a&gt;<br />    &lt;/li&gt;<br />  &lt;/xsl:for-each&gt;<br />&lt;/ol&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在上例中，用于生成文件名的 
        <code>concat</code> 函数调用是用来
生成 
        <code>&lt;a&gt;</code> 标记上的 
        <code>href</code> 属性值。 在 
        <code>&lt;a&gt;</code> 标记本身中，我们使用 
        <code>&lt;xsl:value-of&gt;</code> 元素 检索当前面板的 
        <code>&lt;title&gt;</code> 。
      </p>
		<p>
				<a name="N10394">
						<span class="smalltitle">生成 PDF 文件</span>
				</a>
		</p>
		<p>将 XML 文档转换为 XSL Formatting Objects (XSL-FO)
流也是相当简单明了的。打印出来的
布局由教程中的图形和文本组成，再加上页号、页眉、页脚一起创建高质量的打印输出。</p>
		<p>尽管在创作本文时（2001 年 5 月）XSL-FO 规范还未完成，
但我们可以使用 Apache XML Project 的 FOP (Formatting Objects to
PDF) 工具
当前支持的格式化对象。以下是几个段落被转换为格式化对象后的示例：</p>
		<br />
		<a name="listing11">
				<b>清单 11.
格式化对象样本</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;fo:block font-size="8pt" line-height="10pt" <br />  text-align-last="end" space-after.optimum="8pt"&gt;<br />  page 1 of 14<br />&lt;/fo:block&gt;<br />&lt;fo:block font-size="16pt" line-height="19pt" font-weight="bold" space-after.optimum="12pt"&gt;<br />  Introduction to JavaServer Pages<br />&lt;/fo:block&gt;<br />&lt;fo:block space-after.optimum="6pt"&gt;<br />  In today's environment, most Web sites want to display dynamic <br />  content based on the user and the session. Most content, such <br />  as images, text, and banner ads, is most easily built with <br />  HTML editors. So we need to mix the "static" content of HTML <br />  files with "directives" for accessing or generating dynamic <br />  content. <br /><br />&lt;/fo:block&gt;<br />&lt;fo:block space-after.optimum="6pt"&gt;<br />  JavaServer Pages meet this need. They provide server-side <br />  scripting support for generating Web pages with combined <br />  static and dynamic content. <br />&lt;/fo:block&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N103AA">
						<span class="smalltitle">生成 JPEG 文件</span>
				</a>
		</p>
		<p>
对于任何教程来说，都需要生成一些图形来突出显示教程的某些部分。首先，
为标题页的主页眉创建一个图像。主页眉的文本来自 
        <code>/tutorial/title</code> 元素。例如，标记
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<span class="boldcode">&lt;tutorial&gt;<br />  &lt;title&gt;Building tutorials with the Toot-O-Matic&lt;/title&gt;<br /></span>
														<br />
														<br />
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>生成的 
        <code>masthead.jpg</code> 文件类似于：
      </p>
		<br />
		<a name="figure10">
				<b>图 10.
生成的页眉图形
</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/masthead.jpg" align="middle" />
		<br />
		<p>为了创建这个文本，我们使用一个 Java 扩展将 
        <code>&lt;title&gt;</code> 元素的 文本转换成一个 JPEG 文件：
      </p>
		<br />
		<a name="listing12">
				<b>清单 12. 调用 JPEG
创建扩展</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:for-each select="/book/chapter"&gt;<br />  &lt;xsl:choose&gt;<br />    &lt;xsl:when test="function-available('jpeg:createJPEG')"&gt; <br />      &lt;xsl:value-of <br />       select="jpeg:createJPEG(title, 'bg.jpg', <br />       concat('title', position(), '.jpg'), <br />       'Swiss 721 Bold Condensed', 'BOLD', 22, 52, 35)"/&gt;<br />      &lt;img&gt;<br />        &lt;xsl:attribute name="src"&gt;<br />          &lt;xsl:value-of select="concat('title', position(), '.jpg')"/&gt;<br />        &lt;/xsl:attribute&gt;<br />      &lt;/img&gt;<br />      &lt;br /&gt;<br />    &lt;/xsl:when&gt;<br />    &lt;xsl:otherwise&gt;<br />      &lt;h1&gt;&lt;xsl:value-of select="title"/&gt;&lt;/h1&gt;<br />    &lt;/xsl:otherwise&gt;<br />  &lt;/xsl:choose&gt;<br />&lt;/xsl:for-each&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N103E4">
						<span class="smalltitle">生成 ZIP 文件</span>
				</a>
		</p>
		<p>最后的任务是要生成 ZIP 文件本身，这也是通过一个扩展来处理的。这
是在文件命名约定可以简化事情的另一个领域。将 XML
源文件的根元素传递给扩展函数：</p>
		<br />
		<a name="listing13">
				<b>清单 13. 生成 ZIP
文件</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:template match="tutorial" mode="build-zip-file"&gt;<br />  &lt;xsl:choose&gt;<br />    &lt;xsl:when test="function-available('zip:buildZip')"&gt; <br />      &lt;xsl:value-of select="zip:buildZip(.)"/&gt;<br />    &lt;/xsl:when&gt;<br />    &lt;xsl:otherwise&gt;<br />      &lt;xsl:message terminate="yes"&gt;<br />        Sorry, we can't build the zip file.<br />      &lt;/xsl:message&gt;<br />    &lt;/xsl:otherwise&gt;<br />  &lt;/xsl:choose&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>注意：在调用 
        <code>buildZip</code> 
函数时，仅需要传递根元素。 
        <code>buildZip</code> 函数
采用我们提供的节点（文档节点）， 尝试创建一个 ZIP
文件并用所有必需文件进行填充。这些文件中的某些文件 是由每个
Toot-O-Matic 教程使用的标准资源列表中的一部分，
而其它文件则是由教程引用的资源（JPEG、GIF 和其它类似文件）。添加的
HTML 文件 是由 XML 源文件的结构确定的。如果教程有 4 个或更多章节，
第 4 个章节包含 8 个面板，并且文件名前缀是 
        <code>tom</code> ， 那么 
        <code>buildZip</code> 函数需要将文件 
        <code>tom-4-1.html、tom-4-2.html</code> 等 添加到 ZIP 档案中。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>Toot-O-Matic 工具的这一讨论介绍了可从单个 XML 文件生成
的全范围输出。原始的 XML 文档结构允许我们将普通的文本信息
转换为各种不同格式，而将所有这些组合在一起就可以用各种有趣和有用的方式
来提供教程内容。使用这个工具，可以缩短并简化开发过程，使得制作教程的
过程更方便、更快速和更经济。最重要的是，我们在此讨论的一切都是基于
开放标准并且在任何支持 Java 的平台上使用。Toot-O-Matic 工具
展示了一个简单而又并不昂贵的开发项目是如何交付有意义的结果的。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-toot/index.html">英文原文</a>.
        <br /><br /></li>
				<li>免费下载以下文件到你的硬盘，设置运行 Toot-O-Matic 工具：

          <ul><li><a href="ftp://www6.software.ibm.com/software/developer/library/tootdownloads/tootomatic.zip">Toot-O-Matic zip</a>包括：XML 文件集，XSL， Java 文件，以及样例文件。还带有一个自述文件。
            </li><li><a href="ftp://www6.software.ibm.com/software/developer/library/tootdownloads/jars.zip">jars.zip</a>包含.jar 文件。你需要 Java 2 SDK, 1.3.0_02 运行环境。
            </li><li><a href="ftp://www6.software.ibm.com/software/developer/library/tootdownloads/tootomatic-a4.pdf">tootomatic-a4.pdf</a>与
              <a href="ftp://www6.software.ibm.com/software/developer/library/tootdownloads/tootomatic-ltr.pdf">tootomatic-ltr.pdf</a>提供 Toot-O-Matic 文档。
            </li></ul><br /></li>
				<li>根据
          <a href="http://www.ibm.com/developerworks/education.nsf/xml-onlinecourse-bytitle/01F99F6B8BE60C9486256A69005BD21C?OpenDocument">
使用 Toot-O-matic 构建教程</a>来学习 如何使用 Toot-O-Matic
创建自己的教程。
        <br /><br /></li>
				<li>阅读 developerWorks 上由 Doug Tidwell
提供的其它文章，可能会对您 使用 Toot-O-Matic 有所帮助：

          <a href="http://www.ibm.com/developerworks/library/java-xml-toolkit/index.html">
Java 开发者： 填充您的 XML 工具箱</a>：Toot-O-Matic
软件包提供了构建教程所需的所有文件。如果您想要 着手 Toot-O-Matic
使用的各种技术，这篇文章将帮助您安装所需工具。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/education.nsf/xml-onlinecourse-bytitle/40B28792D6FC7F908525683B0052F7F2?OpenDocument&amp;dwzone=xml">
将 XML 转换为 HTML，将 XML 转换为 SVG，将 XML 转换为 PDF</a>：
这个三步曲获取了一些 XML
文档，并将它们转换为各种不同格式。如果您是刚开始学习
XSLT，那么这些文章将对您很有帮助。
        <br /><br /></li>
				<li>
						<a href="http://www-128.ibm.com/developerWorks/cn/xml/x-xslt/index.shtml">XSLT
是何种语言？</a>由 Michael Kay 撰写， 他是开放源码 Saxon XSLT
处理器的创立者，提供了对于 XSLT 作为一种语言的极佳概述，
介绍了它的设计目标并包含一些样式表示例。
        <br /><br /></li>
				<li>有关 Xalan 和 Xerces，在 Toot-O-Matic 中使用的开放源码 XSLT
处理器和 XML 语法分析器 的详细信息，请直接转到 
          <a href="http://xml.apache.org/">Apache XML Project 主页</a>。
        <br /><br /></li>
				<li>参加
          <a href="http://websurveyor.net/wsb.dll/4551/XMLSurvey.htm&amp;origin=x">
关于您的 XML 开发活动的 17 个问题的调查问卷</a>， 并为 IBM 实验室的
XML 研究方向做贡献。
        <br /><br /></li>
				<li>如果想要了解 IBM 的 WebSphere Application Server (WAS)
是如何支持 XML 开发的， 请参阅 
          <a href="http://www-4.ibm.com/software/webservers/appserv/doc/v35/ae/infocenter/was/040203.html">
WAS 高级版 3.5 联机帮助中有关 XML 的技术背景信息</a>。
        <br /></li>
		</ul>
		<b>感谢</b>
		<p>developerWorks 教程小组的成员包括 Tom Coppedge、Jeanette
Fuccella、Leah Ketring、Jeanne Murray、Christine Stackel、Doug
Tidwell、Jackie Wheeler 和 Janet Willis。Toot-O-Matic 是从
他们的创意中形成的，并且还汲取了 Lou Shannon、Gretchen Moore
以及其他 Toot-O-Matic 用户 的出色建议。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-toot/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="author" src="http://www-128.ibm.com/developerworks/cn/xml/x-toot/p-mcdugt.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>MC Dug-T 是 developerWorks 的
科学部长，致力于向公众推广 XML、Java 和 Web 服务
411。在他的旅途中，
他从自己曾体验过的视角获得了极酷的、全新的样式表的灵感。所有这些让人着迷的知识很快
会在他撰写的 XSLT 一书中（ISBN 0596000537，现在就可以在 amazon.com
上预订） 由 O'Reilly and Associates
出版，这本书很快会在本地书店大卖。 在最近的 dW
面谈中论及这本书时，他夸口“我几乎将我的所有思想都凝聚在这一大本书里了”。



        </p>
										<p>
在放松时，他喜欢将双手向上举起，
照他的话说是“摆摆手，我一点也不在乎”。在闲暇之余，
他会和任烹饪老师的妻子 CT-ONE，以及他们 6 岁的宝贝女儿 Lily 呆 在
Raleigh 一起享受天伦之乐。可以通过 
          <a href="mailto:dtidwell@us.ibm.com">dtidwell@us.ibm.com</a>
与他联系。
        </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:35 <a href="http://www.blogjava.net/Vencent/articles/36726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL基础教程（三）</title><link>http://www.blogjava.net/Vencent/articles/36727.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36727.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36727.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36727.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.html#author">青苹果工作室编译，转自 ccidnet 网站</a>
				<br />
				<br />
				<b>
						<font color="red">Error:  Please enter a value for the author element's jobtitle attribute, or the company-name element, or both.</font>
				</b>
				<br />
				<br />
				<br />
		</p>
		<p>2001 年  3 月  01 日</p>
		<blockquote>XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切：</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="1">
						<span class="atitle">XSL索引：将XML文档转换成HTML之前，如何用XML解析器来对XML文档进行索引。</span>
				</a>
		</p>
		<b>XSL索引</b>
		<br />
XSL可以用来对一个XML文档进行索引。


      
      <p><b>将索引信息放在哪里</b><br />
现在重新看看在以前许多章节中都曾看到过的 XML文档：
      
      </p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="600"><tbody><tr><td><pre><code class="section"><br />&lt;?xml version="1.0"?&gt;<br />&lt;CATALOG&gt;<br />&lt;CD&gt;<br />&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />&lt;/CD&gt;<br />.<br />.<br />.<br /></code></pre></td></tr></tbody></table><br /> 

要想将这个XML文件作为一个普通的HTML文件输出，并且同时对它进行索引，只需要在XSL文件中增加一个order-by
属性，如下：
      
      <br />
&lt;xsl:for-each select="CATALOG/CD" order-by="+ ARTIST"&gt;


      
      <p>
order-by属性使用加号(+)或减号(-)来定义是使用升序还是降序，再用一个元素名称来定义排序的元素。</p><p>现在来看看经过轻微调整的XSL样式表（或在IE5中打开它）：</p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />&lt;?xml version='1.0'?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />&lt;xsl:template match="/"&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;table border="2" bgcolor="yellow"&gt;<br />&lt;tr&gt;<br />&lt;th&gt;Title&lt;/th&gt;<br />&lt;th&gt;Artist&lt;/th&gt;<br />&lt;/tr&gt;<br />&lt;xsl:for-each select="CATALOG/CD"<br />order-by="+ ARTIST"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/xsl:for-each&gt;<br />&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />&lt;/xsl:template&gt;<br />&lt;/xsl:stylesheet&gt;<br /></code></pre></td></tr></tbody></table><br /><p><b>在浏览器中转换</b><br />
以下是在浏览器中将XML文件转换成HTML所需要的简单代码：
      
      </p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;script language="javascript"&gt;<br />// Load XML<br />var xml = new ActiveXObject("Microsoft.XMLDOM")<br />xml.async = false<br />xml.load("cd_catalog.xml")<br />// Load the XSL<br />var xsl = new ActiveXObject("Microsoft.XMLDOM")<br />xsl.async = false<br />xsl.load("cd_catalog_sort.xsl")<br />// Transform<br />document.write(xml.transformNode(xsl))<br />&lt;/script&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></code></pre></td></tr></tbody></table><br /> 

如果使用的是Internet Explorer 5.0 或更高版本，请点击这里
      
      <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/sort.htm" target="_blank">查看结果</a>。


      
      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="2"><span class="atitle">XSL过滤器：将XML文档转换成HTML之前，如何用XML解析器过滤XML文档。</span></a></p><b>XSL过滤器查询</b><br />
XSL可以用来过滤一个 XML 文件。


      
      <p><b>在哪里放置过滤器信息</b><br />
现在重新看看你以前已经看过多次的XML文档：
      
      </p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />&lt;?xml version="1.0"?&gt;<br />&lt;CATALOG&gt;<br />&lt;CD&gt;<br />&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />&lt;/CD&gt;<br />.<br />.<br />.<br /></code></pre></td></tr></tbody></table><br /><p>
要过滤XML文件，只需要为XSL文件中的for-each元素的选择属性增加一个过滤器，如下：
        
        <br />
&lt;xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']"&gt;
      
      </p><p>合法的过滤器操作符是：</p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />= 等于<br />!= 不等于<br />&lt; 小于<br />&gt; 大于<br /></code></pre></td></tr></tbody></table><br /><p>现在看看经过轻微调整的XSL样式表：</p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />&lt;?xml version='1.0'?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />&lt;xsl:template match="/"&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;table border="2" bgcolor="yellow"&gt;<br />&lt;tr&gt;<br />&lt;th&gt;Title&lt;/th&gt;<br />&lt;th&gt;Artist&lt;/th&gt;<br />&lt;/tr&gt;<br />&lt;xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/xsl:for-each&gt;<br />&lt;/ta<br /></code></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="author"><span class="atitle">关于作者</span></a></p><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td colspan="3"><img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" /></td></tr><tr align="left" valign="top"><td><br /></td><td><img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" /></td><td width="100%"><p>青苹果工作室编译，转自 ccidnet 网站 has authored this article</p></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/36727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:35 <a href="http://www.blogjava.net/Vencent/articles/36727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML #2: XML和语义::该领域中的新生事物以及旧的邻近范畴的另一事物</title><link>http://www.blogjava.net/Vencent/articles/36723.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36723.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36723.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36723.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#author">Uche Ogbuji</a>, CEO 兼首席顾问, Fourthought, Inc.<br /></p>
		<p>2001 年  5 月  01 日</p>
		<blockquote>在本专栏中，Uche Ogbuji 完成了他对 XML和语义的介绍，并为随后的更多实践性专栏做准备。
      <i>XML编程思想</i>讨论了 XML知识管理方面的方面，包括元数据、语义、“资源描述结构(RDF)”、“主题映射”和自主主体。本专栏从实践的角度探讨了主题，因此针对的是程序员而非理论家。
    </blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/index.shtml">第一篇
          <i>XML
编程思想</i>专栏文章
        </a>中，我介绍了语义透明性的思想及其对 XML
相关开发的重要性。因为语义透明性非常重要，最近在这一领域中有一系列活动
-- 我无法在一个部分中涉及到它们全部。在这一部分中，我将介绍
XML和语义中的一些新出现的参与者。但首先，我要介绍在第一部分中忽略的保守派所玩的有趣的游戏。
      </p>
		<p>
				<a name="1">
						<span class="atitle">EDI 标准的 XML 标记</span>
				</a>
		</p>
		<p>“实现指南标记 (IgML)”工作组是电子数据交换 (EDI) 供应商小组对以
XML 格式表示 EDI 实现的指导方针和标准的一个成果。他们为这种实现开发
DTD（文档类型描述），目的是为使互操作性达到最大化而以向标准化文本提供高度结构并将实现路径指向
EDI。</p>
		<p>可以从 IgML 网站（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#resources">参考资料</a>）下载当前的 DTD 当前草案，以及 ANSI
X12 和 UN/EDIFACT（EDI 的两个主要“方言”）各种子集的样本。虽然
IgML 本身不提供语义透明性的框架，但对于那些使用 EDI，或者只是利用
EDI 标准提供的语义基础结构的实现 XML
商家到商家系统，它提供了一种有用的工具。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">UN + OASIS =
ebXML</span>
				</a>
		</p>
		<p>SGML 和 XML 中的一个倡导者曾是“结构化信息标准促进组织
(OASIS)”。您可能认识作为 Robin Cover 的卓越 XML
新闻和注释纲要主办人的这个组织，最近，它又成为对 XML
技术公开研究的各种技术委员会的主办人。1999 年，OASIS
与联合国贸易促进和电子商务中心 (UN/CEFACT) -- EDI
开发中的一个重要组织 -- 进行合作，产生了电子商务 XML (ebXML)
倡议。</p>
		<p>ebXML 的目的是开发利用 XML
来推动各种组织之间贸易的基础结构和实践，而不论这些组织的规模如何、选择的是何种工具，或者地理位置如何。这一努力是根据主动的时间表实施的，可能考虑到了
EDI
开发所用的时间。去年年底开始形成了它的第一个产物，包括整个体系结构文档。</p>
		<p>ebXML 与 XML
交换的语义透明性最为相关的那部分是“注册表服务”，这在“注册表信息模型和注册表服务”规范草案中进行了描述，它用于处理面向对象实体的管理和交换。这些注册表针对的层次级别比我在第一专栏中介绍的“国际标准化组织基本语义注册表
(ISO BSR) 级别更高。它们为使用“统一建模语言
(UML)”的商业信息提供了对象模型，并添加了与“对象管理小组 (OMG
的）”元对象规范并无分别的元数据和设计特性。</p>
		<p>它们还为由元数据执行的对象查询定义了 XML
词汇表，最有意义的是，为符合对象模型的实例定义了 XML
表示。遵循这些表示的文档可以作为伙伴之间的交易事务进行交换。最近采纳了“简单对象访问协议
(SOAP)”，作为这样的事务的传送协议。</p>
		<p>ebXML 技术体系结构规定了 ebXML
系统开发的三个阶段：
        <i>实现阶段</i>、
        <i>发现和检索阶段</i>，以及
        <i>运行时阶段</i>。在发现和检索阶段中，规范规定：“这个阶段是某些交易伙伴发现由其它交易伙伴请求的商业信息含义的阶段。”规范的意图是，这个“含义”由在
ebXML 注册表中设置的元数据模型提供。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">有关抱怨的说明</span>
				</a>
		</p>
		<p>对 ebXML
为阐明商业事务而明确规定含义的成果的一个抱怨是它重蹈覆辙的现象非常严重；这是出于策略原因还是技术原因尚不清楚。在早期专门为
ebXML
开发消息传递传送协议意图背后玩弄政治花招失败了许多次以后，ebXML.org
最近决定将 SOAP 纳入 ebXML。不过，ebXML
似乎仍然忽视了许多已经可以使用 RDF、XMI 和其它基于 XML
元数据规范的设施。而且也没有什么证据表明 ebXML 利用了 ISO BSR
的工作。</p>
		<p>
另一个抱怨是注册表方法非常不幸地演变成第二代倡议中一个公共的、不正确的趋势：将面向对象系统中的概念成批地导入到常规
XML 中。 这种趋向可能会严重损害到 XML
的扩展和表现，特别是在半结构化数据很重要的情况下。
这种失常最危险的表现可能是 W3C XML Schema
规范的数据分类和继承特性。例如 ebXML 和 W3C Schema
这样的倡议尽量集中在核心 XML 需要上，而将面向对象体系结构留给 OMG
和类似的团体。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">eCo 战士：挽救真正的庞然大物</span>
				</a>
		</p>
		<p>CommerceNet
组织正在致力于协调产业、政府和学院等各方面所做的努力，以推动为通过例如
eCo
Framework（一个开发用于语义交换的开放注册表项目）这样的活动而进行的电子交易所涉及的实践和技术。它所追求的目标是希望这样的注册表在电子交易中允许更高程度的自动化，最终导致获取过程完全由自主主体驱动。</p>
		<p>eCo 注册表提供对规范数据模型、以及由各种 XML
商业事务规范提供的元素类型和属性定义的访问。eCo
工作组以被一些主要组织利用，开发诸如 Open Buying on the Internet
(OBI)、RosettaNet 和 XML/EDI 这样的 XML
格式规范而感到自豪。上述成果中的一些已经与 ebXML
建立了关系，并且有可能在 eCo 和 ebXML
工作之间发展出牢固的关系。</p>
		<p>不幸的是，到目前为止，跃跃欲试的开发者可以使用的唯一资源是 eCo
站点上提供的少数几个有些单薄的演示。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">使用 RosettaNet
解释供应链残余</span>
				</a>
		</p>
		<p>XML 可能正是 TLA（这是三字母首字母缩略词 (three-letter
acronyms)）和商业联合会最重要的发生器。作为联合会之一的 RosettaNet
打算定义标准化供应链管理过程。</p>
		<p>RosettaNet
计划交付一个“主要字典”，其中定义了在供应链交互中使用的术语，以及为这样的交互而形成的框架所包括的商业过程和交换协议。很自然的，从知识管理角度来说，字典是最吸引我的方面。但字典和协议的组合是
RosettaNet 称之为 
        <i>Partner Interface Process</i>(PIP)
的基础。每个 PIP 都是在商业伙伴之间使用 XML
消息调整特殊过程所用的一种规范。一个完整的支持 RosettaNet
的供应链可以由几十个甚至几百个 PIP 组成。
      </p>
		<p>RosettaNet 可能是最忠于 XML
语义注册表生成和交换倡议的，并且已经创造出象 BEA WebLogic
Collaborate 这样包括了实现的产品。2001 年 2 月，在 RosettaNet 的
EConcert 准备发布那一天，一些发言人聚在一起，生成 PIP
在各自行业中的使用相当成功。</p>
		<p>它的成熟等于为开发者带来了福音。RosettaNet
站点已提供了三个字典：RosettaNet 商业字典、RosettaNet IT 技术字典和
RosettaNet EC 技术字典。它们以 HTML 表和 XML+DTD
的形式提供了几百个术语的定义、数据类型和表示限制（例如
"DigitalCertificateSignature"）。这是一个不可多得的宝贵资料库，对于其完善更有价值，甚至远远超过上一专栏中提到的基于实验的
ISO BSR 列表。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">知识的汇编语言</span>
				</a>
		</p>
		<p>我们用 RDF 来结束这个月对语义的讨论；RDF
可能是语义引用和其它一些与管理 XML
文档中潜在知识相关的任务中最重要的工具。随着本专栏的进一步展开，您会了解到有关
RDF 的许多内容，因此我只在此提及 RDF 在有效管理与 XML
相关的元数据方面的能力，这使它成为为术语之间的关系以及术语之下抽象概念之间的关系建模的重要工具。实际上，RDF
曾因为其在为关系、定义和特性建模中所具有的灵活性而被称为“知识的汇编语言”。</p>
		<p>
我曾参与过几个语义透明性非常重要的项目的工作，包括一个客户机在其中使用
RDF 来实现同义词框架和基本转换以适应格式不限的顾客查询。 使用 RDF
能够如此轻松地建立这样的系统，并产生良好的性能总是给我留下非常深刻的印象。</p>
		<p>因此，看到有那么多 XML 进程倡议重蹈 RDF
的覆辙让我非常失望。但象我已在有关“Web 服务描述语言 (WSDL)”的
developerWorks 文章中所提到过的，有太多的 XML 应用程序都没有注意到
RDF 的长处。希望随着 RDF 工具 -- 以及象 RDF Site Summary (RSS)
这样的成功经历 -- 的稳步增加，这种状况将有所转变。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="7">
						<span class="atitle">今后的实践</span>
				</a>
		</p>
		<p>我已经概述了语义框架作为 XML
上面一层的重要性，今后的专栏将转移到检验管理由这些高级框架所表示的知识的实用方法。下一篇文章将讨论使用
RDF 为 XML 数据资源库开发价钱便宜的搜索和引用系统。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-think1.html">英文原文</a>.
        <br /><br /></li>
				<li>考虑过这一专栏吗？有关这一部分，请转至
          <a href="http://www.ibm.com/developerworks/xml_df.nsf/AllViewTemplate?OpenForm&amp;RestrictToCategory=1">
论坛</a>。（也可以单击页面顶部的 Discuss 图标。）
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/xml/library/x-think1.html">
								<i>XML
和语义：实际情况</i>
						</a>是本专栏的第一部分，它定义了语义透明性和元数据，并介绍了一些参与者。
        <br /><br /></li>
				<li>
						<a href="http://www.foresightcorp.com/igmldev/">IgML</a>
是“为再现 EDI 实现指导方针和标准而开发新的基于 XML
的标记语言”的成果。
        <br /><br /></li>
				<li>
						<a href="http://ebxml.org/">ebXML</a> 是由 UN/CEFACT 和 OASIS
驱动的一个国际性成果，通过开放 XML
标准为信息交换提供交易促进。
        <br /><br /></li>
				<li>
						<a href="http://www.uncefact.org/">UN/CEFACT</a>
是联合国的一个下属机构，处理贸易促进过程和术语，特别是计算机术语。
        <br /><br /></li>
				<li>
						<a href="http://www.oasis-open.org/">OASIS</a>
是一个国际社团，旨在促进允许不同信息系统相互操作的电子交易解决方案。
        <br /><br /></li>
				<li>
						<a href="http://xml.coverpages.org/ebXML.html">有关 ebXML 的
XML Cover Pages
部分</a>是与倡议相关的新闻和参考资料的权威性原始资料。另见
          <a href="http://xml.coverpages.org/rosettaNet.html">RosettaNet
部分</a>。
        <br /><br /></li>
				<li>
						<a href="http://www.commercenet.com/eco">eCo Framework</a>
是一个开发语义集成的项目，使用开放注册表和 Web-of-trust
技术来促进商业自动化。eCo 站点还以在其站点上只提供 
          <a href="http://216.38.137.215/tech/index.cfm">eCo
技术演示</a>著称。
        <br /><br /></li>
				<li>
						<a href="http://www.rosettanet.org/">RosettaNet</a> 是有兴趣使用
XML 改进供应链过程自动化的组织联盟。 RosettaNet 主页有几个以 HTML
和 XML 格式表示的供应链术语
          <a href="http://www.rosettanet.org/rosettanet/Rooms/DisplayPages/LayoutInitial?Container=com.webridge.entity.Entity%5BOID%5B969B86B8022CD411841F00C04F689339%5D%5D">
字典</a>供免费下载。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/library/w-rdf/?dwzone=ws">
								<i>An introduction to RDF</i>
						</a>，由 Uche Ogbuji
撰写，描述了为基于 Web 的元数据，W3C 使用 XML
作为交换语法开发的“资源描述结构 (RDF)”。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/library/ws-rdf/index.html?dwzone=ws">
								<i>Supercharging WSDL with RDF</i>
						</a>，由 Uche Ogbuji
撰写，说明了利用 RDF 来表示基于 Web 服务的描述。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/xml/library/w-rss.html">
James Lewin 的 An introduction to RSS news feeds</a> 描述了 RDF
Site Summaries 的一个应用，并提供了使用 Perl XML::RSS
模块的样本代码。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="" src="http://www-128.ibm.com/developerworks/cn/i/p-uche.jpg" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>
Uche Ogbuji 是 
        <a href="http://fourthought.com/">Fourthought Inc.</a>
的顾问兼创始人，该公司是专为企业知识管理应用提供 XML
解决方案的软件供应商和顾问。Fourthought 开发了 
        <a href="http://4suite.org/">4Suite</a>和
        <a href="http://fourthought.com/4SuiteServer">4Suite
Server</a>，它们是 XML 中间件的开放源码平台。Ogbuji
先生是一位出生于尼日利亚的计算机工程师和作家，他现居住于美国科罗拉多州的博耳德。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:34 <a href="http://www.blogjava.net/Vencent/articles/36723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML #3:踏着语义的节拍</title><link>http://www.blogjava.net/Vencent/articles/36725.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36725.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36725.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36725.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#author">Uche Ogbuji</a>, CEO 兼首席顾问, Fourthought, Inc.<br /></p>
		<p>2001 年  5 月  01 日</p>
		<blockquote>Uche Ogbuji 就 XML 语义透明性和 XML 知识管理方面讨论了近来所发生的事情，这其中包括 ebXML 和 RosettaNet 中的一些新的开发。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<i>Thinking XML</i> 专栏的前两部分讲述了语义透明性 --
可以共享那些不受约束的 XML
尖括号和引用标记中含义。由于本文的标题直接涉及到关于 XML
近来所发生的一些事情，所以在本文中（以后还会随时有其它的）主要讨论关于这些开发的更新。
      
      </p>
		<p>
对于语义透明性，大多数精力一直放在贸易简化（可作为一种组织来理解）和难以定义的自动交易请求，而且有可能让大多数都可以实现。在这个领域有一些突然而至的活动，这里来看一下
ebXML 和涉及到 RosettaNet 的项目。</p>
		<p>
				<a name="1">
						<span class="atitle">随处可见的
ebXML</span>
				</a>
		</p>
		<p>我最近参加了在纽约召开的 XML DevCon，发现 ebXML
随处可见。事实上，会议的主题之一就是 ebXML 的全球化。很高兴听到
ebXML 的提倡者讨论 ebXML
用于一些组织的重要性，这些组织包括工业国家的小企业和世界上的非政府性组织
(NGOs) --
它们没有时间和精力来组成一个电子商务集团。这就象对于那些缺乏资源建设技术基础设施（在西方已经建立起来了）的发展中国家从蜂窝和卫星通讯中受益匪浅一样，基于
XML
的贸易和商业过程的简化在提高生产力方面有很大潜力，这些是在长时间的信息技术革命后出现的。正如联合国秘书长
Kofi Annan 所说：</p>
		<blockquote>信息技术可以向发展中国家提供了一个机会，使它们跃过其它国家必须经过的漫长而痛苦的发展阶段。</blockquote>
		<p>在纽约的这次会议中，ebXML 人员提出了一个原则性的重要说明，那就是
ebXML
是“松耦合”的。这意味着当处理贸易交易双方的技术差别时具有很强的灵活性。这是很重要的原则，因为它体现了
Web
服务的价值所在，而不仅仅是一句漂亮的口号或一段时髦的词语，它成功地允许应用逻辑可以跨组织边界（在远程过程调用和分布对象失败情况下）应用。可惜，许多开发的
Web 服务技术看起来就象在原有旧组件平台的外面披一件 XML 和 HTTP
的外衣。正如 ebXML 支持者指出，这会提高 Web
服务将依赖紧耦合的危险性。当然，紧耦合给由供应商来支配带来了好处。几乎供应商使用的每一项技术都使客户依赖于客户系统不同特征之间的紧耦合，这使得使用松耦合处于很不公平得地位。例如，采用
SOAP 作为 ebXML 传输会在使用松耦合中失去竞争地位。</p>
		<p>
在会议上，我寻找种种不仅仅是闲置原则的产品的迹象。最后，发现了使用
ebXML 的具体示例。在一块场地上有家供应商显示它的产品实现了
ebXML。当然，本次会议也只是 ebXML 概念证明 (POC)
演示路途中的一站。象 NetFish/IONA、Documentum、Sun、BEA、Commerce
One、 Fujitsu、Kildara 和 Bowstreet 与 ebXML 原型（用
Perl、Python、C++ 或 Java
编写）一起演示了它们能够互相向对方的软件透明地发送消息，包括中间系统的演示。在演示之后，与这些参与着者会谈中得知，这个代码正快速地实现从原型向交付包转移。</p>
		<p>
				<a name="N1006C">
						<span class="smalltitle">发布的 ebXML 新闻</span>
				</a>
		</p>
		<p>就在写本文之前，有一些关于 ebXML 的重要消息。在 5 月 14 日，ebXML
完成了它 18
个月的开发周期，并得到了它在贸易上的上级组织认可。它宣布了一长串已同意的核心规范，并声称将花大部分精力推广其应用。当然这要根据市场和技术方面的成功花大量的时间来评估
ebXML，但发布象这样的理解性规范以及在其背后的多样性对于将 XML
用于组织间的通信来说是一条好消息。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">RosettaNet
提出联合</span>
				</a>
		</p>
		<p>
在 XML DevCon 上，ebXML 人员也极力宣传他们在纵向联合 XML
词汇提倡者方面的合作 -- 包括 Automotive Industry Action Group
(AIAG)、Global Commerce Initiative (GCI) 和 OpenTravel Alliance
(OTA)；而且很明显他们正在与 Health Level 7 (HL7)
合作。其中最另人感兴趣的是他们所提到的与 RosettaNet
的合作，特别强调了在 ebXML Registry/Repository 里寄宿 RosettaNet
PIPs。（对于这些术语的解释，请参阅
        
        <a href="http://www.ibm.com/developerworks/xml/library/x-think2.html">
本专栏的前一部分</a>。）
      
      </p>
		<p>尽管集中了这么多精力，但从本专栏中列出的 XML
词汇提倡者中可以得出一个结论，在语义透明性空间里有过多的分支。从近来的新闻发布会得知，RosettaNet
宣布它将关注并以极大的热情来统一这些流派。</p>
		<blockquote>虽然现今的许多 XML 提倡者都是相互补充的，但是大量的 XML
标准导致实现者和关键决策者之间的混乱。为了在工业界提供更清晰地理解，RosettaNet
开发了概念模型，用于定义支持供应链中贸易伙伴间的 B2B 集成所需求的
XML 标准的各层。</blockquote>
		<p>
这个概念模型突出显示了商业过程、商业和技术词典以及消息服务的编排做为电子商务所需要的组件。本文继续详细描述这个模型。遗憾的是，一旦谈到细节，新闻界似乎总是就有关具体的
RosettaNet
如何与其它提倡者一起实现这个概念唠叨个没完，而不谈及一些细节问题。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">网络上的字</span>
				</a>
		</p>
		<p>
我已经写了很多关于一些大型传统的集团正在开发 XML
语义。和通常一样，在这个领域一些最另人兴奋的成绩是来自于那些较小的、更有创造力的组织。WordNet
是由普林斯顿大学负责的一个项目，它创建了结构化的字数据库和由语义关系联系的同义词。WordNet
的开放性和机器访问性使它成为用于软件浏览语义的另人喜爱的源码。事实上，许多提倡者开发了使
WordNet 能访问 RDF 的工具，我在
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#Resources">参考资料</a>中提到了这些工具。
      
      </p>
		<p>若想了解 WordNet，Dr. Jonathan Borden
的联机浏览器是一个不错的示例，它使用了 Dan Brickley 的 联机 RDF
WordNet 模型。该浏览器使用 XSLT
样式表，所以对于那些正在开发语义相关的实际系统的开发人员来说，它是一个很方便的工具。这个联机浏览器的唯一问题是反应迟缓，要想较快一些的访问，可以下载
WordNet RDF 转储到本地机器。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">嘿，继续……</span>
				</a>
		</p>
		<p>每隔几个月，本专栏就会关注当前的一些事情以及另人感兴趣的新项目。如果您知道任何象这种值得让大家了解的发展动态，请通知我。下个月将介绍知识管理的调度。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-think11.html">英文原文</a>.
        
        <br /><br /></li>
				<li>
						<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/index.shtml">XML 编程思想 #1</a>和
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/index.shtml">XML 编程思想 #2</a> 讲述了提倡 XML
语义透明性。
        
        <br /><br /></li>
				<li>
						<a href="http://xmldevcon2001.com/NY/index.html">XML DevCon</a>
在纽约于 4 月份举行。Uche Ogbuji 根据本次会议也写了一篇关于
          
          <a href="http://www.ibm.com/developerworks/components/library/co-devcn.html">
与组件相关的观察报告</a>。
        
        <br /><br /></li>
				<li>最近的
          
          <a href="http://www.ebxml.org/news/pr_20010514.htm">ebXML
新闻发布</a>宣称已完成 ebXML 的 18 月的最初开发过程。
        
        <br /><br /></li>
				<li>
						<a href="http://www.aiag.org/">AIAG</a>、
          
          <a href="http://www.globalcommerceinitiative.org/">GCI</a>、
          
          <a href="http://www.opentravel.org/">OTA</a>和
          
          <a href="http://www.hl7.org/">HL7</a> 是与 ebXML 一起合作的工业化的
XML 标准。
        
        <br /><br /></li>
				<li>在本次新闻发布会上，
          
          <a href="http://www.rosettanet.org/rosettanet/Rooms/DisplayPages/LayoutDoc?PressRelease=com.webridge.entity.Entity%5BOID%5BC95A519EF538D511BD97009027E33DD8%5D%5D">
RosettaNet 宣称</a>已推出了关于工业化的 XML 标准的前景。
        
        <br /><br /></li>
				<li>普林斯顿的
          
          <a href="http://www.cogsci.princeton.edu/%7Ewn/">WordNet</a> 项目在 RDF
界引起了许多响应，包括 Sergey Melnik 和 Stefan Decker 的 
          
          <a href="http://www.semanticweb.org/library/">RDF 的 WordNet
表示</a>和 Dan Brickley 提到的
          
          <a href="http://lists.w3.org/Archives/Public/www-rdf-interest/2001Feb/0021.html">
许多其它效果</a>。
        
        <br /><br /></li>
				<li>Dr. Jonathan Borden
          
          <a href="http://lists.w3.org/Archives/Public/www-rdf-interest/2001Mar/0229.html">
声称</a><a href="http://www.rddl.org/wnbrowse">Wordnet
浏览器</a>使用了 Dan Brickley 的成绩。
        
        <br /><br /></li>
				<li>Alan Kotok 最近在 XML.com 发表的文章
          
          <i><a href="http://www.xml.com/pub/a/2001/05/16/ebxml.html">ebXML: It
Ain't Over 'til it's Over</a></i> 讨论了他刚完成的且涉及到 ebXML
未来的 ebXML。
        
        <br /><br /></li>
				<li>IBM Research 的 R. A. Smith 涉及到
          
          <a href="http://www.research.ibm.com/journal/sj/401/smith.html&amp;origin=x">
ebXML 如何适应电子商务基础设施的结构</a>。
        
        <br /><br /></li>
				<li>Partner Agreement Manager 是
          
          <a href="http://www-4.ibm.com/software/webservers/btobintegrator/about.html&amp;origin=x">
IBM WebSphere Business Integrator</a> 的关键部分，它使用了
RosettaNet 及其它协议来实现到商业伙伴的无缝集成。
        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="" src="http://www-128.ibm.com/developerworks/cn/i/p-uche.jpg" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Uche Ogbuji 是
        
        <a href="http://fourthought.com/">Fourthought Inc.</a>
的顾问兼创始人，该公司是专为企业知识管理应用提供 XML
解决方案的软件供应商和顾问。 Fourthought 开发了 
        
        <a href="http://4suite.org/">4Suite</a>和
        
        <a href="http://fourthought.com/4SuiteServer">4Suite
Server</a>，它们是 XML 中间件的开放源码平台。 Ogbuji
先生是一位出生于尼日利亚的计算机工程师和作家，他现居住于美国科罗拉多州的博耳德。
      
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
<img src ="http://www.blogjava.net/Vencent/aggbug/36725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:34 <a href="http://www.blogjava.net/Vencent/articles/36725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking XML #4: 知识管理的基本 XML 和 RDF 技术::第一部分：使用 XSLT 生成 RDF</title><link>http://www.blogjava.net/Vencent/articles/36721.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36721.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36721.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36721.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#author">Uche Ogbuji</a>, CEO 和首席顾问, Fourthought, Inc.<br /></p>
		<p>2001 年  7 月  01 日</p>
		<blockquote>专
栏作家 Uche Ogbuji 通过演示用来自现有 XML 格式的数据构成“资源描述框架 (RDF)”模型，开始了他的用 XML
进行的知识管理的实际探索。 如三个代码清单中所示，RDF 可用作定制 XML
的搭挡，而不仅仅用作某些数据类型的规范表示。包含代码样本的本专栏演示了如何用 RDF 方便地进行知识管理，甚至是在开发过程中相对比较晚的阶段。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>虽然 W3C 将“资源描述框架 (RDF)”设计为常规元数据建模工具，
但它还提供了许多功能，使之成为 XML 数据的理想搭挡。
在许多正在形成的 XML
应用程序中，在应用程序的生存期中封装在应用程序中的知识以 XML
文档形式存储在数据库或资源库中。作为知识管理工具的 RDF
的基本用途是，
它允许您组织、关连、分类和注释这些知识，从而增加存储数据的总计值。
RDF 具有复杂性，通过简单地将 RDF 支持添加到基于 XML
的应用程序中来掩饰这种复杂。 本文开始探索 RDF 和 XML
之间的协作关系。以下将演示如何使用 XSLT 根据 XML 生成 RDF。</p>
		<p>必需熟悉 RDF 和 XSLT。也可以先阅读以前 developerWorks 中的
        
        <a href="http://www.ibm.com/developerworks/xml/library/w-rdf/">介绍
RDF</a>， 或者
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#resources">参考资料</a>中链接的其它文章。
      
      </p>
		<p>
				<a name="1">
						<span class="atitle">旧东西不一定总是过时的</span>
				</a>
		</p>
		<p>例如，让我们来跟踪技术规范的开放式开发过程。
规范是公布到网上且感兴趣的团体可以阅读它、添加与规范相关的问题、
评论公开的问题以及指派相关问题的操作项目等等。</p>
		<p>XML 是一种功能强大的工具，它可将这种问题追踪放在一起。
虽然问题和操作项目的描述和相关讨论都需要灵活的表示，
但结构对于维护数据语义是很重要的。
在示例中，应用程序已经开发好了，而且使用了用于如将操作项目提示者发送给用户、支持搜索和浏览等任务的基本技术。然而，为了利用
RDF
处理中可使用的许多现有工具和技术，开发人员已经决定开始在应用程序中使用
RDF。</p>
		<p>在选择使用 RDF
时，开发人员不想重新设计所有的应用程序数据和逻辑。
他们宁愿添加他们能够（并且或许逐渐）将 RDF
处理移向应用程序核心的那些东西。
所以，他们面临的任务之一是，根据他们已经收集的 XML 数据生成有用的
RDF。</p>
		<p>
				<a name="N10072">
						<span class="smalltitle">XML 格式示例</span>
				</a>
		</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/listing1.shtml">清单 1</a> 是追踪过程中单个问题的 XML
格式示例。
它有唯一标识符和表示问题与哪个文档或文档部分相关的引用元素。
问题的原创者被加上注释，这表示正在使用系统的用户管理功能。
任何人都可以对文档进行撰稿，但对已注册的用户会特别标注和处理。
问题的主要描述和附加的用户注释会联机显示，并且还有指派给用户的相关操作。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">播种数据，收获元数据</span>
				</a>
		</p>
		<p>从问题追踪中所使用的 XML 文件中抽取 RDF 元数据的方法有几种。
最直接的方法或许是编写一种 XSLT 转换， 它读取文件并输出元数据的
RDF/XML 序列，这将在下一小节中演示。</p>
		<p>因为 RDF 位于 URI
上（出于更好或出于更坏），所以您必须为元数据节点 提出一些 URI
方案。一些事物（如用于创作问题的规范的位置）已经有 URI。
其它事物可能已经有专门的 XML 表示；
在我们的示例中，用户对象作为单独的 XML 文件管理。
其它事物可能仍是完全抽象的，除了它们的元数据节点外，没有任何应用程序设计工具或机制。
这最后一类的示例是我建议为资源创建的 RDF 类型。 要在 RDF 中使用的
URI 如下：</p>
		<ul>
				<li>在鉴定中的规范的地址。
          
          <i>示例：</i>
http://rdfinference.org/ril/ril-20010502。
        
        </li>
				<li>问题的 XML 源码的地址。
          
          <i>示例：</i>
http://rdfinference.org/ril/issue-tracker/issues/i2001030423
        
        </li>
				<li>注册用户的概要文件的 XML 源码的地址。
          
          <i>示例：</i>
http://rdfinference.org/ril/issue-tracker/users/uogbuji.
        
        </li>
				<li>作者、问题、指派等的 RDF 类型。
          
          <i>示例：</i>
http://rdfs.rdfinference.org/ril/issue-tracker#Author
        
        </li>
		</ul>
		<p>
				<a name="N100A6">
						<span class="smalltitle">一个可能的 RDF 系列化</span>
				</a>
		</p>
		<p>
上面已给出 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/listing2.shtml">清单 2</a>， 它是表示
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/listing1.shtml">清单 1</a> 中元数据的一个可能的 RDF
模型系列化。
      
      </p>
		<p>请注意：在某些情况下，我使用匿名资源，如注释和操作资源。
这是一种建模选项。例如，要对用于任务调度的操作进行集中索引， 那么将
URI 用于抽象操作而不是使它们保持匿名可能是有意义的。</p>
		<p>
				<a name="N100BA">
						<span class="smalltitle">XSLT 转换</span>
				</a>
		</p>
		<p>
现在，您已经了解 RDF
的样子，就可以构造一种转换，将问题描述转换成适当的 RDF 文件。 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/listing3.shtml">清单 3</a>就是使用 XSLT 的这种转换。
      
      </p>
		<p>至于在此清单中看到的一些技术，我已经在先前的一篇 developerWorks
文章―― 
        
        <a href="http://www.ibm.com/developerworks/xml/library/ws-trans/index.html">用 XSLT 进行 WSDL 处理</a> 中讨论过，它包含将“Web 服务描述语言
(WSDL)” 转换成 XML 这一章节。在这种情况下，目的是尽可能使产生的
RDF 系列化看上去更接近原始的WSDL
XML。在这种情况中没有这种约束，因此转换很少是机密的。
只是依次访问各种 XML 元素，并一点一点地构建等价的 RDF 描述。
      
      </p>
		<p>最重要的高层次的操作是 
        
        <code>issue</code> 元素的匹配，
它仅仅转向并调用一个已命名模板来为相应的问题实际构建 RDF 描述。
这种间接方式的原因是，可以为定制和扩展这种转换提供灵活性。
例如，当您阅读下一个 
        
        <i>XML
编程思想</i> 专栏时，可以在执行从问题文档到 RDF 的批处理转换的
单独的转换中使用已命名模板。
      
      </p>
		<p>
在示例中，除了联机规范本身之外，问题跟踪程序还可以跟踪有关各种资源的问题。
（您可以从问题跟踪程序本身开始一个问题――也许是一个错误报告。）
由于这个原因，设计还要使引用元素的处理变得相当灵活。 使用单独的
XSLT 方式（确保仅在正确时刻解析引用元素），
模板检查 
        
        <code>引用</code> 元素的可展开内容。
目前，示例应用程序通过用来自正被讨论的问题中的引用简单地创建 RDF
描述来处理引用是指规范这种情况。
由于需要处理更多种类型的可扩展引用， 所以可以添加附加的 
        
        <code>xsl:when</code> 子句来处理这些情况。
      
      </p>
		<p>
您还可以查看用于处理使用概要文件或只是自由格式的文本注册用户描述这一事实的基本方法。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">更多要遵循的</span>
				</a>
		</p>
		<p>在本专栏中，我已提供了使用 XSLT 从 XML 实例中抽取 RDF 的简单示例。
随着越来越多的基于 XML
的应用程序的使用，这样的技术在扩展带有知识管理特性的应用程序中是有用的。</p>
		<p>
下一个专题将继续问题跟踪程序示例，同时演示问题文档的批处理和对此处理有用的一些开放源码工具。</p>
		<p>本专题中的示例和下一专题中的示例都是基于一个实际的项目，该项目为
rdfinference.org 上的“RDF
接口语言”规范组成一个问题跟踪程序。不久，您将可以在此公共站点上看到这一实际工作。
在那之前，请您自由地试验本文中的示例代码，并将任何问题、意见和想法发送给我。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-think8.html">英文原文</a>.
        
        <br /><br /></li>
				<li>请参阅本专栏以前的专题，题为：
          
          <ul><li><a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part1/index.html">XML meets semantics: The
reality</a></li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part2/index.html">XML meets semantics: Meet the new
kids on the block, and one more from the old neighborhood</a></li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part3/index.html">Walking the semantic beat</a></li></ul><br /></li>
				<li>Dave Beckett 的
          
          <a href="http://www.ilrt.bris.ac.uk/discovery/rdf/resources/">RDF
Resource Guide</a> 是至与 RDF
相关的文章、工具等链接的综合集合。
        
        <br /><br /></li>
				<li>本文中的示例是使用
          
          <a href="http://4suite.org/">4Suite</a> 的
XSLT 处理器测试的。
        
        <br /><br /></li>
				<li>
						<a href="http://www.research.ibm.com/resources/magazine/1999/number_1/xml199.html&amp;origin=x">XML: the next big thing</a> 是 Tom Halfhill 编写的 IBM 研究论文，
它讨论了 RDF 为下一代搜索引擎提供动力的可能性。
        
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/events/solutionsevent/&amp;origin=x">解决方案 2001 年开发人员大会</a> 将于 8 月 13 日至 18
日在旧金山召开； 请在 
          
          <a href="http://216.140.182.181/solutions/guest/AgendaBuilder.html&amp;origin=x">AgendaBuilder</a> 中搜索或浏览有关 230
多个会议的描述。有二十多个会议是关于 XML 及其相关技术，包括：
          
          <ul><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=144">实践：集成 XML 与 DB2</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=117">实践： 语音 XML 工具／构建绝佳的应用程序</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=48">XSL 示例：XML 转换简介</a></li><li><a href="http://216.140.182.181/solutions/guest/Session.do?action=display&amp;id=43">使 用 Java 技术对 XML 文档进行语法分析和编程。</a></li></ul><br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/rdf/part4/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="author" src="http://www-128.ibm.com/developerworks/cn/i/p-uche.jpg" align="left" border="0" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Uche
Ogbuji (
        
        <a href="mailto:uche.ogbuji@fourthought.com">uche.ogbuji@fourthought.com</a>)
是 
        
        <a href="http://fourthought.com/">Fourthought Inc.</a>
的顾问兼创始人， 该公司是专为企业知识管理应用提供 XML
解决方案的软件供应商和顾问。 Fourthought 开发了 
        
        <a href="http://4suite.org/">4Suite</a>、
        
        <a href="http://fourthought.com/4SuiteServer">4Suite Server</a> ，
它们是 XML 中间件的开放源码平台。 Ogbuji
先生是一名出生于尼日利亚的计算机工程师和作家，他生活和工作在美国科罗拉多州的博耳德。
      
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
		<p id="subtitle">
				<em>
						<br />
				</em>
		</p>
<img src ="http://www.blogjava.net/Vencent/aggbug/36721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:33 <a href="http://www.blogjava.net/Vencent/articles/36721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL基础教程（二）</title><link>http://www.blogjava.net/Vencent/articles/36720.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:32:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36720.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36720.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36720.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html#author">青苹果工作室编译，转自 ccidnet 网站</a>
				<br />
				<br />
				<b>
						<font color="red">Error:  Please enter a value for the author element's jobtitle attribute, or the company-name element, or both.</font>
				</b>
				<br />
				<br />
				<br />
		</p>
		<p>2001 年  3 月  01 日</p>
		<blockquote>XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切：</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="1">
						<span class="atitle">客户端XSL：如何用XML解析器在客户机上将XML文档转换成HTML文档。</span>
				</a>
		</p>
		<b>一个JavaScript的解决方法</b>
		<br />
在前文中，我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表，然后让浏览器来进行转换。即使这种方法能奏效，在XML文件中包含一个样式表引用也并非令人满意的方法，并且在不支持XSL的浏览器上这种方法还不能奏效。

      
      <br />
一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript，就更有以下可能性：
      
      <br /><ul><li>允许JavaScript进行浏览器细节测试；</li><li>根据浏览器和用户需求使用不同的样式表。</li><li>
这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能，从而支持不同的浏览器和不同的用户需求。</li><li>
客户端XSL转换将成为未来浏览器工作任务的一个主要部分，我们还将看到专业化浏览器市场的成长，比如Braille、
发声网络、网络打印机、手持PC、移动电话等。</li></ul><br /><b>XML文件和XSL文件</b><br />
现在重新来看看前面章节中的XML文档：
      
      <br /><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="600"><tbody><tr><td><pre><code class="section"><br />    &lt;?xml version="1.0"?&gt;<br />    &lt;CATALOG&gt;<br />      &lt;CD&gt;<br />        &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />        &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />        &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />        &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />        &lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />        &lt;YEAR&gt;1985&lt;/YEAR&gt;<br />      &lt;/CD&gt;<br />    .<br />    .<br />    .<br />    还有附带的XSL样式表：<br />    &lt;?xml version='1.0'?&gt;<br />    &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />    &lt;xsl:template match="/"&gt;<br />      &lt;html&gt;<br />      &lt;body&gt;<br />        &lt;table border="2" bgcolor="yellow"&gt;<br />          &lt;tr&gt;<br />            &lt;th&gt;Title&lt;/th&gt;<br />            &lt;th&gt;Artist&lt;/th&gt;<br />          &lt;/tr&gt;<br />          &lt;xsl:for-each select="CATALOG/CD"&gt;<br />          &lt;tr&gt;<br />            &lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />            &lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />          &lt;/tr&gt;<br />          &lt;/xsl:for-each&gt;<br />        &lt;/table&gt;<br />      &lt;/body&gt;<br />      &lt;/html&gt;<br />    &lt;/xsl:template&gt;<br />    &lt;/xsl:stylesheet&gt;<br /></code></pre></td></tr></tbody></table><br /> 

要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。注意：上面的句子说明一个XML文件可以用许多不同的XSL文件进行转换。


      
      <br /><b>在浏览器中将XML转换到HTML</b><br />
以下是在客户机上将XML文件转换成HTML所需要的源代码，很简单：
      
      <br /><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />    &lt;html&gt;<br />    &lt;body&gt;<br />    &lt;script language="javascript"&gt;<br />    // Load XML<br />    var xml = new ActiveXObject("Microsoft.XMLDOM")<br />    xml.async = false<br />    xml.load("cd_catalog.xml")<br />    // Load the XSL<br />    var xsl = new ActiveXObject("Microsoft.XMLDOM")<br />    xsl.async = false<br />    xsl.load("cd_catalog.xsl")<br />    // Transform<br />    document.write(xml.transformNode(xsl))<br />    &lt;/script&gt;<br />    &lt;/body&gt;<br />    &lt;/html&gt;<br /></code></pre></td></tr></tbody></table><br /><br />如果使用的是Internet Explorer 5.0 或更高版本，请点击这里
      
      <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/tryit.htm" target="_blank">查看结果</a>。
      
      <br /><br />代码的第一块创建了Microsoft XML
解析器(XMLDOM)的一个例示，并将XML文档加载到内存中。代码的第二块创建解析器的另一个例示，并将XSL文档加载到内存中。代码的最后一行用XSL文档转换XML文档，将结果写入HTML
文档中。
      
      <br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="2"><span class="atitle">服务器端XSL：如何用XML解析器在服务器上将XML文档转换成HTML文档。</span></a></p><p><b>服务器端XSL</b><br />
由于不是所有的浏览器都支持XML和XSL，因此就有了一个在服务器上将XML转换成HTML的方法。
      
      </p><p><b>一个跨浏览器的解决方法</b><br />
在前面的章节中，我们解释了如何用XSL在浏览器中将XML文档转换成HTML，窍门就是让JavaScript使用一个XML解析器来进行转换。但是当
浏览器不支持XML解析器时，这种方法是不奏效的。要使XML数据对所有浏览器都可用，我们就必须在服务器上转换XML文档，并将它作为纯HTML发送到
浏览器。 </p><p>
这是XSL的另一个美妙之处。XSL的设计目的之一是使得在服务器上将数据从一种格式转换成另一种格式成为可能，并将可读数据返回到所有未来的浏览器中。</p><p>
在服务器上进行XSL转换正在成为未来Internet信息服务器工作任务的一个主要部分，同时我们将看到专用浏览器市场的发展，如：Braille、有声网络、网络打印机、手持PC、移动电话等。</p><p><b>XML文件和XSL文件</b><br />
现在来重新看看前面章节中的XML文档：
      
      </p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />    &lt;?xml version="1.0"?&gt;<br />    &lt;CATALOG&gt;<br />      &lt;CD&gt;<br />        &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />        &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />        &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />        &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />        &lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />        &lt;YEAR&gt;1985&lt;/YEAR&gt;<br />      &lt;/CD&gt;<br />    .<br />    .<br />    .<br /></code></pre></td></tr></tbody></table><br /> 

如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看
      
      <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xml" target="_blank">XML文件</a>。
      
      <br />
再看看伴随的XSL样式表： 
      
      <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />    &lt;?xml version='1.0'?&gt;<br />    &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />    &lt;xsl:template match="/"&gt;<br />      &lt;html&gt;<br />      &lt;body&gt;<br />        &lt;table border="2" bgcolor="yellow"&gt;<br />          &lt;tr&gt;<br />            &lt;th&gt;Title&lt;/th&gt;<br />            &lt;th&gt;Artist&lt;/th&gt;<br />          &lt;/tr&gt;<br />          &lt;xsl:for-each select="CATALOG/CD"&gt;<br />          &lt;tr&gt;<br />            &lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />            &lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />          &lt;/tr&gt;<br />          &lt;/xsl:for-each&gt;<br />        &lt;/table&gt;<br />      &lt;/body&gt;<br />      &lt;/html&gt;<br />    &lt;/xsl:template&gt;<br />    &lt;/xsl:stylesheet&gt;<br /></code></pre></td></tr></tbody></table><br /> 

如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看
      
      <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xsl" target="_blank">XSL文件</a>。


      
      <p>
以上XSL文档的语法在前面章节中已经解释过了，因此这里不再做解释。但是要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。同时请注意：上面的句子表明一个服务器上的XML文件可以用许多不同的XSL文件进行转换。</p><p><b>在服务器端将XML转换成HTML</b><br />
以下是在服务器上转换XML文件所需要的简单源代码：
      
      </p><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td><pre><code class="section"><br />    &lt;%<br />    'Load the XML<br />    set xml = Server.CreateObject("Microsoft.XMLDOM")<br />    xml.async = false<br />    xml.load(Server.MapPath("cd_catalog.xml"))<br />    'Load the XSL<br />    set xsl = Server.CreateObject("Microsoft.XMLDOM")<br />    xsl.async = false<br />    xsl.load(Server.MapPath("cd_catalog.xsl"))<br />    'Transform the file<br />    Response.Write(xml.transformNode(xsl))<br />    %&gt;<br /></code></pre></td></tr></tbody></table><br /> 

代码的第一块创建Microsoft
XML解析器(XMLDOM)的一个例示，并将XML文件装载到内存中。代码的第二块创建解析器的另一个例示，并将XSL文档装载到内存。代码的最后一行用XSL文档转换XML文档，并将结果返回浏览器。

      
      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="3"><span class="atitle">文章相关部分</span></a></p><ul><li><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index1.shtml">XSL基础教程(一)</a><br /><br /></li><li><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.shtml">XSL基础教程(三)</a></li></ul><table><tbody><tr><td>本文转自
            
            <a href="http://www.ccidnet.com/"><img alt="" src="http://www-128.ibm.com/developerworks/cn/i/ccidnet.gif" border="0" height="40" width="100" /></a></td></tr></tbody></table><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="author"><span class="atitle">关于作者</span></a></p><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td colspan="3"><img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" /></td></tr><tr align="left" valign="top"><td><br /></td><td><img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" /></td><td width="100%"><p>青苹果工作室编译，转自 ccidnet 网站 has authored this article</p></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/36720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:32 <a href="http://www.blogjava.net/Vencent/articles/36720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探索 XML 加密，第 1 部分::演示结构化数据的安全交换</title><link>http://www.blogjava.net/Vencent/articles/36718.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36718.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36718.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36718.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#author">Bilal Siddiqui</a>, CEO<br /></p>
		<p>2002 年  3 月  01 日</p>
		<blockquote>XML
加密为需要结构化数据安全交换的应用程序提供了一种端到端安全性。XML 本身是对数据进行结构化最流行的技术，因此基于 XML
的加密成为处理数据互换应用程序中安全性的复杂需求的方法。在这个两部分系列的第 1 部分中，Bilal 解释了打算如何将 XML 和安全性集成到
W3C XML 加密工作草案中。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>当前，传输层安全性
（Transport Layer Security(TLS)）是因特网上安全通信的事实标准。TLS
是继著名的安全套接字层（SSL）之后的端到端安全性协议。SSL 最初是由 Netscape
设计的，而且，之后国际工程任务小组（Internet Engineering Task Force (IETF)）改编了它的 3.0
版本，同时他们还在设计 TLS。这是一个非常安全和可靠的协议，它提供了通信双方之间的端到端安全性会话。XML 加密（XML
Encryption）无意替换或取代 SSL/TLS。相反，它提供了用于 SSL 未涵盖的安全性需求的机制。以下是两个 SSL
未涉及的重要领域：</p>
		<ul>
				<li>加密交换数据的一部分</li>
				<li>多方（不止两方）之间的安全会话</li>
		</ul>
		<p>使用 XML 加密，每一方都可以保持与任何通信方的安全或非安全状态。可以在同一文档中交换安全的和非安全的数据。
例如，考虑一个包含许多聊天室的安全聊天应用程序，其中每个聊天室都有几个人。可以在聊天伙伴之间交换 XML 加密的文件，这样一个聊天室中的数据对其它聊天室而言是不可见的。</p>
		<p>XML 加密能够处理 XML 和非 XML（例如二进制）数据。现在我们将演示一个简单的数据交换，通过 XML 加密使它安全。然后我们将慢慢地增加安全性需求的复杂程度，并解释 XML 加密模式及其不同元素的使用。</p>
		<p>
				<a name="1">
						<span class="atitle">XML 数据安全交换的简单示例</span>
				</a>
		</p>
		<p>
假设您希望将 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a>中
的 XML
文件发送给出版公司。这个文件包含一本您要购买的书的详细信息。此外，它还包含您付款的信用卡信息。自然地，您希望对这些敏感数据使用安全通信。一种选择
是使用 SSL，它将保护整个通信的安全。备选方案是使用 XML 加密。正如已经提到的，XML 加密不是 SSL/TLS
的替代。如果应用程序要求整个通信是安全的，则您将使用
SSL。另一方面，如果应用程序需要安全和非安全通信的组合（这意味着部分数据将被安全地交换，而其它数据将按原样交换），那么 XML
加密是最佳选择。 </p>
		<br />
		<a name="code1">
				<b>清单 1. 要加密的样本 XML 文件</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;purchaseOrder&gt;<br />	&lt;Order&gt;<br />		&lt;Item&gt;book&lt;/Item&gt;<br />		&lt;Id&gt;123-958-74598&lt;/Id&gt;<br />		&lt;Quantity&gt;12&lt;/Quantity&gt;<br />	&lt;/Order&gt;<br />	&lt;Payment&gt;<br />		&lt;CardId&gt;123654-8988889-9996874&lt;/CardId&gt;<br />		&lt;CardName&gt;visa&lt;/CardName&gt;<br />		&lt;ValidDate&gt;12-10-2004&lt;/ValidDate&gt;<br />	&lt;/Payment&gt;<br />&lt;/purchaseOrder&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<b>注意：</b>我们故意使
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a>
中的 XML 文件非常简单。这有助于将我们的注意力集中在与加密相关的问题上。用于合作商业或 Web 服务的现实 XML
文件将有类似的结构，但更冗长。WSDL（Web 服务定义语言）和 SOAP（简单对象访问协议）是 B2B 集成中经常使用的基于 XML
的语法。WSDL 和 SOAP 都可使用 XML 加密来提供企业内的安全通信。
有关它们的详细信息，请访问 W3C（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#resources">参考资料</a>）。
      
      </p>
		<p>
				<a name="N10072">
						<span class="smalltitle">使用 XML 加密对整个文档加密</span>
				</a>
		</p>
		<p>XML 加密提供各种选项。
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a>、
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a>和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing4.shtml">清单 4</a>显示了不同的加密结果。让我们逐个仔细研究它们。
      
      </p>
		<p>
倘若您决定加密 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a>中的整个 XML 文档，则
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a> 显示最后所得到的 XML 加密的文件。请注意 
        
        <code>&lt;CipherData&gt;</code> 和 
        
        <code>&lt;CipherValue&gt;</code> 标记。实际加密的数据作为 
        
        <code>&lt;CipherValue&gt;</code> 标记的内容出现。整个 
        
        <code>CipherData</code> 元素出现在一个 
        
        <code>EncryptedData</code> 元素内。 
        
        <code>EncryptedData</code>
元素包含用于加密的 XML 名称空间。例如，加密前的原始数据是 XML 并且 Internet Assigned Numbers
Authority（IANA）对 XML 的正式类型定义是
http://www.isi.edu/in-notes/iana/assignments/media-types/text/xml。
这作为 <code>Type</code> 属性的值出现。XML 对各种流行的数据格式（如 RTF、PDF 和 JPG）使用 IANA 的类型定义。完整细节，请参阅它们的网站（请参阅 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#resources">参考资料</a> ）。如果有特殊的应用程序数据类型（可能是属于您公司的内容管理系统特有的 DTD 或 XSD），可以在 
        
        <code>EncryptedData</code> 元素的 
        
        <code>Type</code> 属性里指定它们。另一个属性 xmlns 指定了用来加密 XML 数据的 XML 加密名称空间。
      
      </p>
		<p>
				<a name="N100BA">
						<span class="smalltitle">使用 XML 加密对单个元素加密</span>
				</a>
		</p>
		<p>
您可能只想加密 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a> 中的一个元素 ― 例如 
        
        <code>Payment</code> 元素。在这种情况下， 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a>中阐明了其结果。比较
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a>和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a>，您将发现下列差异：
      
      </p>
		<ol>
				<li>
						<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a>只包含 XML 加密的模式，而
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a>既包含 XML 加密模式又包含来自
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a>中原始数据的元素。在
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a>中，XML 加密被嵌入到用户的 XML 中。
        
        </li>
				<li>
						<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing3.shtml">清单 3</a> 的 
          
          <code>&lt;EncryptedData&gt;</code> 中也有一个 
          
          <code>Type</code> 属性，但它的值是 http://www.w3.org/2001/04/xmlenc#Element。我们不再使用 IANA 类型；相反，我们使用 XML 加密已指定的类型。
        
        </li>
				<li>请特别注意末尾的片段 #Element，它表示 EncryptedData ― 这代表一个元素。</li>
		</ol>
		<p>
				<a name="N100FF">
						<span class="smalltitle">加密元素的内容</span>
				</a>
		</p>
		<p>如果您只要加密
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#code1">清单 1</a> 中元素 
        
        <code>CardId</code> 中的内容， 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing4.shtml">清单 4</a> 就是其结果。这次，我们使用 http://www.w3.org/2001/04/xmlenc#Content 作为 
        
        <code>Type</code> 属性的值。每当我们都仅须加密内容时都使用这个值。
      
      </p>
		<p>
				<a name="N10118">
						<span class="smalltitle">加密非 XML 数据</span>
				</a>
		</p>
		<p>假如您希望通过 XML 加密发送一个 JPEG 文件，那会怎么样呢？
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing5.shtml">清单 5</a> 是将产生的一个典型文件。按字节序列加密的整个 JPEG 文件将作为 
        
        <code>CipherValue</code> 元素的内容出现。
请注意， 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a>和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing5.shtml">清单 5</a> 之间唯一的差异： 
        
        <code>EncryptedData</code> 元素的 
        
        <code>Type</code> 属性。 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing5.shtml">清单 5</a>包含了 JPEG 格式的 IANA 类型。类似地，可以通过提供 IANA 值（参考 IANA 网站，请参阅
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#resources">参考资料</a>）加密任何格式。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10141">
						<span class="atitle">XML 加密的密钥</span>
				</a>
		</p>
		<p>
在清单 1 到 5 中，我们已经演示了加密，而加密就不可能不使用密钥（请参阅侧栏 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#sidebar">公钥、私钥和秘钥</a>）。使用 XML 加密，所有与密钥相关的问题划分成两个部分：
      
      </p>
		<ul>
				<li>密钥的交换（非对称加密）</li>
				<li>使用预先交换的密钥（对称加密）</li>
		</ul>
		<p>这样，用户可以交换密钥并在以后使用它们。</p>
		<p>
				<a name="N1015A">
						<span class="smalltitle">用于交换秘钥的非对称密钥</span>
				</a>
		</p>
		<p>
在这个方案中，一方将它的公钥发送给另一方。另一方使用这个公钥加密其秘钥。 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing6.shtml">清单 6</a>（请求）和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a> （响应）中显示了这种数据交换。我们假设 Imran 和 Ali 分别是相互通信的第一方和第二方。Imran 初始化了公钥交换请求并在名为 KeyValue 的元素中发送了他的公钥。
属性 
        
        <code>CarriedKeyName</code> 表示所传输密钥的名称。请注意这个结构的根元素是 
        
        <code>EncryptedKey</code> ，它包含 
        
        <code>ds:KeyInfo</code> 和 
        
        <code>ds:KeyValue</code> 元素。 
        
        <code>ds: KeyInfo</code> 和 
        
        <code>ds:KeyValue</code> 元素属于 XML 数字签名（ds:）名称空间。对于密钥交换 XML 加密完全依赖于 XML 数字签名规范。因此， 
        
        <code>&lt;ds:EncryptedKey&gt;</code> 和 
        
        <code>&lt;ds:KeyValue&gt;</code> 都属于 XML 数字签名规范名称空间。 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a>是 Ali 发送的响应。
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a> 中的 
        
        <code>CipherValue</code> 元素包含一个新生成的秘钥，它是用第一方的公钥加密的。仔细看清单 6 和清单 7，您将注意到请求和响应都包含 
        
        <code>EncryptedKey</code> 元素。 
        
        <code>EncryptedKey</code> 元素内的 
        
        <code>ds:KeyInfo</code> 和 
        
        <code>ds:KeyValue</code> 元素携带着公钥（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing6.shtml">清单 6</a> ）。另一方面， 
        
        <code>EncryptedKey</code> 元素内的 
        
        <code>CipherData</code> 和 
        
        <code>CipherValue</code> 元素（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a> ）将传输（加密的）秘钥。还请注意 
        
        <code>EncryptedKey</code> 元素总是包含一个 
        
        <code>CarriedKeyName</code> 属性来指定其所携带密钥的名称。
      
      </p>
		<p>
				<a name="N101C3">
						<span class="smalltitle">使用我们过去已经交换的密钥</span>
				</a>
		</p>
		<p>在前一节中，我们交换了一个秘钥。现在我们将使用那个密钥来加密数据。我们将假定 Imran 发送了一条 XML 消息（
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing8.shtml">清单 8</a>）来响应
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a>（请回忆
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">清单 7</a>包含一个名为“Imran Ali”的加密的秘钥）。Imran 将使用他的（Imran 自己的）私钥来解密这个秘钥（因为 Ali 用 Imran 的公钥加密了这个秘钥）。Imran 可以使用这个秘钥并将它放在
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing8.shtml">清单 8</a> 中的 
        
        <code>CipherValue</code> 元素中来加密他打算发送给 Ali 的数据。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing8.shtml">清单 8</a> 中的 
        
        <code>ds:KeyInfo</code> 元素包含一个 
        
        <code>KeyName</code> 元素。这个组合引用了 Imran 用于数据加密的密钥名称。
      
      </p>
		<p>图 1 是显示用于安全数据交换的 XML 文件的这种交换的可视图。</p>
		<br />
		<a name="figure1">
				<b>
图 1. 使用 XML 加密进行密钥与数据交换的顺序
</b>
		</a>
		<br />
		<img alt="使用 XML 加密进行密钥与数据交换的顺序。" src="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/Figure1.jpg" height="373" width="554" />
		<br />
		<p>
在 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing5.shtml">清单 5</a>和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">7</a> 中， 
        
        <code>CipherData</code> 元素可以出现在 
        
        <code>EncryptedData</code> 元素或 
        
        <code>EncryptedKey</code> 元素中。我们使用 
        
        <code>CipherData</code> 元素来引用加密数据（当它出现在 
        
        <code>EncryptedData</code> 元素中时）或加密密钥（当它出现在 
        
        <code>EncryptedKey</code> 元素中时）。在清单 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing5.shtml">5</a>和
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing7.shtml">7</a> 中，包含实际加密数据的 
        
        <code>CipherData</code> 元素中都有一个 
        
        <code>CipherValue</code> 子元素。
      
      </p>
		<p>我们也可以引用外部加密数据或加密密钥。这意味着实际加密数据或密钥将出现在别的地方（可能是因特网上的某个地方），而不是在 XML 加密文件内。在这种情况下，我们将在 
        
        <code>CipherData</code> 中使用 
        
        <code>CipherReference</code> 而不是 
        
        <code>CipherValue</code> 子元素。我们将通过 URI 引用实际加密数据。这在 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing9.shtml">清单 9</a>中显示。
      
      </p>
		<p>
				<a name="N10247">
						<span class="smalltitle">引用外部 XML 文件中的特定元素</span>
				</a>
		</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing10.shtml">清单 10</a> 说明了引用外部 XML 文件的一个变体。这里我们只引用了 URI 所指向的外部文件的一部分。 
        
        <code>CipherReference</code> 元素中有一个 
        
        <code>Transforms</code> 子元素。这个 
        
        <code>Transforms</code> 元素可以包含许多 
        
        <code>Transform</code> 元素，其中每个都将包含单个 XPath 元素。这个 XPath 元素指定一个 XPath 表达式，该表达式引用外部 XML 文档的特定节点。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">我们的 API 的 DOM 结构</span>
				</a>
		</p>
		<p>

我们已经演示了如何创建 XML 加密文件以及交换加密数据。现在我们将推荐用于 XML 加密的 Java API 并提供一个样本实现。为达到这个目的，我们将使用  DOM。</p>
		<p>我们的 DOM 实现由一组类组成（清单 11 到 16）。 
        
        <code>XmlEncryption</code> 类（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a>）是其余类的封装器，这意味着我们的 API 用户将只需要与这个类交互。在内部它使用其它类的功能。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a>是一个能够生成完整 XML 加密文件的封装器类。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing12.shtml">清单 12</a> 创建 
        
        <code>EncryptedData</code> 元素。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing13.shtml">清单 13</a> 创建 
        
        <code>EncryptionMethod</code> 元素。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing14.shtml">清单 14</a> 创建 
        
        <code>KeyInfo</code> 元素。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing15.shtml">清单 15</a> 创建 
        
        <code>CipherData </code> 元素。
      
      </p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing16.shtml">清单 16</a>包含作为静态整数的算法名称及其作为字符串的相应名称空间。
      
      </p>
		<p>
				<code>XmlEncryption</code> 类（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a>）包含各种公用 Get/Set 方法。用户将调用 Set 方法来指定加密参数，包括下列：
      
      </p>
		<ol>
				<li>要加密的文件名称</li>
				<li>所产生的 XML 加密文件的名称</li>
				<li>加密算法的名称</li>
				<li>将用于加密的密钥名称</li>
				<li>用于 
          
          <code>&lt;EncryptedData&gt;</code> 结构标识的 ID
        
        </li>
		</ol>
		<p>我们已经通过 
        
        <code>main ()</code> 方法演示了 
        
        <code>XmlEncryption</code> 类（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a> ）的使用。我们在 
        
        <code>main ()</code> 方法中创建了这个类的实例。构造器实例化了 DOM，因此所有基本类都将使用同一个对象。
      
      </p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="sidebar">
																				<b>公钥、私钥和秘钥</b>
																		</a>
																		<br />
																		<p>我们使用了三个与密钥相关的术语（公钥、私钥和秘钥）。尽管这些术语对从事端到端安全性的开发人员而言是众所周知的，但 XML 开发人员可能并不熟悉它们。让我们阐明这些术语：
          
          <br /><br /><i>公钥和私钥：</i>我们成对使用它们。有些算法生成一对公钥和私钥。我们将公钥发送给任何希望与我们交换加密数据的人。使用公钥，我们只能加密有限大小的数据。通信伙伴使用我们的公钥加密数据，然后将加密的数据发送给我们。接着，我们用私钥解密数据。这是非对称加密。
          
          <br /><br /><i>秘钥：</i> 我们使用公钥和私钥来交换秘钥。通常随机生成秘钥。一旦使用非对称加密与通信伙伴交换了秘钥，我们就可以在两端都使用这个秘钥加密数据了。这是对称加密。

        
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>如
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing2.shtml">清单 2</a> 中所示，这个实现只支持整个文件的加密。 
        
        <code>EncryptCompleteXmlFile ()</code> 方法将通过按序列调用下列方法完成这个任务：
      
      </p>
		<ol>
				<li>
						<code>GetEncryptedDataDoc()</code> 返回 
          
          <code>EncryptedData</code> 类（ 
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing12.shtml">清单 12</a> ）的对象。它包含 
          
          <code>EncryptedData</code> 元素的结构。
        
        </li>
				<li>
						<code>GetEncryptionMethodDoc()</code> 返回 Document 对象，该对象包含对应于 
          
          <code>EncryptionMethod</code> 元素的 XML 结构。 
          
          <code>GetEncryptionMethodDoc()</code> 使用 
          
          <code>EncryptionMethod</code> 类（ 
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing13.shtml">清单 13</a>）来创建 XML。
        
        </li>
				<li>
						<code>GetKeyInfoDoc()</code> 返回 
          
          <code>Document</code> 对象，该对象包含对应于 KeyInfo 元素的 XML 结构。 
          
          <code>GetKeyInfoDoc()</code> 使用 
          
          <code>GenericKeyInfo</code> 类（ 
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing14.shtml">清单 14</a> ）的对象来创建 XML。这个类仅提供最小的必需功能（对 
          
          <code>KeyName</code> 和 
          
          <code>KeyValue</code> 元素的支持），您将通过对 
          
          <code>GenericKeyInfo</code> 类的继承来提供完整的功能，其中包含对 X509 证书、PGP 数据等的支持。
        
        </li>
				<li>
						<code>ReadFile()</code> 取得我们希望加密的数据（整个 XML 文件）。
        
        </li>
				<li>
						<code>GetEncryptedData()</code> 暂时不做任何事情。我们将在本文的下一部分实现这个方法。它应该创建在步骤 4 中取得的 XML 数据的加密格式。在上一节（Java 密码体系结构）中，我们已经简要地讨论了我们的加密策略。
        
        </li>
				<li>
						<code>GetCipherDataDoc()</code> 将加密数据作为参数，然后返回包含 
          
          <code>CipherData</code> 元素的 Document 对象。 
          
          <code>GetCipherDataDoc()</code> 使用 
          
          <code>CipherData</code> 类（ 
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing12.shtml">清单 12</a>）的对象来创建 XML。
        
        </li>
				<li>最后，三次调用 
          
          <code>EncryptedData</code> （ 
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing15.shtml">清单 15</a> ）对象的 
          
          <code>addChild()</code> 方法，该方法将获得步骤 2、3 和 6 的 Document 对象，然后将它们添加到 
          
          <code>&lt;EncryptedData&gt;</code> 结构，这是它们所有对象的父类。
        
        </li>
				<li>
						<code>SaveEncryptedFile()</code> 保存完整的 XML 加密文件。
        
        </li>
		</ol>
		<p>
				<code>AlgoNames</code> （ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing16.shtml">清单 16</a>）是一个只指定 XML 加密所需要的名称空间声明的助手类。
      
      </p>
		<p>
				<code>XmlEncryption</code> 类（ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a>）也可以作为服务器端组件使用。在本系列的下一部分中，我们将演示它在独立应用程序中以及在服务器端应用程序中的使用。
      
      </p>
		<p>我们已开发的这组类只执行基于 DOM 的 XML 创建。我们还需要实现密码功能。现在我们将尝试形成一个用于密码支持的策略。出于这个目的，我们需要研究 Java 密码体系结构（Java Cryptographic Architecture(JCA)）。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">Java 密码体系结构（JCA）</span>
				</a>
		</p>
		<p>

Java 提供对密码术的完整支持。出于这个目的，J2SE 中有几个包，它们涵盖了安全性体系结构的主要特性，如访问控制、签名、证书、密钥对、密钥存储和消息摘要等。</p>
		<p>JCA 设计的主要原理是将密码概念从算法实现中分离出来，以便不同的供应商可以在 JCA 框架内提供他们的工具。</p>
		<p>
				<a name="N103BF">
						<span class="smalltitle">JCA 引擎类</span>
				</a>
		</p>
		<p>

JCA 定义了一系列引擎（Engine）类，其中每个引擎提供一种密码功能。例如，MD（消息摘要）算法有几种不同的标准。这些标准的实现各不相同，但在引擎 API 级别，它们都是相同的。不同的供应商可以自由地提供特定算法的实现。</p>
		<p>
				<a name="N103C8">
						<span class="smalltitle">Java 密码扩展（JCE）</span>
				</a>
		</p>
		<p>
所有独立（第三方）供应商的密码算法实现都称为 Java 密码扩展（Java Cryptographic Extension
(JCE)）。Sun Microsystems 也提供了 JCE 的一种实现。无论何时使用 JCE，都必需将它和 JCA
一起配置。为此，我们需要执行如下操作：</p>
		<p>1. 添加 jar 文件的地址以在 
        
        <code>CLASSPATH</code> 环境变量中配置供应商（将所有 JCE 实现称为供应商）。
      
      </p>
		<p>2. 通过编辑 java.security 文件，在您认可的供应商列表中配置供应商。这个文件位于 JavaHome/jre/lib/security 文件夹。下列是指定优先级的语法： 
        
        <code>security.provider.&lt;n&gt;=&lt;masterClassName&gt;</code> 。这里 n 是优先级号（1、2、3 等等）。 
        
        <code>MasterClassName</code> 是引擎类将为特定算法实现调用的主类的名称。供应商文档将指定其主类名称。例如，考虑 java.security 文件中的下列项：
      
      </p>
		<ul>
				<li>
						<code>security.provider.1=sun.security.provider.Sun</code>
				</li>
				<li>
						<code>security.provider.2=com.sun.rsajca.Provider</code>
				</li>
				<li>
						<code>security.provider.3=com.sun.net.ssl.internal.ssl.Provider</code>
				</li>
		</ul>
		<p>这些项意味着引擎类将按上面提到的顺序搜索任何算法实现。它将执行最先找到的实现。完成这些简单步骤之后，我们完全准备好开始在 XML 加密应用程序中使用 JCA/JCE。</p>
		<p>
				<a name="N103FE">
						<span class="smalltitle">在我们的 XML 加密实现中使用 JCA 和 JCE</span>
				</a>
		</p>
		<p>
封装器类 
        
        <code>XmlEncryption</code> （ 
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/listing11.shtml">清单 11</a> ）中的 
        
        <code>GetEncryptedData()</code>
函数是处理所有与 JCA/JCE 相关问题的所在。目前，这个方法仅返回字符串“This is Cipher Data”。我们还没有编写与
JCA/JCE 相关的类。这个方法获得未加密数据，然后将它作为加密字符串返回。在编写了用于 JCA/JCE
的封装器类之后，我们将在这个方法中处理所有与算法和密钥相关的问题。 </p>
		<p>
				<b>下一次：</b>在这一系列文章的下一部分中，我们将讨论并实现密码术的细节。我们将演示加密和解密类的工作方式以及它们使用解析逻辑的交互，并展示 Web 服务中 XML 加密的应用程序。
      
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-encrypt/index.html">英文原文</a>.
        
        <br /><br /></li>
				<li>请访问 W3C 以了解关于
          
          <a href="http://www.w3.org/TR/xml-encryption-req">XML Encryption Requirements</a>和
          
          <a href="http://www.w3.org/TR/xmlenc-core/">XML Encryption Processing and Syntax</a>的正式细节。
        
        <br /><br /></li>
				<li>请到
          
          <a href="http://www.oasis-open.org/cover/xmlAndEncryption.html">OASIS/Robin Cover 的 XML Cover Pages</a>查阅关于 XML 加密的新闻。
        
        <br /><br /></li>
				<li>
可到 alphaWorks 下载 
          
          <a href="http://www.alphaworks.ibm.com/tech/xmlsecuritysuite">IBM XML 加密工具箱</a>。
        
        <br /><br /></li>
				<li>
						<a href="http://www.baltimore.com/keytools/xml/index.html">KeyTools XML</a>是另一个来自 Baltimore 的安全性工具。
        
        <br /><br /></li>
				<li>请到
          
          <a href="http://jcp.org/jsr/detail/106.jsp">SUN 关于 XML 加密的社区过程（community process）</a>上查阅正在发生的事情。
        
        <br /><br /></li>
				<li>我们在本文中提到了 XPath。这里有一段
          
          <a href="http://www.oreilly.com/catalog/xmlnut/chapter/ch09.html">关于 XPath 的文章</a>，该文章来自 O'Reilly 的 XML 书籍
          
          <i>XML in a Nutshell</i>。
        
        <br /><br /></li>
				<li>我们在本文中提到了 IANA。请访问
          
          <a href="http://www.isi.edu/in-notes/iana/assignments/media-types/media-types">IANA 网站</a>以查阅流行数据格式的类型定义。
        
        <br /><br /></li>
				<li>当然，您将在
          
          <i>developerWorks</i><a href="http://www-128.ibm.com/developerworks/cn/security/index.shtml">安全性特殊主题专区</a>上找到大量与安全性相关的参考资料。
        
        <br /><br /></li>
				<li>
						<a href="http://www-3.ibm.com/security/services/index.shtml&amp;origin=x">IBM Security Services</a>能帮助您确定危险在哪里，然后设计一个安全性程序来解决它们。
        
        <br /><br /></li>
				<li>IBM
          
          <a href="http://www-4.ibm.com/software/ad/studioappdev/&amp;origin=x">WebSphere Studio Application Developer</a> 是用于构建、测试和部署 J2EE（TM）应用程序（包括从 DTD 和模式生成 XML 文档）的一个易于使用的集成开发环境。

        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-encrypt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>XML
顾问 Bilal Siddiqui 于 1995
年从巴基斯坦的拉合尔工程与技术大学获得电子工程学学位。然后他开始设计用于工业控制系统的软件解决方案。后来，他转向 XML 并运用他在 C++
方面的编程经验来构建基于 Web 和 WAP 的 XML 处理工具、服务器端解析解决方案和服务应用程序。您可以通过向 Bilal
发电子邮件索取本文包含的代码文件的工作副本，他的电子邮箱是 <a href="mailto:wap_monster@yahoo.com">wap_monster@yahoo.com</a> 。

      
      </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:31 <a href="http://www.blogjava.net/Vencent/articles/36718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧：使用 XML 和 XPointer::链接到文档的特定部分</title><link>http://www.blogjava.net/Vencent/articles/36719.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36719.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36719.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36719.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/#author">Brett McLaughlin</a>, Enhydra 策略顾问, Lutris Technologies<br /></p>
		<p>2001 年  7 月  01 日</p>
		<blockquote>本技巧文章介绍 XPointer，并讨论如何将它与 XLink 一起使用，以引用另一篇文档的特定部分。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>在本技巧文章中，我希望以拙作
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/index.shtml">使用 XML 和 XLink</a>
技巧一文中演示的为基础。XLink
虽然有用，但只允许引用另一篇文档。但在很多时候，您都要引用另一篇文档的特定
        
        <i>
部分</i>。要做到这点很简单。这有些类似于在 HTML
中使用命名锚点，可以通过在 XLink 上使用 XPointer
来完成。这两个被设计成协同工作的规范十分自然地互为基础。本技巧文章将演示如何在
XML 中使用 XPointer 来引用文档的某一部分。
      
      </p>
		<p>
要引用文档的一部分，首先要看一下将要链接到的
        
        <i>目标</i>文档。如果可以，请确保该文档使用 
        
        <code>id</code> 属性。这将使链接和定位更容易。“清单
1”显示了吉他工匠 Dana Bourgeois
制造的吉他清单，并包括每种类型的标识。
      
      </p>
		<blockquote>
				<b>注：</b>为清晰起见，将 Bourgeois 吉他的 URL 由实际
URL http://www.bourgeoisguitars.com 改成较短的 URL
http://bg.com。这使代码清单更易于阅读。如果要实际看到这篇文档，请将对
http://bg.com 的引用改回
http://www.bourgeoisguitars.com。
      
      </blockquote>
		<br />
		<a name="2">
				<b>清单 1. Bourgeois 吉他清单</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br />&lt;guitarTypes xmlns="http://bg.com"&gt;<br /> &lt;type model="OM" ID="OM"&gt;<br />  &lt;picture url="http://bg.com/images/vvOM.jpg" /&gt;<br />  &lt;description&gt;Small bodied orchestra model.&lt;/description&gt;<br /> &lt;/type&gt;<br /> &lt;type model="D" ID="D"&gt;<br />  &lt;picture<br />    url="http://bg.com/images/ricky%20skaggs%20model.jpg" /&gt;<br />  &lt;description&gt;<br />    Bluegrass powerhouse in a standard dreadnought shape.<br />  &lt;/description&gt;<br /> &lt;/type&gt;<br /> &lt;type model="slopeD" ID="slopeD"&gt;<br />  &lt;picture<br />    url="http://bg.com/images/slope%20d,%20custom%20version.jpg" /&gt;<br />  &lt;description&gt;<br />    Slope shouldered dreadnought, perfect for vocal accompaniment.<br />  &lt;/description&gt;<br /> &lt;/type&gt;<br />&lt;/guitarTypes&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>对于本技巧文章，假设此文档位于 
        
        <code>http://bg.com/guitars.xml</code> 。XPointer 不引用整篇文档 －
那没有多大用处，它允许您链接到文档的特定部分。还记得 XLink 文章中的 
        
        <code>xlink:href</code> 属性吗？为那个属性提供的值是 XLink
的目标。但是要引用该页面的一部分，可以向这些 URL 中添加一个井号 (#)
和一个 XPointer 表达式。例如，表达式 
        
        <code>xpointer(id("slopeD"))</code> 引用文档中带有 ID "slopeD"
的元素。因此，可以使用 
        
        <code>http://bg.com/guitars.xml#xpointer(id("slopeD"))</code> 
引用“清单 1”中所示的 XML，然后是那个文档中所描述的 Slope D
型号的吉他。很简单，是吗？下面为您显示我在 XLink
技巧文章中引入的描述吉他的 XML 文档修订版，它现在使用一些 XPointer
引用。
      
      </p>
		<br />
		<a name="2">
				<b>清单 2. 在 XML 文档中使用
XPointer</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br />&lt;guitars xmlns="http://www.newInstance.com/about/guitars"<br />         xmlns:xlink="http://www.w3.org/1999/xlink"&gt;<br /> &lt;guitar luthier="Bourgeois"<br />  xlink:type="simple"<br /> xlink:href=<br />    "http://bg.com/guitars.xml#xpointer(id('OM'))"&gt;<br />  &lt;description xlink:type="simple"<br />               xlink:href=<br />    "http://newInstance.com/guitar/bgOM/pics/bougOM_front_full.jpg"<br />               xlink:actuate="onLoad" xlink:show="embed"&gt;<br />   This is a real beauty in a small body. Although this is an OM, I<br />   use it for flatpicking bluegrass as well as for producing some<br />   beautiful fingerstyle sounds.<br />  &lt;/description&gt;<br /> &lt;/guitar&gt;<br /> &lt;guitar luthier="Bourgeois"<br />  xlink:type="simple"<br /> xlink:href=<br />    "http://bg.com/guitars.xml#xpointer(id('D'))"&gt;<br />  &lt;descripton xlink:type="simple"<br />               xlink:href=<br />    "http://newInstance.com/guitar/bgD150/pics/bougd150_con_rim2.jpg"<br />               xlink:actuate="onLoad" xlink:show="embed"&gt;<br />   Here's the holy grail in process. Dana Bourgeois is building this<br />   Brazilian rosewood and adirondack bluegrass monster right now.<br />   You'll know it's finished when you hear a run and your windows<br />   shatter!<br />  &lt;/description&gt;<br /> &lt;/guitar&gt;<br />&lt;/guitars&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>现在，我的文档可以引用 Dana Bourgeois 保留的有关他的吉他的 XML
内容。即便他更改了此信息，我也无需担心；我的文档始终是最新的，因为它只链接到他更新过的信息。请注意，在上述代码中，必须使用 
        
        <code>&amp;</code> 而不是“和”符号（“&amp;”）来转义 XPointer
表达式中的引号。这会使连接的 URL 相当长，而长 URL
可以导致讨厌的输入错误。对于我们来说幸运的是，在链接到带有 ID
标记的元素时，XPointer 允许使用方便的简写形式。除了使用 
        
        <code>xpointer(id("D"))</code> 形式，您还可以使用 ID
的值来定位。在这种情况下，那将是 "D"。这样，我就可以将“清单
2”中的文档简化成“清单
3”中所示的文档，该文档中的连接语法更清晰。
      
      </p>
		<br />
		<a name="2">
				<b>清单 3. 使用 ID 链接的 XPointer
简写形式</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;?xml version="1.0"?&gt;<br /><br />&lt;guitars xmlns="http://www.newInstance.com/about/guitars"<br />         xmlns:xlink="http://www.w3.org/1999/xlink"&gt;<br /> &lt;guitar luthier="Bourgeois"<br />          xlink:type="simple"<br />         xlink:href="http://bg.com/guitars.xml#OM"&gt;<br />  &lt;descripton xlink:type="simple"<br />               xlink:href="<br />    http://newInstance.com/guitar/bgOM/pics/bougOM_front_full.jpg"<br />               xlink:actuate="onLoad" xlink:show="embed"&gt;<br />   This is a real beauty in a small body. Although this is an OM, I<br />   use    it for flatpicking bluegrass as well as for producing some<br />   beautiful fingerstyle sounds.<br />  &lt;/description&gt;<br /> &lt;/guitar&gt;<br /> &lt;guitar luthier="Bourgeois"<br />          xlink:type="simple"<br />         xlink:href="http://bg.com/guitars.xml#D"&gt;<br />  &lt;descripton xlink:type="simple"<br />               xlink:href="<br />    http://newInstance.com/guitar/bgD150/pics/bougd150_con_rim2.jpg"<br />               xlink:actuate="onLoad" xlink:show="embed"&gt;<br />   Here's the holy grail in process. Dana Bourgeois is building this<br />   Brazilian rosewood and adirondack bluegrass monster right now.<br />   You'll know it's finished when you hear a run and your windows<br />   shatter!<br />  &lt;/description&gt;<br /> &lt;/guitar&gt;<br />&lt;/guitars&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
除了这种用简化的链接进行比较简单的列示之外，您还可以指向其它元素的
        
        <i>
相关</i>元素。举例来说，在
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/listing4.shtml">清单 4</a>
中，我将 
        
        <code>description</code> 元素改成指向 bourgeois.xml
文件中指定的图像。
      
      </p>
		<p>在“清单 4”中，可以看到第一步是在被引用文档中找到特定元素。那个元素用作附加到它之上的相关表达式的引用点。在本例中，指定了那个元素的子孙（由 
        
        <code>descendant</code> 关键字指定），在我们的示例中名为 "picture" 的那个元素。然后，该链接的最终目标是那个元素名为 "url" 的属性的值。我知道，这样说太费口舌，但如果循序渐进地做，就会相当简单。
      
      </p>
		<p>您应该注意到，我在
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/listing4.shtml">清单 4</a>
中
        
        <i>没有</i>使用上一节所谈论的 ID 链接的简写形式。那是因为使用那种
ID 链接形式只允许直接链接；不使用 ID
链接的较长形式，就无法进行任何进一步的链接（例如“清单
4”中的子代遍历引用）。
      
      </p>
		<p>有关 XPointer 提供的多种不同选项的更多信息，请查看联机的
XPointer 规范（请参阅
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/#resources">参考资料</a>）。有关那个看起来很奇怪的链接语法的完整表述，可以查看
XPath；也可以联机查看 XPath 规范（请参阅
        
        <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/#resources">参考资料</a>）。
      
      </p>
		<p>我知道，这只是一篇介绍，但现在，您可以告诉您的朋友和家人：关于
XPointer、XLink 和
XPath，您比他们多了解多少！试用它、阅读规范，并关注即将出现的对这些与
XML 有关的规范的浏览器支持。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          
          <a href="http://www.ibm.com/developerworks/library/x-tipxpt/index.html">英文原文</a>.
        
        <br /><br /></li>
				<li>通过单击本文顶部或底部的
          
          <b>讨论</b>来参加本文的
          
          <a href="javascript:void forumWindow()">论坛</a>。
        
        <br /><br /></li>
				<li>阅读我的
          
          <a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-xlink/index.shtml">使用 XML 和 XLink</a>
技巧文章。
        
        <br /><br /></li>
				<li>查看
          
          <a href="http://www.w3.org/TR/xptr">XPointer
规范</a>。
        
        <br /><br /></li>
				<li>还可以联机查看
          
          <a href="http://www.w3.org/TR/xpath">XPath
规范</a>。
        
        <br /><br /></li>
				<li>在
          
          <a href="http://www.ibm.com/developerworks/xml?article=xmlr">developerWorks
XML 专区</a>中查找更多 XML 资源。
        
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/tips/x-tipxpt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="Brett McLaughlin" src="http://www-128.ibm.com/developerworks/cn/i/p-brett.jpg" align="left" height="80" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>Brett
McLaughlin（
        
        <a href="mailto:brett@newinstance.com">brett@newinstance.com</a>）是
Lutris Technologies 的 Enhydra
策略顾问，专长于分布式系统体系结构方面。他是 
        
        <i>Java and
XML</i>（O'Reilly）的作者。他参与了如 Java Servlet、Enterprise
JavaBean 技术、XML 和商家对商家应用程序等技术的研究。他与 Jason
Hunter 一起发起了 JDOM 项目，该项目为从 Java 应用程序中操纵 XML
提供了一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB
服务器的活跃开发人员以及 Apache Turbine 项目的共同创始人之一。
      
      </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:31 <a href="http://www.blogjava.net/Vencent/articles/36719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽取界面 (II)：对基本框架的若干扩展</title><link>http://www.blogjava.net/Vencent/articles/36717.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36717.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36717.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36717.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#author">Martin Gerlach</a>, 软件工程师, IBM Almaden 研究中心<br /></p>
		<p>2001 年  3 月  01 日</p>
		<blockquote>
				<i>本
文是作者去年 12 月关于 Web应用前端的那篇文章的续篇。本文介绍对 XML 数据和
XSL样式表基本框架的若干扩展，并将集中讨论应用的后端问题，包括国家语言支持(NLS)、视图结构强化和性能问题。上一篇文章介绍了利用 XML
和 XSLT构建 Web 应用的基本结构，本文介绍在使 Web应用在线运行之前所要做的准备工作。</i>
		</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
本文是系列文章“抽取界面”的第二篇。为了理解本文出现的概念，您不妨读一下第一篇文章， 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract/index.shtml">用 XML 和 XSL 构建有良好适应性的
Web
应用前端</a> ，该文讨论了完成此应用所必须的步骤。研究此应用样例的代码也能帮助您理解本文的概念。与第一篇文章一样，本文仍假定您已经熟悉基于
HTTP 协议和 HTTP 请求-响应机制的 Web 应用，同时也假定您曾经用
HTML、甚或 JavaScript 制作过网页。您应懂得 Java
编程语言，知道如何将 Java servlet 用作 Web 应用的访问点。
      </p>
		<p>
				<a name="1">
						<span class="atitle">已讨论过的内容</span>
				</a>
		</p>
		<p>在第一篇文章中，我介绍了 WebCal，它是一个简单的、基于 Web
的日历应用程序，能够为多个用户维护日历。通过这个应用程序，我演示了如何建立一个不仅能够通过标准
Web 浏览器访问、而且能通过可理解其他格式 ― 例如，WML
和用于语音接口的 VoiceXML ― 的浏览器访问的复杂 Web
应用。那篇文章分三部分讨论上述内容：</p>
		<ul>
				<li>对 XML 数据和 XSL 样式表结构化的一种方法</li>
				<li>服务器端的 XSL 转换 ― 用 XSLT 和 XPath 生成输出结果</li>
				<li>用 XSLT 构建 HTML 表单</li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">本文的内容</span>
				</a>
		</p>
		<p>
本文也将讨论三个主题，但这三个主题并不像第一篇文章讨论的三个步骤那样互相紧密关联，即它们相互之间不存在特定顺序。但每个主题在使
Web 应用在线运行之前的准备工作中都占有重要一席。这三个主题是：</p>
		<ul>
				<li>国家语言支持
(NLS)：如果面对许多国家的客户，您将希望提供一个多语言用户界面。您希望系统自动选择用户的首选语言并用该语言显示与
NLS 相关的信息。</li>
				<li>强化应用结构: 通常，Web 应用由许多“视图”组成。在 WebCal
应用样例中，视图或者显示一个用户引发的各种事件，或者显示新事件的输入表单。登录页和注册页也是视图。视图可以按不同的标准分组。在
WebCal
中，日视图、周视图和月视图都可以看作是日历视图，它们共享同一个子导航
―
用于输入新事件的链接。将视图按功能分组，开发人员就可以避免重复编码，从而减轻应用开发工作量，减少错误率。</li>
				<li>提高性能: 您希望自己的 Web
应用能够很快作出响应，用户也不希望点击一个链接后等很长时间。此时，您就会想到使用缓存机制，以更快、更可靠地为用户提供服务。</li>
		</ul>
		<p>我们先从国家语言支持 (NLS)
着手。如果您对此已经很熟悉，则可转到下一主题， 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#4">强化应用结构。</a></p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">国家语言支持
(NLS)</span>
				</a>
		</p>
		<p>为应用赋予多语言用户界面的过程 ― 即加入国家语言支持的过程 ―
称为“国际化”。国际化是 Java 程序的核心问题，因为 Java
通常被设计在任何地方、在任何平台上、（尤为重要的是）以任何人的语言运行。Java
语言有一系列内建的国际化功能，在 
        <i>developerWorks</i>
上有这方面的文章。

      </p>
		<p>一般而言，关于 NLS 有两方面的内容：</p>
		<ul>
				<li>识别客户机的首选语言</li>
				<li>在应用中的任何地方访问针对该语言提供的资源</li>
		</ul>
		<p>
				<b>识别客户机的首选语言</b>
				<br />
就 WebCal 而言（其他 Web
应用也一样），客户机可从世界各地方访问该系统。理想情况下，我们期望以客户机的首选语言提供用户界面。主要有两种方法可用来完成这一任务。
      </p>
		<p>从 HTTP 请求的 
        <code>Accept-Language</code> 标头中可获得客户机浏览器的语言代码（例如, en-us 和 de）。该标头列出了浏览器所支持的语言，如清单 1 所示。清单中的第一个值即被作为浏览器的（或者说是客户机的）首选语言。
      </p>
		<br />
		<a name="N100AA">
				<b>清单 1: HTTP Accept-Language 标头示例</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />    Accept-Language: en_us;en_ca;de;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing2.shtml">清单 2</a>
中，首选语言是用 
        <code>HttpServletRequest.getHeader("Accept-Language")</code> 
和基本的 Java 字符串操作提取的。
      </p>
		<p>另一种方法是，我们可以让 Web
应用的用户自行选择首选语言，然后根据用户的选择生成语言代码。您所要做的就是创建一个网页，其中含有供用户选择首选语言的表单。具体实施细则请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract/index.shtml">第一篇文章</a> 的步骤
3，“使用表单”。
      </p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N100C8">
																				<b>用户首选项与浏览器的语言环境</b>
																		</a>
																		<br />
																		<p>通过让用户选择将浏览器的语言环境用作他的语言（或语言环境）首选项，您就可以将用户首选项和浏览器输入结合起来使用。这也适用于其它类似的首选项，例如
12 小时制和 24 小时制。</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>我们为什么要研究 HTTP 标头或用户首选项的解析过程呢？在独立的国际化 Java 应用程序中，语言代码是通过查询系统获得的。在查询过程中， 
        <code>ResourceBundle</code> 类负责为系统语言代码查找正确的资源。但是，在我们的应用样例中，用户的语言（客户机语言）完全与应用所在系统的语言（服务器语言）无关，我们不得不用一个固定的语言代码代表用户的首选语言。
      </p>
		<p>
				<b>访问针对客户机首选语言提供的资源</b>
				<br />
一旦成功地获得正确的客户机语言代码,我们就需要使用固定的语言代码查找翻译文本。 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing3.shtml">清单 3</a> 说明了如何使用清单 2
中的 Locale 对象 locale 完成此项工作。
      </p>
		<p>在第一篇文章中，我介绍过一个基于 XML/XSL Web
应用框架的应用样例。在该框架中，我们需要区分需要 NLS
的两个不同场所：在 Java 代码中和在 XSL 样式表中。</p>
		<p>
				<b>Java 中的 NLS</b>
				<br />
必须在 Java 中完成待显示文本的 NLS 查找工作。就此处的情形而言，XML
数据可以包含待显示文本 ― 也就是通过 XSL 转换将 XML
数据复制为客户机所要求的格式。在这种情况下，可以使用 
        <code>ResourceBundle</code> 类（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing3.shtml">清单
3</a> ）来查找已翻译好的字符串常量，并将国际化字符串置入 XML
数据中。
      </p>
		<p>
				<b>XSL 中的 NLS</b>
				<br />
有些用户界面可能需要使用特殊的输出格式。例如，我们或许不希望在 Web
浏览器上和 WAP 电话上显示完全一样的输入域标签。对 WAP
电话而言，我们可能希望使用很短的标签，而在 Web
浏览器中，标签就可以长一些，还可以加入帮助内容轮翻显示等功能。在这种情况下，同一个视图的适用于不同格式的
XSL 样式表就可以包含不同的文本。在 WebCal 的 XSL
样式表中，我使用了许多字符串常量： 
        <code>Login</code> 、 
        <code>Username</code> 、 
        <code>
Password</code> 、 
        <code>Day</code> 、 
        <code>Week</code> 、 
        <code>Month</code> 、本周的每一天，等等。为了将它们国际化，一种方案是实现
XSL 中的资源包查找，另一种方案是在 XML 生成期间（即在 Java
中）完成查找，同时把所需的全部翻译内容添加到 XML
文档中供样式表使用。
      </p>
		<p>利用我在 WebCal 中使用过的 James Clark 的 XSL 处理器
XT（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#resources">参考资源</a> ），上面的两种方案都能实现。XT
允许回调在 XSL 处理期间访问处于 classpath
中的任何类的静态方法。
      </p>
		<p>设想我们在 com.ibm.almaden.webcal.WebCalUtils
中有一个静态查找方法，如 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing4.shtml">清单
4</a>所示。
      </p>
		<p>如果能从 XML 中获得语言代码（也就是，如果 Java 代码已在 XML
生成期间加入语言代码），您就可以从您的式样表中调用此方法。另一方面，假如语言代码已经被作为根元素 
        <code>webcal</code> 的 
        <code>lang</code> 属性加入 XML
数据中，则您也可以使用 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing5.shtml">清单
5</a>中重点介绍的 XSL 指令完成查找工作。
      </p>
		<p>为保证此代码样例顺利工作， 
        <code>lsLookUp()</code> （ 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing4.shtml">请参阅清单
4</a> ）使用的资源包必须在每个语言文件中定义关键字 SUNDAY、MONDAY
等等。尽管可以使用非字符串的数据类型在 XSL 和静态 Java
方法之间传递参数，但我建议使用字符串传递，以避免过多的转换开销。
      </p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<p>国际化的其他方面
除了语言之外，关于 NLS
和国际化还有许多问题。如果您还计划使用时间、日期、或者货币符号，您可能需要使用更灵活的显示方式和输入域。
</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>对于从 XSL
中调用的方法，存在过载能力方面的一些限制。详细信息请参阅 XT
文档（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#resources">参考资源</a>)。与在 XML
生成期间完成查找并在 XSL 处理之前将翻译好的字符串包括在 XML
数据中的方法相比较，使用进入 Java
的回调不会产生相同的性能结果。
      </p>
		<p>
				<b>NLS 小结</b>
				<br />
这一部分详细分析了国家语言支持问题，说明了如何确定用户的首选语言以及如何用
Java 或 XSL 样式表针对这种首选语言执行 NLS 查找。
      </p>
		<p>下面讲解如何改进应用结构，以使代码更易于维护和扩展。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">强化应用结构</span>
				</a>
		</p>
		<p>仔细观察 WebCal
应用样例，您会注意到所有的日历视图不仅共享相同的主导航和通用链接（Home
和 Logout），而且还共享包含新事件（New
Event）链接的相同子导航条。第一篇文章介绍应用样例时，我认为每个视图的子导航是互不相同的。</p>
		<p>在复杂的 Web 应用中，您或许需要将视图按功能分组 ―
例如，分为布局和导航 ―
这样，您就不必一遍又一遍地为每个视图进行定义，而且在需要变动时您只需修改一段代码，无需再修改组中每个视图的样式表。这一点在
WebCal 应用样例中没有使用，不过分组方法基本上有二种：</p>
		<ul>
				<li>在导航元数据中定义组</li>
				<li>使用XSL 层叠样式表</li>
		</ul>
		<p>
				<b>在导航元数据中定义组 (WebCal:
/web/&lt;format&gt;/navigation.xml)</b>
				<br />
观察 web/html/navigation.xml 中的 navigation.xml
文件，可以发现日历视图的以下 xml 代码：
      </p>
		<br />
		<a name="N10175">
				<b>清单 6: 未分组的视图</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;actions&gt;<br />...<br />  &lt;action name="ShowDay"&gt;<br />    &lt;sub-nav&gt;<br />      &lt;link type="internal" text="New Event" href="ShowNewEvent"&gt;<br />        &lt;pass-param name="date"/&gt;<br />      &lt;/link&gt;<br />    &lt;/sub-nav&gt;<br />  &lt;/action&gt;<br />  &lt;action name="ShowWeek"&gt;<br />    &lt;sub-nav&gt;<br />      &lt;link type="internal" text="New Event" href="ShowNewEvent"&gt;<br />    &lt;pass-param name="date"/&gt;<br />      &lt;/link&gt;<br />    &lt;/sub-nav&gt;<br />  &lt;/action&gt;<br />  &lt;action name="ShowMonth"&gt;<br />    &lt;sub-nav&gt;<br />      &lt;link type="internal" text="New Event" href="ShowNewEvent"&gt;<br />        &lt;pass-param name="date"/&gt;<br />      &lt;/link&gt;<br />    &lt;/sub-nav&gt;<br />  &lt;/action&gt;<br />  ...<br />&lt;/actions&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>显然，这种结构难于维护：如果要为三个日历视图添加一个新的子导航链接，就必须在所有三个 
        <code>&lt;action&gt;</code> 元素中添加。如清单 7 所示，通过分组的视图维护 XML 不是更容易吗？
      </p>
		<br />
		<a name="N10186">
				<b>清单 7: 分组视图</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;actions&gt;<br />  ...<br />  &lt;group name="calendar"&gt;<br />    &lt;sub-nav&gt;<br />      &lt;link type="internal" text="New Event" href="ShowNewEvent"&gt;<br />        &lt;pass-param name="date"/&gt;<br />      &lt;/link&gt;<br />    &lt;/sub-nav&gt;<br />    &lt;action name="ShowDay"&gt;<br />      &lt;sub-nav/&gt; &lt;!-- no view specific sub navigation --&gt;<br />    &lt;/action&gt;<br />    &lt;action name="ShowWeek"&gt;<br />      &lt;sub-nav/&gt; &lt;!-- no view specific sub navigation --&gt;<br />    &lt;/action&gt;<br />    &lt;action name="ShowMonth"&gt;<br />      &lt;sub-nav/&gt; &lt;!-- no view specific sub navigation --&gt;<br />    &lt;/action&gt;<br />  &lt;/group&gt;<br />  ...<br />&lt;/actions&gt;</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这样一来，您就可以将新的子导航链接添加到 
        <code>&lt;group&gt;</code> 节点的 
        <code>&lt;sub-nav&gt;</code> 
节点中，它就会在所有三个日历视图中显示出来。由于只需要在一个地方定义该链接，从而提高了结构的可维护性。对本例而言似乎，这似乎没有带来什么好处，但实际的
Web 应用要比 WebCal 复杂得多。
      </p>
		<p>为简单起见，我们假定分组以后再没有未分组的视图。这意味着
navigation.xml 文件中的 
        <code>&lt;actions&gt;</code> 元素再没有 
        <code>&lt;action&gt;</code> 子元素。 
        <code>&lt;actions&gt;</code> 
元素只有 
        <code>&lt;group&gt;</code> 子元素，后者至少再带有一个 
        <code>&lt;action&gt;</code> 子元素。（通常，这表示在 
        <code>&lt;group&gt;</code> 节点之外不会有 
        <code>&lt;action&gt;</code> ）。同样，负责为视图生成 XML 的 Java
代码中也要包括包含此视图（或者 action）的 XML 元素 ―
例如， 
        <code>&lt;groupname&gt;calendar&lt;/groupname&gt;</code> ，如清单
8 所示。
      </p>
		<br />
		<a name="N101BE">
				<b>清单 8: 视图 XML</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;webcal&gt;<br />  &lt;http-params&gt;<br />    &lt;param name="action" value="ShowWeek"/&gt;<br />    &lt;param name="date" value="2001-02-11"/&gt;<br />  &lt;/http-params&gt;<br /><br />        &lt;groupname&gt;calendar&lt;/groupname&gt;<br />  &lt;user&gt;...&lt;/user&gt;<br />  &lt;navigation&gt; ... &lt;/navigation&gt; &lt;!-- groups and actions as shown above --&gt;<br />  &lt;now date="2000-11-07T15:30"/&gt;<br />  &lt;week date="2001-02-11" previous="2001-02-04" next="2001-02-18"&gt;<br />    &lt;day date="2001-02-11"/&gt;<br />    ...<br />  &lt;/week&gt;<br />&lt;/webcal&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在第一篇文章的清单 26 中，我介绍过一段为视图创建子导航链接的 XSL
代码。 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing9.shtml">清单9</a>
是一段用视图分组创建子导航的 XSL 代码，它说明了如何从 XML
数据中获取当前的 action 和 group （如清单 8
所示）。（在该清单中， 
        <i>action</i> 代表 HTTP 的 action
参数在服务器上触发的一些具体操作。每个这样的操作都生成一个视图，并会显示这个显示。）
      </p>
		<p>在 WebCal
中，子导航是区分视图和组的唯一导航标准，但更复杂的应用可能会有若干个由分组机制处理的参数。另外一种分组机制要使用
XSL 层叠样式表。</p>
		<p>
				<b>XSL 层叠样式表</b>
				<br />
				<code>&lt;xsl:include&gt;</code> 
除了在导航元数据中完成分组外，还可以在样式表中用于控制主面板 (main
panel)（例如， 
        <code>WeekViewMain.xsl</code> ）。这样，某个组的视图样式表就会包括该组中所有视图使用的
XSL 模板。这就好比许多 Java
方法调用一个工具方法。第一篇文章介绍了如何由 
        <code>frame.xsl</code> 
定义的总框架和与具体视图相关的主面板来构建所有视图。在同组视图的总面板中，可以包括一个与具体组相关的“内层框架”样式表,它产生组中所有视图共同具有的那些响应。最后，内层框架再调用与具体视图相关的样式表，就像在 
        <code>frame.xsl</code> 中调用主模板那样。这种“层叠”机制如图 1
所示。
      </p>
		<br />
		<a name="N101F3">
				<b>图 1：子框架

</b>
		</a>
		<br />
		<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/casc_xsl.gif" height="473" width="547" />
		<br />
		<p>“层叠”机制能应用到任何一层，从而形成组嵌套。</p>
		<p>
				<b>小结：强化应用结构</b>
				<br />
本部分介绍了如何对应用提供的视图进行分组，以便于开发和更改管理。我推荐了两种实现分组的方法：
      </p>
		<ul>
				<li>允许在 XML 元数据中定义组 ― 例如，在导航信息中。</li>
				<li>使用 XSL 层叠样式表。</li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">性能：缓存探讨</span>
				</a>
		</p>
		<p> 现在我们研究一下我们的 Web 应用的性能。有多种方法可用来提高类似
WebCal 样例那样的原始应用的性能,最强有力的方法之一便是缓存。</p>
		<p>生成 XML、然后再用 XSLT
将它转换成客户机首选格式的过程涉及许多步骤。根据对系统需求的不同，可以在几个不同的起点引入缓存。基本而言，可以通过对转换的中间结果进行缓存来提高性能，此处可以使用
URL 请求（就是 action 名和所有的 HTTP
参数）、用户名和预期格式的组合，并将该组合用作缓存的散列键。</p>
		<p>存在三种缓存方法，它们可以结合使用：</p>
		<ul>
				<li>缓存 XSL 样式表</li>
				<li>缓存 XML</li>
				<li>缓存响应，表示 XML 已经用 XSL
样式表转换成了用户的首选格式。</li>
		</ul>
		<p>下面将对三种方法逐一深入探讨。</p>
		<p>
				<b>缓存 XSL 样式表</b>
				<br />
观察第一篇文章中的 XSL 转换代码（清单
16），可以发现每次将对一个请求的 XML
响应（或者新产生的，或者从缓存中获取的）转换为客户机的首选格式时，在实际转换发生之前总要完成以下两个步聚：
      </p>
		<ul>
				<li>创建 XSLProcessor 类的一个实例</li>
				<li>上面创建的处理器对转换所需的样式表进行分析。</li>
		</ul>
		<p>
				<code>XSLProcessor</code> 
实例可以在样式表分析完成后进行缓存，以备后用。由于处理器与请求者和参数无关，缓存散列键就可以仅由
HTTP 的 
        <code>action</code> 
参数值组成。该参数决定了要显示的视图和客户机的首选格式（例如
HTML）。这样，当用户请求某个视图后，缓存的处理器实例就可用来处理其他用户对此视图的请求。
      </p>
		<p>此方案的好处在于避免了每次请求视图时都要实例化一个 
        <code>XSLProcessor</code> 实例并进行样式表分析。这就意味着一个缓存的处理器可以被所有用户使用，效率很高。
      </p>
		<p>此方案可在 WebCal 的 
        <code>WebCalUtilities.transform(...)</code> 
方法中实现，如 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing10.shtml">清单
10</a> 所示。它将样式表 URI 作为散列键，其中包含 action
的名称和格式（URI
的格式如下： 
        <code>http://localhost/webcal/&lt;format&gt;/&lt;actioname&gt;.xsl</code> ）。
      </p>
		<p>
				<b>缓存 XML</b>
				<br />
WebCal 已经实现了一项简单的性能优化：navigation.xml
文件或用于其他格式的文件在 servlet
首次被加载并初始化时就同时被读入。产生的导航 XML
文档碎片先接格式缓存，然后在响应客户机请求时添加到所生成的视图
XML中。
      </p>
		<p>下一步是缓存在响应请求时创建的完整 XML
文档。为此，您只需使用一个 hashtable 或者一个类似的集合来存储 XML
文档。这样，每当用户返回到他们已经访问过的页面时，URL
请求总会或多或少有些相似之处 ― 至少相关的参数、用户名、action
名称、期望格式、视图特定的参数将会是相同的。如果用这些参数计算散列键，则很容易在缓存中找到同一视图的旧版本。该方法的好处在于不用频繁地访问后端应用（数据库、EJB
等）。</p>
		<p>该方法可以在 WebCal 的 
        <code>ShowAction.displayResult()</code> 
方法中实现。但我更喜欢下面的方法，尽管相似却更有效。其代码样例参见清单

        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing11.shtml">11</a>到
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing13.shtml">13</a>。
      </p>
		<p>
				<b>缓存响应</b>
				<br />
这一方法是刚介绍的 XML
缓存和样式表缓存的结合。缓存响应的优势是，如果之前曾有过同样的请求并且结果仍存在缓存中，那么就可以在很短的时间内直接从服务器上得到响应。它的工作机制与上面介绍的
XML
缓存方法很相似，只是在这里整个转换过程的最后结果都被缓存，使用的散列键与上面的相同。此方法的优点是访问后端的频率较低， 
        <i>
并且</i>不必反复分析样式表。
      </p>
		<p>此方法可以在 WebCal 的 
        <code>ShowAction.displayResult()</code> 
方法中实现,如清单 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing11.shtml">11</a> 到

        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing13.shtml">13</a>所示。
      </p>
		<p>为了让
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing11.shtml">清单 11</a>
正常运行，必须对 
        <code>ShowAction.java</code> 或其超类 
        <code>Action.java</code> 作一定的修改，如清单 12 所示：
      </p>
		<br />
		<a name="code">
				<b>清单 12: 修改后的 Action 类 (在
Action.java 或 ShowAction.java 中)</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />
														<br />
														<i>在 Action.java ：</i>
														<br />         protected static Hashtable cache = new Hashtable();<br />...<br />// 字节数组的包装（内部类）<br />protected class CachedResponse <br />{<br />  public byte[] responseBytes;<br />  public CachedResponse(byte[] responseBytes)<br />  {<br />    this.responseBytes = responseBytes;<br />  }<br />} <br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>最后，执行 XSL
转换的方法还应返回转换的结果，以便将其保存在缓存中。我在此处选择 
        <code>byte[]</code> （字节数组）作为数据类型是因为它独立于任何具体的字符编码。 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/listing13.shtml">清单 13</a>
显示了必要的修改。
      </p>
		<p>
				<b>缺点：缓存清除和依赖性</b>
				<br />
利用缓存提高性能有几个缺点。每当一个用户通过 Web
应用接口作了某些更改时，XML
缓存或响应缓存必须执行相关性检查。从缓存中删除需要更新的页面。
      </p>
		<p>
处理此问题最简单的办法是为作出更改的用户清除缓存。但是，如果系统允许用户间交互
― 例如，数据共享、小组日历、会议邀请和调度变更 ―
则当仅有一个用户更改某些数据时，所有用户的缓存都要被清除。</p>
		<p>为了获得更高的效率，缓存还应当保存每个页面的相关性信息 ―
页面所依赖的那部分系统。例如，WebCal
中的星期视图依赖于用户登录的那一周所创建、修改和删除的事件。相关性信息及其它附加信息，例如比较缓存数据日期与后端（数据库）数据日期的时间戳，可以存储于 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#code">清单 12</a> 定义的 
        <code>CachedResponse</code> 
类中。
      </p>
		<p>正面评价：不必清除 XSL 处理器缓存。与样式表关联的 XSL
处理器可以一直使用到样式表改变为止，但样式表的更改一般不会在运行时发生。</p>
		<p>
				<b>不仅仅是缓存</b>
				<br />
缓存中的信息可用来分析用户行为，例如登录后通常进行什么操作。使用这些信息，可以预先生成页面并以动态链接方式提供给用户，也可只将预先生成的页面保存于缓存中，当客户机发出请求时即可快速访问。
      </p>
		<p>
				<b>性能：学有所获</b>
				<br />
本部分介绍了如何使用不同的缓存方法提高应用的性能：缓存 XSL
处理器实例，缓存 XML，以及缓存 XSL
转换的实际结果。缓存的内容可用于统计计算，这反过来又可用来预先生成用户在会话期间可能会请求的页面。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">小结</span>
				</a>
		</p>
		<p>在第一篇文章中，我介绍了使用 XML 和 XSL 转换创建可扩展 Web
应用的基础知识。本文接着介绍了如何添加一些高级功能。</p>
		<p>主要内容是：</p>
		<ul>
				<li>使用国家语言支持实现多语言全球访问</li>
				<li>强化应用结构，以方便维护、更改管理以及进一步的开发。</li>
				<li>缓存是如何提高性能的。</li>
		</ul>
		<p>要使 Web 应用更富有专业色彩并使它们能够随时在线运行，所有这些都是很重要的因素。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-abstract2/index.html">英文原文</a>.
        <br /><br /></li>
				<li>我在
          <i>developerWorks</i>
网站上关于“抽取界面”的第一篇文章： 
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract/index.shtml">用 XML 和 XSL 构建有良好适应性的
Web 应用前端。</a><br /><br /></li>
				<li>下载最新的和以前的
          <a href="http://java.sun.com/j2se/">Java
Development Kits（JDK）</a><br /><br /></li>
				<li>下载
          <a href="http://java.sun.com/products/servlet/">Java
Servlet Development Kit (JSDK)</a>。
        <br /><br /></li>
				<li>如果您希望将 WebSphere 用作 servlet 引擎，请访问 IBM 的
WebSphere 网页。也可以查看 WebSphere 上的 
          <a href="http://www-4.ibm.com/software/webservers/appserv/tutorial.html">servlet tutorial</a>。
        <br /><br /></li>
				<li>从IBM 的
          <i>alphaWorks</i>网站下载
          <a href="http://www.alphaworks.ibm.com/tech/xml4j/">XML4J</a>。
        <br /><br /></li>
				<li>在
          <i>developerWorks</i>网站上的教程“
          <a href="http://www-4.ibm.com/software/developerworks/education/xmljava/">XML Programming in Java</a> ”中学习更多的关于分析 XML 文件和创建
XML 文档的知识。
        <br /><br /></li>
				<li>从 James Clark 处下载
          <a href="http://www.jclark.com/xml/xt.html">XT</a> 用于 XSL
转换。
        <br /><br /></li>
				<li>阅读 James Clark 编辑的 XSLT 规范
          <a href="http://www.w3.org/TR/xslt">W3C Recommendation for
XSLT</a>。
        <br /><br /></li>
				<li>XSL 的新手？请参阅
          <i>developerWorks</i>网站上的
          <a href="http://www-4.ibm.com/software/developerworks/library/hands-on-xsl/index.html">Introduction to XSL</a>。
        <br /><br /></li>
				<li>关于 XSLT/XPath 的绝妙课程，请参阅
          <a href="http://www.ibiblio.org/xml/books/bible/updates/14.html">Chapter
14 of 
            <i>The XML Bible</i></a>。
        <br /><br /></li>
				<li>IBM 的
          <i>alphaWorks</i> 网站上还提供另一个极易使用的 XSL
处理器： 
          <a href="http://www.alphaworks.ibm.com/tech/lotusxsl">LotusXSL</a>。
        <br /><br /></li>
				<li>有关国际化的语言部分的一篇出色的概述文章，请参阅 Jared Jackson
关于 NLS 的文章 
          <a href="http://www.ibm.com/developerworks/library/j-rbmgr/index.html">Harnessing Internationalization</a>。
        <br /><br /></li>
				<li>Beno?t Marchal 关于 XSLT 的文章,
          <a href="http://www.ibm.com/developerworks/library/x-xslt5.html?dwzone=xml">Improve your XSLT coding five ways</a> ，介绍了如何综合客户端
Javascript 和层叠样式表。
        <br /></li>
		</ul>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/webcal.zip">下载 WebCal</a> 应用样例(Windows .zip
格式)。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="" src="http://www-128.ibm.com/developerworks/cn/xml/x-abstract2/martin.jpg" align="left" height="100" width="80" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>
Martin Gerlach，在 IBM Almaden
研究中心计算机科学部从事毕业后研究工作 
        <b>，</b> 拥有德国汉堡应用科学大学的计算机科学学位。可以通过

        <a href="mailto:mgerlac@almaden.ibm.com">mgerlac@almaden.ibm.com</a>
与 Martin 联系。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
		<p id="subtitle">
				<em>
						<br />
				</em>
		</p>
<img src ="http://www.blogjava.net/Vencent/aggbug/36717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:30 <a href="http://www.blogjava.net/Vencent/articles/36717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSLT 是什么类型的语言？::分析和概述</title><link>http://www.blogjava.net/Vencent/articles/36716.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36716.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36716.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36716.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#author">Michael H. Kay</a>
				<br />
		</p>
		<p>2001 年  2 月  01 日</p>
		<blockquote>
				<i>XSLT
是什么类型的语言，其用途是什么，为什么要这样设计它？这些问题可以有许多不同的答案，初学者往往会感到困惑，因为这种语言与他们以前习惯使用的语言之间
有很大差别。本文尝试说明XSLT。本文并不试图教您编写 XSLT样式表，它将说明这种语言的起源，它擅长什么，以及您为什么应该使用它。</i>
		</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>我撰写本文的初衷是为一篇关于 Saxon
的技术文章提供必要的背景知识，打算提供在传统 XSLT
处理器中使用的实现技巧内幕，从而帮助用户使其样式表的性能达到最大化。但

        <i>developerWorks</i>
的编辑们劝说我：这篇介绍应该吸引更广泛的读者，值得作为 XSLT
语言的独立说明而单独发表。
      </p>
		<p>
				<a name="1">
						<span class="atitle">什么是 XSLT？</span>
				</a>
		</p>
		<p>
XSLT 语言由万维网联盟 (W3C) 定义，并且该语言的 1.0 版本在 1999 年
11 月 16 日作为“推荐书”发布（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#resources">参考资料</a>）。我已经在拙作
        <i>XSLT Programmers'
Reference</i>
中提供了全面的规范和用户指南，因此我不打算在本文中涵盖相同内容。确切地讲，本文的目的只是使读者理解
XSLT 适合大规模事物的哪些位置。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1006C">
						<span class="atitle">XSLT 的角色</span>
				</a>
		</p>
		<p>
XSLT 的最初目的是将信息内容与 Web 显示分离。如其最初定义那样，HTML
通过按抽象概念（如段落、重点和编号列表）定义显示来实现设备独立性。随着
Web
变得越来越商业化，出版人希望其输出质量能达到与印刷品相同的质量。这逐渐导致越来越多地使用具体显示控件，如页面上材料的明确字体和绝对位置。然而不幸的是完全可以预料其副作用，即将相同的内容传递到替代设备，如数字电视机和
WAP 电话（印刷业的行话 
        <i>再现效果</i>）将会变得日益困难。
      </p>
		<p>由于吸收了印刷业使用 SGML 的经验，在 1998 年初定义了一种标记语言
XML，它用于表示独立于显示的结构化内容。与 HTML
使用一组固定概念（如段落、列表和表）不同，XML
标记中使用的标记完全是用户定义的，其用意是这些标记应该与所关注的对象（如人、地点、价格和日期）相关。尽管
HTML 中的元素本质上都是印刷样式（虽然处于抽象级别），而 XML
的目标是元素应该描述实际对象。例如，清单 1
显示了表示足球锦标赛结果的 XML 文档。</p>
		<br />
		<a name="Listing 1">
				<b>清单 1. 表示足球锦标赛结果的 XML 文档</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;results group="A"&gt;<br />&lt;match&gt;<br /> &lt;date&gt;10-Jun-1998&lt;/date&gt;<br /> &lt;team score="2"&gt;Brazil&lt;/team&gt;<br /> &lt;team score="1"&gt;Scotland&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;match&gt;<br /> &lt;date&gt;10-Jun-1998&lt;/date&gt;<br /> &lt;team score="2"&gt;Morocco&lt;/team&gt;<br /> &lt;team score="2"&gt;Norway&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;match&gt;<br /> &lt;date&gt;16-Jun-1998&lt;/date&gt;<br /> &lt;team score="1"&gt;Scotland&lt;/team&gt;<br /> &lt;team score="1"&gt;Norway&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;match&gt;<br /> &lt;date&gt;16-Jun-1998&lt;/date&gt;<br /> &lt;team score="3"&gt;Brazil&lt;/team&gt;<br /> &lt;team score="0"&gt;Morocco&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;match&gt;<br /> &lt;date&gt;23-Jun-1998&lt;/date&gt;<br /> &lt;team score="1"&gt;Brazil&lt;/team&gt;<br /> &lt;team score="2"&gt;Norway&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;match&gt;<br /> &lt;date&gt;23-Jun-1998&lt;/date&gt;<br /> &lt;team score="0"&gt;Scotland&lt;/team&gt;<br /> &lt;team score="3"&gt;Morocco&lt;/team&gt;<br />&lt;/match&gt;<br />&lt;/results&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果要通过 Web
浏览器显示这些足球赛的结果，不要指望系统会产生合理的布局。需要其它一些机制来告诉系统如何在浏览器屏幕、电视机、WAP
电话或真正在纸张上显示数据。这就是使用样式表的目的。样式表是一组说明性的规则，它定义了应如何表示源文档中标记标识的信息元素。</p>
		<p>W3C 已经定义了两个系列的样式表标准。第一个是在 HTML 中广泛使用的
CSS（级联样式表），当然它也可以在 XML 中使用。例如，可以使用 CSS
来表示何时显示发票，应支付的总额应该用 16 点 Helvetica
粗体字显示。但是，CSS
不能执行计算、重新整理或排序数据、组合多个源码中的数据或根据用户或会话的特征个性化显示的内容。在这个足球赛结果的例子中，CSS
语言（即使是最新版本
CSS2，尚未在产品中完全实现）的功能还不够强大，不能处理这项任务。由于这些原因，W3C
已着手开发更强大的样式表语言 XSL（可扩展样式表语言），并采纳了 SGML
社区中开发的 DSSSL（文档样式、语义和规范语言）中许多好的构思。</p>
		<p>在 XSL 的开发过程中（这在 DSSSL 中已有所预示），发现在准备 XML
文档以备显示的过程中执行的任务可以分成两个阶段：转换和格式化。转换是将一个
XML 文档（或其内存中的表示法）转换成另一个 XML
文档的过程。格式是将已转换的树状结构转换成两维图形表示法或可能是一维音频流的过程。XSLT
是为控制第一阶段“转换”而开发的语言。第二阶段“格式化”的开发工作还是进行中。但实际上，大多数人现在使用
XSL 将 XML 文档转换成 HTML，并使用 HTML
浏览器作为格式化引擎。这是可行的，因为 HTML 实际上只是 XML
词汇表的一个示例，而 XSLT 可以使用任何 XML 词汇表作为其目标。</p>
		<p>
将转换成一种语言和格式化成另一种语言这两个操作分离经证实的确是一种好的决策，因为转换语言的许多应用程序经证明无法向用户显示文档。随着
XML
日益广泛地用作电子商务中的数据互换语法，对于应用程序将数据从一个
XML 词汇表转换成另一个 XML
词汇表的需求也在不断增加。例如，某个应用程序可能从电视收视指南中抽取电视节目的细节，并将它们插入按次付费客户的月帐单中。同样，还有许多实用的数据
转换，在这些转换中源词汇表和目标词汇表是相同的。它们包括数据过滤，以及商务操作，如施行涨价。因此，随着在系统中开始越来越多地以
XML 语法的形式使用数据，XSLT
就逐渐成为由于处理这些数据的随处可见的高级语言。</p>
		<p>在拙作中，我做了这样一个比喻：XSLT 与 XML 的关系，就好象 SQL
与表格化数据的关系一样。关系模型的强大功能并非来自用表存储数据的思想，而是源于
SQL 中可行的基于关系运算的高级数据操作。同样，XML
的层次化数据模型对应用程序开发者的帮助实际上也非常小。正是因为 XSLT
作为 XML 数据的高级操作语言提供了如此强大的功能。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10094">
						<span class="atitle">XSLT 作为语言</span>
				</a>
		</p>
		<p>
就某些方面而言，XSLT
作为一种语言来说是非常古怪的。我不打算在本文中讨论已做出的设计决策的基本原理，尽管可以通过它们在逻辑上追溯到语言设计者确定的对
XSLT 的要求。如需更完整的说明，请参阅拙作的第 1 章。</p>
		<p>以下概述了 XSLT 语言的部分主要特性。</p>
		<p>
				<b>XSLT 样式表是一个 XML 文档</b> 。通过使用 XML
的尖括号标记语法来表示文档的结构。这种语法在某种程度上是比较笨拙的，而此决策可以使该语言变得更罗嗦。但是，它确实有好处。它表示可以自动使用
XML 的所有词汇设备（例如，Unicode
字符编码和转义，使用外部实体等等）。它表示很容易使 XSLT
样式表变成转换的输入或输出，使该语言可以作用于自身。它还使将期望的
XML
输出块嵌入样式表变得很容易。实际上，许多简单的样式表基本上可以写作期望输出文档的模板，并且可以将一些特殊指令嵌入文本中，以便插入输入中的变量数据或计算某个值。这就使
XSLT 在这个简单的级别上非常类似于许多现有的专用 HTML 模板语言。
      </p>
		<p>
				<b>基本处理范例是模式匹配。</b> 在这方面，XSLT
继承了文本处理语言（如 Perl）的传统，这种传统可以一直追溯到 1960
年代的语言，如 SNOBOL。XSLT
样式表包括一组模板规则，每条规则都使用以下方式：“如果在输入中遇到此条件，则生成下列输出。”规则的顺序是无关紧要的，当有几条规则匹配同一个输入时，将应用冲突解决算法。然而，XSLT
与串行文本处理语言的不同之处是 XSLT
对输入并非逐行进行处理。实际上，XSLT 将输入 XML
文档视为树状结构，每条模板规则都适用于树中的一个节点。模板规则本身可以决定下一步处理哪些节点，因此不必按输入文档的原始顺序来扫描输入。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100AC">
						<span class="atitle">XSLT 处理器的操作</span>
				</a>
		</p>
		<p>
XSLT 处理器使用树状结构作为其输入，并生成另一个树状结构作为输出。图
1 中显示了这一点。</p>
		<br />
		<a name="figure1">
				<b>图 1. XSLT 输入和输出的树状结构
</b>
		</a>
		<br />
		<img alt="XSLT 处理器的操作" src="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/xsltproc.jpg" height="244" width="496" />
		<br />
		<p>常
常通过对 XML
文档进行语法分析来生成输入树状结构，而输出树状结构通常被串行化到另一个
XML 文档中。但 XSLT 处理器本身操作的是树状结构，而不是 XML
字符流。这个概念最初给许多用户的感觉是不切实际的，结果却对理解如何执行更复杂的转换起了关键作用。首先，它表示
XSLT
处理器可以理解源文档中与树状结构无关的特殊之处。例如，无论属性是包括在单引号中还是在双引号中，都不可能应用不同的处理，因为会将这两种形式视为同一
个基本文档的不同表示方法。更深入地看，它表示处理输入元素或生成输出元素是一个原子操作。不可能将处理元素的开始标记和结束标记分成单独的操作，因为一
个元素会自动表示成树模型的单节点。</p>
		<p>XSLT
使用叫作 XPath 的子语言来引用输入树中的节点。XPath 本质上是与具有层次结构的 XML
数据模型相匹配的查询语言。它可以通过按任何方向浏览树来选择节点，并根据节点的值和位置应用谓词。它还包括用于基本字符串处理、数字计算和布尔代数的工
具。例如，XPath 表达式 <code>../@title</code> 选择当前节点的父代元素的标题属性。XPath
表达式用于选择要进行处理的输入节点、在条件处理期间测试条件，以及计算值以便插入结果树中。模板规则中还使用了 XPath
表达式的简化形式“模式”来定义特定模板规则适用于哪些节点。XPath 在单独的 W3C
推荐书中定义，它允许使用在其它上下文中再使用的查询语言，特别是用于定义扩展超链接的 XPointer。 </p>
		<p>XSLT 以传统语言（如 Lisp、Haskell 和
Scheme）中的功能性编程的概念为基础。样式表由模板组成，这些模板基本上是单一功能
--
每个模板将输出树的一部分定义成一部分输入树的功能，并且不产生副作用。使用无副作用的规则受到严格控制（除了转义成用类似
Java 的语言编写的外部代码）。XSLT
语言允许定义变量，但不允许现有变量更改它的值 --
即没有赋值语句。这个策略使许多新用户感到困惑，其目的是为了允许逐步应用样式表。其原理是如果语言没有副作用，那么对输入文档做很小的改动时，不必从头执行整个转换就应该可以计算出对输出文档的最后更改。目前必须说这只是理论上的可能，任何现有
XSLT 处理器还不能实现。（注：虽然 XSLT
以功能性编程概念为基础，但它还不是一个完整的功能性编程语言，因为它缺少将函数当作一级数据类型进行处理的能力。）</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100D1">
						<span class="atitle">示例样式表</span>
				</a>
		</p>
		<p>
在这个阶段，使用示例会使语言变得更清楚。清单 2
显示了列出足球赛结果的简单样式表。</p>
		<br />
		<a name="listing2">
				<b>清单 2.
足球赛结果的基本样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:transform<br /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br /><br />&lt;xsl:template match="results"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;&lt;title&gt;<br /> Results of Group &lt;xsl:value-of select="@group"&gt;<br /> &lt;/title&gt;&lt;/head&gt;<br /> &lt;body&gt;&lt;h1&gt;<br /> Results of Group &lt;xsl:value-of select="@group"&gt;<br /> &lt;/h1&gt;<br /> &lt;xsl:apply-templates&gt;<br /> &lt;/body&gt;&lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="match"&gt;<br /> &lt;h2&gt;<br /> &lt;xsl:value-of select="team[1]"&gt; versus &lt;xsl:value-of select="team[2]"&gt;<br /> &lt;/h2&gt;<br /> &lt;p&gt;Played on &lt;xsl:value-of select="date"&gt;&lt;/p&gt;<br /> &lt;p&gt;Result:<br /> &lt;xsl:value-of select="team[1] "&gt;<br /> &lt;xsl:value-of select="team[1]/@score"&gt;,<br /> &lt;xsl:value-of select="team[2] "&gt;<br /> &lt;xsl:value-of select="team[2]/@score"&gt;<br /> &lt;/p&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:transform&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个样式表包括两个模板规则，一个匹配 
        <code>&lt;results&gt;</code> 元素，另一个匹配 
        <code>&lt;match&gt;</code> 元素。 
        <code>&lt;results&gt;</code> 
元素的模板规则输出页面的标题，然后调用 
        <code>&lt;xsl:apply-templates&gt;</code> ，这是一个 XSLT
指令，它将处理当前元素的所有子代，对于每个子代都使用其适当的模板规则。在本例中， 
        <code>
&lt;results&gt;</code> 元素的所有子代都是 
        <code>&lt;match&gt;</code> 
元素，所以会用第二个模板规则来处理它们。规则输出了一个标识比赛的次级
HTML 标题（以 "Brazil versus Scotland" 的形式），然后生成 HTML
段落，给出了比赛的日期和两队的比分。
      </p>
		<p>该转换的结果就是一个 HTML 文档，该文档在浏览器中的表示如图 2
所示。</p>
		<br />
		<a name="figure2">
				<b>图 2. 清单 2
中样式表的结果
</b>
		</a>
		<br />
		<img alt="以上样式表的结果" src="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/soccer1.gif" />
		<br />
		<p>这是一种非常简单的表示信息的方法。然而，XSLT
的功能比这要强大得多。清单 3
包含了另一个可以操作相同源数据的样式表。这次，样式表计算一个比赛名次表，用来显示锦标赛结束时各队的名次。</p>
		<br />
		<a name="listing3">
				<b>清单3. 计算球队名次表的样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">&lt;xsl:transform<br />xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />version="1.0"&gt;<br /><br /><br />&lt;xsl:variable name="teams" select="//team[not(.=preceding::team)]"&gt;<br />&lt;xsl:variable name="matches" select="//match"&gt;<br /><br />&lt;xsl:template match="results"&gt;<br /><br />&lt;html&gt;&lt;body&gt;<br /> &lt;h1&gt;Results of Group &lt;xsl:value-of select="@group"&gt;&lt;/h1&gt;<br /><br /> &lt;table cellpadding="5"&gt;<br /> &lt;tr&gt;<br /> &lt;td&gt;Team&lt;/td&gt;<br /> &lt;td&gt;Played&lt;/td&gt;<br /> &lt;td&gt;Won&lt;/td&gt;<br /> &lt;td&gt;Drawn&lt;/td&gt;<br /> &lt;td&gt;Lost&lt;/td&gt;<br /> &lt;td&gt;For&lt;/td&gt;<br /> &lt;td&gt;Against&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;xsl:for-each select="$teams"&gt;<br /> &lt;xsl:variable name="this" select="."&gt;<br /> &lt;xsl:variable name="played" select="count($matches[team=$this])"&gt;<br /><br /> &lt;xsl:variable name="won"<br /> select="count($matches[team[.=$this]/@score &gt; team[.!=$this]/@score])"&gt;<br /> &lt;xsl:variable name="lost"<br /> select="count($matches[team[.=$this]/@score &lt; team[.!=$this]/@score])"&gt;<br /> &lt;xsl:variable name="drawn"<br /> select="count($matches[team[.=$this]/@score = team[.!=$this]/@score])"&gt;<br /> &lt;xsl:variable name="for"<br /> select="sum($matches/team[.=current()]/@score)"&gt;<br /> &lt;xsl:variable name="against"<br /> select="sum($matches[team=current()]/team/@score) - $for"&gt;<br /><br /> &lt;tr&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="."&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$played"&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$won"&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$drawn"&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$lost"&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$for"&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="$against"&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;/xsl:for-each&gt;<br /> &lt;/table&gt;<br />&lt;/body&gt;&lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:transform&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
这里没有足够的篇幅来完整地说明这个样式表，简而言之，它为球队声明了一个变量，变量值是一个节点集合，其中每个参赛球队都有一个实例。然后它计算每支球队的胜、平或负的比赛场次总数，以及球队进球或失球的总数。图
3 显示了它在浏览器中的最终输出结果。</p>
		<br />
		<a name="figure3">
				<b>图 3. 清单 3
中名次样式表的结果
</b>
		</a>
		<br />
		<img alt="以上样式表的结果" src="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/soccer2.gif" />
		<br />
		<p>这个示例的目的是说明 XSLT
不单单能够对源文档中出现的文本指定字体和布局。它是一个完整的编程语言，能够以任何方式转换源数据以供显示，或者输入另一个应用程序。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1012F">
						<span class="atitle">XSLT 的优点</span>
				</a>
		</p>
		<p>
您为什么考虑使用 XSLT？</p>
		<p>XSLT 给了您传统高级声明编程语言的所有好处，特别是对于转换 XML
文档的任务。</p>
		<p>
高级语言带来的实际好处是开发生产力。但实际上，真正的价值源自于 
        <i>更改的潜力</i> 。与使用低级
DOM 和 SAX 接口编码的过程性应用程序相比，用于转换 XML 数据结构的
XSLT 应用程序更能适应对 XML
文档细节的更改。在数据库世界中，这种特性叫做 
        <i>数据独立性</i> ，正是由于数据独立性导致了诸如
SQL
之类声明性语言的成功，并使旧的引导性数据访问语言走向衰亡。我坚信在
XML 世界中也会这样。
      </p>
		<p>当然与所有声明性语言一样，XSLT
也会降低性能。但是对于大多数应用程序，今天的 XSLT
处理器的性能已经完全能够满足应用程序的需要，并且它会变得越来越好。在我的第二篇文章中，我将讨论
XSLT 处理器中使用的一些优化技巧，如我自己的 Saxon 产品。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10147">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>
我想要在本文中展示的是 XSLT 是一种用于操作 XML
文档的完整高级语言，就如同 SQL
是操作关系表的高级语言一样。应该注意到 XSLT
不仅是一种样式设计语言，它比 CSS（或者甚至 CSS2）的功能更强大。</p>
		<p>我见到过一些应用程序，它们的所有商务逻辑都用 XSLT
编码。在一个三层在线银行系统中，我看到：</p>
		<ul>
				<li>从后端操作系统以 XML 消息的形式检索所有数据。</li>
				<li>在联机会话的持续时间内，用户的帐户数据在内存中以 XML DOM
形式表示。</li>
				<li>所有给用户的信息首先封装成 XML 消息，然后用服务器或客户机附带的
XSLT 转换根据浏览器的性能将这些消息转换成 HTML。</li>
		</ul>
		<p>该应用程序的数据都是 XML
格式的，并且逻辑（包括数据访问逻辑、商务逻辑和显示逻辑）都由 XSLT
来实现。我建议每个项目都采用那种体系结构，但这还需要很长时间，我认为我们会在几年之内见到那种系统。</p>
		<p>作为一种编程语言，XSLT 有许多特性 -- 从它使用 XML
语法到其功能性编程原理的基础 -- 还不为一般 Web
程序员所熟悉。那意味着一条陡峭的学习曲线和通常遇到许多挫折。当初对于
SQL 也是如此，所有这些表示 XSLT
与以前的编程语言有着本质的区别。但不要放弃：它是功能非常强大的技术，值得努力学习。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-xdarch.html">英文原文</a>.
        <br /><br /></li>
				<li>同一个作者撰写的 Wrox 书籍
          <a href="http://www.wrox.com/Books/Book_Details.asp?isbn=1861003129">XSLT
Programmer's Reference</a>。XSLT 语言的综合指南。
        <br /><br /></li>
				<li>W3C 出版的
          <a href="http://www.w3.org/TR/xslt">XSLT 1.0
Recommendation</a>。XSLT 语言的权威性规范。
        <br /><br /></li>
				<li>W3C 出版的
          <a href="http://www.w3.org/TR/xpath">XPath 1.0
Recommendation</a> 。XSLT 样式表中使用的 XPath
表达式语法的权威性规范。
        <br /><br /></li>
				<li>
						<a href="http://www.mulberrytech.com/">XSL-List</a> ，一个有关
XSLT 所有事物的繁忙邮件列表，它附带有可搜索档案，由 MulberryTech
进行管理。
        <br /><br /></li>
				<li>
						<a href="http://www.xslinfo.com/">www.xslinfo.com</a> ，一个很好的网络中央页面，带有到
XSLT 资源的链接，内容包括软件、书籍、教程和其它内容。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<p>
												<img alt="" src="http://www-128.ibm.com/developerworks/cn/i/p-mhk.jpg" align="left" height="71" width="64" />
										</p>
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>
Michael Kay 在 XML 界非常著名，他是 Saxon XSLT
处理器和 Wrox 书籍 
        <i>XSLT Programmer's Reference</i>
的作者。多年以前，他就获得了博士学位，他的研究领域是数据库技术。自那时起，他设计了
Codasyl
数据库、关系数据库、面向对象数据库和自由文本数据库软件。

        </p>
										<p>在写作时，Michael 还兼了几份工作（并没有休息）。他刚结束了在
          <a href="http://www.icl.com/">ICL</a>（一家英国 IT 服务公司）24
年的工作，并投奔 
          <a href="http://www.softwareag.com/">Software
AG</a> 成为体系结构小组的一员，该小组负责掌控未来 XML
产品的方向。
        </p>
										<p>作者选择这张照片来证明他并非总是象他在 Wrox
书籍中所表现得那样严肃。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<h1>
				<em>
				</em>
		</h1>
		<p id="subtitle">
				<em>
						<br />
				</em>
		</p>
		<img alt="" src="http://www.ibm.com/i/c.gif" class="display-img" height="6" width="1" />
<img src ="http://www.blogjava.net/Vencent/aggbug/36716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:29 <a href="http://www.blogjava.net/Vencent/articles/36716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改进 XSLT 编码的五种方法::使您成为更优秀的 XSLT 程序员的技巧</title><link>http://www.blogjava.net/Vencent/articles/36714.html</link><dc:creator>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</dc:creator><author>&lt;font color='GREEN'&gt;Vincent Chen&lt;/font&gt;</author><pubDate>Tue, 21 Mar 2006 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36714.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36714.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36714.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#author">Benoit Marchal</a>, 软件工程师, Pineapplesoft<br /></p>
		<p>2001 年  1 月  01 日</p>
		<blockquote>无
论是 XSLT 的初学者还是经验丰富的程序员，都一定会发现 Benoit Marchal
的这五种技巧将改进编码并带来新的思路。这些技巧涵盖了利用 XSL 样式表（包括 HTML 实体）使用 CSS、合并客户机端
JavaScript、使用多个输入文档，以及使用 XSLT 自动生成样式表。本文包括了供您改编和再使用的样本代码。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>XML 和 XSLT 的组合已在大中型网站的网站管理员之间逐渐流行起来。在
XSLT
出现之前，更改网站显示是一项重要任务：有一个人必须重新访问并更改站点上的每一个页面。但
XSLT 可以自动执行这个过程，这就大大节省了时间。</p>
		<p>
				<a name="N10045">
						<span class="atitle">技巧 1：级联样式表、表和
XSLT</span>
				</a>
		</p>
		<p>
在讨论 XSLT 的文章中以关于 CSS
的技巧作为开始似乎有些奇怪，但有人经常问我“这两种样式表语言是否兼容？”答案是响亮的“是”。</p>
		<p>清单 1 中的 products.xml 说明了这一点，它是以 XML
格式编写的产品列表。请花一点时间来熟悉
products.xml，因为我将使用它来说明这五种技巧。</p>
		<br />
		<a name="list 1">
				<b>清单 1. products.xml，XML
格式的产品清单</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;products&gt;<br /> &lt;product href="http://www.playfield.com/text"&gt;<br /> &lt;name&gt;Playfield Text&lt;/name&gt;<br /> &lt;price currency="usd"&gt;299&lt;/price&gt;<br /> &lt;description&gt;Faster than the competition.&lt;/description&gt;<br /> &lt;version&gt;1.0&lt;/version&gt;<br /> &lt;/product&gt;<br /> &lt;product href="http://www.playfield.com/virus"&gt;<br /> &lt;name&gt;Playfield Virus&lt;/name&gt;<br /> &lt;price currency="eur"&gt;199&lt;/price&gt;<br /> &lt;description&gt;Protect yourself against malicious code.&lt;/description&gt;<br /> &lt;version&gt;5.0&lt;/version&gt;<br /> &lt;/product&gt;<br /> &lt;product href="http://www.playfield.com/calc"&gt;<br /> &lt;name&gt;Playfield Calc&lt;/name&gt;<br /> &lt;price currency="usd"&gt;299&lt;/price&gt;<br /> &lt;description&gt;Clear picture on your data.&lt;/description&gt;<br /> &lt;version&gt;1.5&lt;/version&gt;<br /> &lt;/product&gt;<br /> &lt;product href="http://www.playfield.com/db"&gt;<br /> &lt;name&gt;Playfield DB&lt;/name&gt;<br /> &lt;price currency="cad"&gt;599&lt;/price&gt;<br /> &lt;description&gt;Organize your data.&lt;/description&gt;<br /> &lt;/product&gt;<br />&lt;/products&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>要将此文档的格式转换成 HTML，可以使用清单 2 中的
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%202">table.xsl</a>。将 table.xsl 应用到
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%201">products.xml</a>的结果如
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#fig1">图 1</a>
所示。可以看到，每隔一行都有一个灰色背景，这就提高了可读性。在
table.xsl 中，这是由于使用了级联样式表而实现的。
      </p>
		<br />
		<a name="list 2">
				<b>清单 2. table.xsl，使用 CSS
的 XSLT 样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet<br /> version="1.0"<br /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;<br /><br />&lt;xsl:output method="html" <br />        indent="no"/&gt;<br /><br />&lt;xsl:template match="/products"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;Cascading Style Sheet&lt;/title&gt;<br /> &lt;link rel="stylesheet" type="text/css" href="table.css" title="Style"/&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;table&gt;<br /> &lt;tr class="header"&gt;<br /> &lt;td&gt;Name&lt;/td&gt;<br /> &lt;td&gt;Price&lt;/td&gt;<br /> &lt;td&gt;Description&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;xsl:apply-templates/&gt;<br /> &lt;/table&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="product[position() mod 2 = 1]"&gt;<br /> &lt;tr class="odd"&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="price"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="product"&gt;<br /> &lt;tr class="even"&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="price"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="Sidebar: microtip">
																				<b>小技巧：更小的 HTML 文件</b>
																		</a>
																		<br />
																		<p>
请注意 
          <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%202">清单 2</a> 中 
          <code>table.xsl</code> 的 
          <code>&lt;xsl:output&gt;</code> 元素中以红色突出显示的 
          <code>indent="no"</code> 属性。这个属性告诉 XSLT 处理器不要缩排
HTML 文档，这通常会生成一个较小的 HTML 文件，可以使下载更快。
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="fig1">
						<span class="smalltitle">图 1. HTML
格式的产品列表</span>
				</a>
		</p>
		<p>
		</p>
		<table border="1" cellpadding="3" cellspacing="0">
				<tbody>
						<tr bgcolor="#999999" valign="top">
								<td>Name</td>
								<td>Price</td>
								<td>Description</td>
						</tr>
						<tr valign="top">
								<td>Playfield Text</td>
								<td>299</td>
								<td>Faster than the competition.</td>
						</tr>
						<tr bgcolor="#dfdfdf" valign="top">
								<td>Playfield Virus</td>
								<td>199</td>
								<td>Protect against malicious code.</td>
						</tr>
						<tr valign="top">
								<td>Playfield Calc</td>
								<td>299</td>
								<td>Clear picture on your data.</td>
						</tr>
						<tr bgcolor="#dfdfdf" valign="top">
								<td>Playfield DB</td>
								<td>599</td>
								<td>Organize your data.</td>
						</tr>
				</tbody>
		</table>
		<p>它是如何工作的？
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%202">table.xsl</a> 样式表将 HTML 
        <code>&lt;link&gt;</code> 
元素插入到输出中。 
        <code>&lt;link&gt;</code> 会装入级联样式表：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;link rel="stylesheet" type="text/css" href="table.css" title="Style"/&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>CSS 和 XSLT 之间没有冲突，因为不会同时使用它们。首先将 XSLT
样式表应用到 XML 文档 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%201">products.xml</a> 。这会生成传递给浏览器的 XML
文档。实际上，HTML 文档装入级联样式表与此阶段无关。仅当浏览器装入
HTML 文档时，才会使用 CSS。
      </p>
		<p>为了使用 CSS，XSLT 样式表
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%202">table.xsl</a>
会在适当的位置再插入 
        <code>class</code> 
属性。实际上，表中的元素被标记成 
        <code>odd</code> 或 
        <code>even</code> 类。那如何识别 XSLT
中的奇数行呢？只要将一个条件添加到 
        <code>match</code> 
属性，如从清单 2 中的样式表中摘录的这些行中所示：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:template match="product[position() mod 2 = 1]"&gt;<br /> &lt;tr class="odd"&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="price"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>清单 3 中的简单级联样式表
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%203">table.css</a>
在表的偶数行上放置灰色背景。
      </p>
		<br />
		<a name="list 3">
				<b>清单 3. table.css，图 1
中表的 CSS</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />.header { background-color: #999999; font-weight: bold; }<br />.odd { background-color: normal; }<br />.even { background-color: #dfdfdf; }<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>什么时候应该混合 CSS 和 XSLT？我认为此组合适用于以下情况：</p>
		<ul>
				<li>要获取更多的显示控制，因为 CSS 的功能比原始 HTML 更强大</li>
				<li>要生成更小的 HTML 文件，以便可以更快地下载</li>
		</ul>
		<p>
但是请注意，当组合这两种样式表时，在可维护性方面就会有所损失。事实上，设计人员最初是因为用一个文件就能控制整个网站的设计才会钟情于
CSS。在那方面，XSLT 与 CSS 一起使用简直就是多余，XSLT
就已经可以使一次性重新格式化几个文档变得很容易。</p>
		<p>小心！
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%202">table.xsl</a>
和本文中的其它样式表需要使用符合标准的 XSLT 处理器。Internet
Explorer 5.0 和 5.5 附带的处理器并不符合标准。如果需要一个合适的
XSLT 处理器，可以尝试使用 Xalan，它是 Apache 项目中的 XSLT
处理器，或者将 IE 中的处理器升级到版本 3.0（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#resources">参考资料</a>）。
      </p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10147">
						<span class="atitle">技巧 2：HTML 实体</span>
				</a>
		</p>
		<p>
开发人员常问的另一个有关编写 XSLT 样式表的问题是如何插入 HTML
实体。尤其是，如何插入 
        <code>&amp;nbsp;</code> 
实体（不可中断空格）。在其它样式表中， 
        <code>&amp;nbsp;</code> 
空格用于在表中创建非空单元。
      </p>
		<p>糟糕的是，这种直观的解决方案不起作用：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;tr&gt;&amp;nbsp;&lt;/tr&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>为什么？XSLT 样式表是一个 XML
文档。对它进行分析时，会解析实体，而且会将 
        <code>&amp;nbsp;</code> 
实体当作 XML 实体来进行解析。由于没有在 HTML 中定义 
        <code>&amp;nbsp;</code> ，因此它会导致一个错误。
      </p>
		<p>在清单 4 的
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%204">nbsp.xsl</a>
中说明了变通方法，并且以红色突出显示了有关元素。可以看到，每次编写
HTML
格式的实体时，它使用的字符比您预期输入的字符要多。但如果您知道了代码之后，只要在适当位置剪贴这段代码即可。
      </p>
		<br />
		<a name="list 4">
				<b>清单 4. nbsp.xsl，演示如何在样式表中插入 HTML 实体</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br /><br />&lt;xsl:stylesheet<br /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br /> version="1.0"&gt;<br /><br />&lt;xsl:output method="html" indent="no"/&gt;<br /><br />&lt;xsl:template match="/"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;&lt;title&gt;HTML Entities&lt;/title&gt;&lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;table border="1"&gt;<br /> &lt;tr&gt;<br /> &lt;td&gt;Name&lt;/td&gt;<br /> &lt;td&gt;Price&lt;/td&gt;<br /> &lt;td&gt;Description&lt;/td&gt;<br /> &lt;td&gt;Version&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;xsl:apply-templates/&gt;<br /> &lt;/table&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="product[version]"&gt;<br /> &lt;tr&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="price"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="version"/&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="product"&gt;<br /> &lt;tr&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="price"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;td&gt;<br />        &lt;xsl:text disable-output-escaping="yes"&gt;&amp;nbsp;&lt;/xsl:text&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /><br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如清单 4 中所摘录的，不可中断空格实体的正确代码是：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:text disable-output-escaping="yes"&gt;&amp;nbsp;&lt;/xsl:text&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>那行代码中发生了什么？诀窍是使用 
        <code>&lt;xsl:text&gt;</code> 
元素以及 
        <code>disable-output-escaping="yes"</code> 
属性。 
        <code>&lt;xsl:text&gt;</code> 在输出 HTML
中创建了一些文本。属性告诉处理器不要将文本内容转义。文本本身只是 
        <code>&amp;nbsp;</code> 和要转义成 XML 格式的 
        <code>&amp;</code> 
字符。
      </p>
		<p>再次声明，样式表是当作 XML 文档读取的，因此 
        <code>&amp;nbsp;</code> 就是 
        <code>&amp;nbsp;</code> 。如果告诉处理器不要转义输出 HTML 中的 
        <code>&amp;</code> ，那么它会写下 
        <code>&amp;nbsp;</code> 。
      </p>
		<table align="right" border="0" cellpadding="0" cellspacing="0" width="40%">
				<tbody>
						<tr>
								<td width="10">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="1" width="10" />
								</td>
								<td>
										<table border="1" cellpadding="5" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="sidebar: multiple output documents">
																				<b>小技巧：多个输出文档</b>
																		</a>
																		<br />
																		<p>	相反情况会怎么样，即需要多个输出文档？根据一个样式表创建几个输出文档会如何？不幸的是，在撰写本文时，还没有标准解决方案。大多数
XSLT 处理器都有一些多个输出文件支持，如 Xalan 中的 
          <code>org.apache.xalan.xslt.extensions.Redirect</code> 。
不要对标准解决方案绝望，XSLT
1.1（目前仍在开发中）将支持多个输出文档。
        </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101C0">
						<span class="atitle">技巧 3：多个输入文档</span>
				</a>
		</p>
		<p>
典型的 XSLT 样式表将一个 HTML 文档转换成另一个 XML 文档，或者转换成
HTML
文档。有时，这太过于局限性。（有关如何处理相反情况的简要介绍，请参阅侧栏 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#sidebar:%20multiple%20output%20documents">多个输出文档</a>。）
      </p>
		<p>例如，请注意在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%201">products.xml</a>
中， 
        <code>&lt;price&gt;</code> 元素有一个 
        <code>currency</code> 
属性。货币不是用普通文字表示，而是使用代码（例如， 
        <code>usd</code> 
代表美元，或者 
        <code>cad</code> 
代表加元）。您可能想要在显示代码之前先转换代码。
      </p>
		<p>
由于全世界有一百多种货币，而许多应用程序会处理这些货币，的确应该在一个独立的
XML 文档中存储货币符号列表。清单 5 中的 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%205">codes.xml</a>摘录了这样的文件。
      </p>
		<br />
		<a name="list 5">
				<b>清单 5.
codes.xml，带货币符号代码的 XML 文档</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;currencies&gt;<br /> &lt;currency&gt;<br /> &lt;code&gt;eur&lt;/code&gt;<br /> &lt;name&gt;Euros&lt;/name&gt;<br /> &lt;/currency&gt;<br /> &lt;currency&gt;<br /> &lt;code&gt;usd&lt;/code&gt;<br /> &lt;name&gt;Dollars&lt;/name&gt;<br /> &lt;/currency&gt;<br /> &lt;currency&gt;<br /> &lt;code&gt;cad&lt;/code&gt;<br /> &lt;name&gt;Canadian dollars&lt;/name&gt;<br /> &lt;/currency&gt;<br />&lt;/currencies&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>实际上，现在示例有两个 XML 文件，
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%201">products.xml</a>和
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%205">codes.xml</a> ，您需要组合这两个文件来创建 HTML
文档。幸好，XSLT 使组合几个输入文件变得更容易，如清单 6 中 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%206">multi.xsl</a>所说明的。
      </p>
		<p>multi.xsl 中有两个重要步骤。首先，样式表打开
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%205">codes.xml</a> （使用 
        <code>document()</code> 
函数），然后将它赋值给 
        <code>currencies</code> 变量：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:variable<br /> name="currencies"<br /> select="document('codes.xml')/currencies"/&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>然后，样式表可以通过变量从代码清单中抽取信息。当然，可以使用
XPath 来查询货币文档：</p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:value-of select="$currencies/currency[code=$currency]/name"/&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<a name="list 6">
				<b>清单 6. multi.xsl，组合几个 XML 文档的样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet<br /> version="1.0"<br /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;<br /><br />&lt;xsl:output method="html" indent="no"/&gt;<br /><br />&lt;xsl:variable<br /> name="currencies"<br /> select="document('codes.xml')/currencies"/&gt;<br /><br />&lt;xsl:template match="/"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;&lt;title&gt;Multiple documents&lt;/title&gt;&lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;table&gt;<br /> &lt;tr bgcolor="#999999"&gt;<br /> &lt;td&gt;Name&lt;/td&gt;<br /> &lt;td&gt;Price&lt;/td&gt;<br /> &lt;td&gt;Description&lt;/td&gt;<br /> &lt;td&gt;Version&lt;/td&gt;<br /> &lt;/tr&gt;<br /> &lt;xsl:apply-templates/&gt;<br /> &lt;/table&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="product"&gt;<br /> &lt;xsl:variable name="currency" select="price/@currency"/&gt;<br /> &lt;tr&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;<br /> &lt;td&gt;<br /> &lt;xsl:value-of select="price"/&gt;<br /> &lt;xsl:text&gt; &lt;/xsl:text&gt;<br /> &lt;xsl:value-of select="$currencies/currency[code=$currency]/name"/&gt;<br /> &lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="description"/&gt;&lt;/td&gt;<br /> &lt;td&gt;&lt;xsl:value-of select="version"/&gt;&lt;/td&gt;<br /> &lt;/tr&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1022A">
						<span class="atitle">技巧 4：XSLT 和客户机端
JavaScript</span>
				</a>
		</p>
		<p>
虽然 XSLT
功能强大，但它还不能应付一些情况。例如，您也许想要使用客户机端脚本，如
JavaScript、JScript 或 VBScript。</p>
		<p>如同 CSS，XSLT 并没有对所生成的 HTML 有所限制 --
它还可以使用脚本。而且，正如清单 7 中 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%207">javascript.xsl</a> 所说明的，可以将值从 XSLT 传递到
JavaScript。
      </p>
		<br />
		<a name="list 7">
				<b>清单 7. javascript.xsl，生成客户机端 JavaScript 的样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br /><br />&lt;xsl:stylesheet<br /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br /> version="1.0"&gt;<br /><br />&lt;xsl:output method="html" indent="no"/&gt;<br /><br />&lt;xsl:template match="/"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;JavaScript&lt;/title&gt;<br /><br />        &lt;script language="JavaScript"&gt;&lt;xsl:comment&gt;<br />// creates and initializes an array of product descriptions<br />var urls = new Array()<br /><br />&lt;xsl:for-each select="products/product"&gt;<br />urls[&lt;xsl:value-of select="position()"/&gt;] = "&lt;xsl:value-of select="@href"/&gt;"<br />&lt;/xsl:for-each&gt;<br /><br />// user function<br />function doSelect(i)<br />{<br /> open(urls[i])<br />}<br /> // &lt;/xsl:comment&gt;&lt;/script&gt;<br /> &lt;/head&gt;<br /><br /><a name="javascript.xsl eg 2">&lt;body&gt;<br /> &lt;ul&gt;<br /><br />        &lt;xsl:for-each select="products/product"&gt;<br />   &lt;li&gt;&lt;a href="javascript:doSelect({position()})"&gt;<br />   &lt;xsl:value-of select="name"/&gt;<br />   &lt;/a&gt;&lt;/li&gt;<br />   &lt;/xsl:for-each&gt;<br /><br /> &lt;/ul&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /><br /></a></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>再次声明，要理解
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%207">javascript.xsl</a> ，需要记住在哪个位置发生了什么事。首先应用
XSLT，生成 HTML 文件。文件包括了由 XSLT 生成其内容的 
        <code>&lt;script&gt;</code> 元素。接着，浏览器装入 HTML
文件，并执行脚本。请记住，脚本是由浏览器执行的，而不是样式表。
      </p>
		<p>例如，在
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#javascript.xsl%20red%20eg">javascript.xsl</a>
中以红色突出显示的行中，样式表初始化 JavaScript
数组；实际上，是将值传递给脚本。
      </p>
		<p>稍后，样式表在函数中生成调用，并再次将值传递给脚本（通过 XSLT 
        <code>position()</code> 函数），如 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#javascript.xsl%20eg%202">清单 7
中以蓝色突出显示的行所示</a>。
      </p>
		<p>清单 8 显示了在 HTML 中生成的内容。当用户单击 
        <code>&lt;a&gt;</code> 标记时，浏览器将执行这个脚本，如下所示：
      </p>
		<br />
		<a name="Listing 8 hTML">
				<b>清单 8. 根据 javascript.xsl 生成的
HTML</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;ul&gt;<br /> &lt;li&gt;&lt;a href="javascript:doSelect(1)"&gt;Playfield Text&lt;/a&gt;&lt;/li&gt;<br /> &lt;li&gt;&lt;a href="javascript:doSelect(2)"&gt;Playfield Virus&lt;/a&gt;&lt;/li&gt;<br /> &lt;li&gt;&lt;a href="javascript:doSelect(3)"&gt;Playfield Calc&lt;/a&gt;&lt;/li&gt;<br /> &lt;li&gt;&lt;a href="javascript:doSelect(4)"&gt;Playfield DB&lt;/a&gt;&lt;/li&gt;<br />&lt;/ul&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>能否从 XSLT 样式表中，而非 HTML 文档中调用 JavaScript
脚本？当然可以，但要使用 XSLT 扩展名。糟糕的是，XSLT 1.0
中并没有完全标准化 XSLT 扩展名。XSLT 1.1 将改进这个支持。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10280">
						<span class="atitle">技巧 5：自动创建样式表</span>
				</a>
		</p>
		<p>
这种技巧是所有这五种技巧中最具挑战性的。</p>
		<p>
有些情况下，您必须编写许多样式表，但似乎可以使用一个样式表来创建它们。其实，这并不如您认为的那样困难，它特别适用于用不同语言编写的网站，或者那些拥有大量网页、但仅是具体内容有所区别的站点。</p>
		<p>清单 9 中的
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%209">start.xsl</a>
样式表说明了这一点。乍一看，它有点象典型的 XSLT
样式表。如果仔细观察，将会发现诸如 
        <code>&lt;link&gt;</code> 和 
        <code>&lt;para&gt;</code> 之类的特殊元素并不是 HTML 元素（HTML
元素应该是 
        <code>&lt;a&gt;</code> 或 
        <code>&lt;p&gt;</code> ）。而且， 
        <code>&lt;xsl:output&gt;</code> 
元素没有 
        <code>method</code> 属性。
      </p>
		<br />
		<a name="listing 9">
				<b>清单 9. start.xsl，普通 XSLT 样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br /> version="1.0"&gt;<br /><br />&lt;xsl:output/&gt;<br /><br />&lt;xsl:template match="/"&gt;<br /> &lt;page title="XSLT Through Generation"&gt;<br /> &lt;xsl:for-each select="products/product"&gt;<br /> &lt;para&gt;<br /> &lt;link href="{@href}"&gt;&lt;xsl:value-of select="name"/&gt;&lt;/link&gt;<br /> &lt;/para&gt;<br /> &lt;/xsl:for-each&gt;<br /> &lt;/page&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>诀窍是使用清单 10 中的另一个样式表
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%2010">generate_html.xsl</a>将
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%209">start.xsl</a>转换成更典型的样式表。
      </p>
		<br />
		<a name="list 10">
				<b>清单 10. generate_html.xsl，用于将 start.xsl 改写成 HTML
的样式表</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br /> version="1.0"&gt;<br /><br />&lt;xsl:template match="xsl:output"&gt;<br /> &lt;xsl:copy&gt;<br /> &lt;xsl:attribute name="method"&gt;html&lt;/xsl:attribute&gt;<br /> &lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="page"&gt;<br /> &lt;html&gt;<br /> &lt;head&gt;&lt;title&gt;&lt;xsl:value-of select="@title"/&gt;&lt;/title&gt;&lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;h1&gt;&lt;xsl:value-of select="@title"/&gt;&lt;/h1&gt;<br /> &lt;xsl:apply-templates/&gt;<br /> &lt;/body&gt;<br /> &lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="para"&gt;<br /> &lt;p&gt;&lt;xsl:apply-templates/&gt;&lt;/p&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="link"&gt;<br /> &lt;a href="{@href}"&gt;&lt;xsl:apply-templates/&gt;&lt;/a&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="@*|node()"&gt;<br /> &lt;xsl:copy&gt;<br /> &lt;xsl:apply-templates select="@*|node()"/&gt;<br /> &lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%2010">generate_html.xsl</a>样式表将
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%209">start.xsl</a> 当作 XML
文档处理，并将它转换成另一个 XML 文档。实际上，start.xsl
本身就是一个 XSLT 样式表，并且对于 generate_html.xsl
没有意义。例如，以下规则将 
        <code>&lt;link&gt;</code> 元素转换成 
        <code>&lt;a&gt;</code> ：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:template match="link"&gt;<br /> &lt;a href="{@href}"&gt;&lt;xsl:apply-templates/&gt;&lt;/a&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这段代码通过添加 
        <code>method</code> 属性来修正 
        <code>&lt;xsl:output&gt;</code> 元素：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:template match="xsl:output"&gt;<br /> &lt;xsl:copy&gt;<br /> &lt;xsl:attribute name="method"&gt;html&lt;/xsl:attribute&gt;<br /> &lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>不经修改复制样式表中的其它元素（包括 
        <code>&lt;xsl:template&gt;</code> 、 
        <code>&lt;xsl:for-each&gt;</code> 
和其它 XSLT 指令）：
      </p>
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;xsl:template match="@*|node()"&gt;<br /> &lt;xsl:copy&gt;<br /> &lt;xsl:apply-templates select="@*|node()"/&gt;<br /> &lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>将 generate_html.xsl 应用到 start.xsl 会生成一个样式表
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%2011">generated.xsl</a> 。创建 HTML 文档的是
generated.xsl，而不是 
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%209">start.xsl</a>。
      </p>
		<p>这个技巧并不是带着您绕圈子，它是个非常好的示例，体现了使 XSLT
的逻辑达到最大化带来的好处。实际上，由于 XSLT 非常适用于将 XML
文档转换成其它 XML 文档，当然它也适用于转换 XSLT 样式表本身。</p>
		<br />
		<a name="listing 11">
				<b>清单 11.
generated.xsl，演示如何将 start.xsl 转换成 HTML</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br /><br />&lt;xsl:output method="html"/&gt;<br /><br />&lt;xsl:template match="/"&gt;<br /> &lt;html&gt;&lt;head&gt;&lt;title&gt;XSLT Through Generation&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;&lt;h1&gt;XSLT Through Generation&lt;/h1&gt;<br /> &lt;xsl:for-each select="products/product"&gt;<br /> &lt;p&gt;<br /> &lt;a href="{@href}"&gt;&lt;xsl:value-of select="name"/&gt;&lt;/a&gt;<br /> &lt;/p&gt;<br /> &lt;/xsl:for-each&gt;<br /> &lt;/body&gt;&lt;/html&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>当网站需要创建许多样式表时，您可能想要应用这个技巧。例如，通过将

        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#list%2010">generate_html.xsl</a>替换成
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%2012">generate_wml.xsl</a>，可以自动将
        <a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#listing%209">start.xsl</a> 改编成 WML 格式（WML
是无线智能电话的标记语言）。
      </p>
		<br />
		<a name="listing 12">
				<b>清单 12.
generate_wml.xsl，它将 start.xsl 改编成 WML</b>
		</a>
		<br />
		<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<br />&lt;?xml version="1.0"?&gt;<br />&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br /> version="1.0"&gt;<br /><br />&lt;xsl:template match="xsl:output"&gt;<br />&lt;xsl:copy&gt;<br /> &lt;xsl:attribute name="method"&gt;xml&lt;/xsl:attribute&gt;<br /> &lt;xsl:attribute name="doctype-public"&gt;-//WAPFORUM//DTD WML 1.1//EN&lt;/xsl:attribute&gt;<br /> &lt;xsl:attribute name="doctype-system"&gt;http://www.wapforum.org/DTD/wml_1.1.xml<br />&lt;/xsl:attribute&gt;<br />&lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="page"&gt;<br /> &lt;wml&gt;<br /> &lt;card title="{@title}"&gt;<br /> &lt;xsl:apply-templates/&gt;<br /> &lt;/card&gt;<br /> &lt;/wml&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="para"&gt;<br /> &lt;p&gt;&lt;xsl:apply-templates/&gt;&lt;/p&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="link"&gt;<br /> &lt;anchor&gt;&lt;go href="{@href}"/&gt;&lt;xsl:apply-templates/&gt;&lt;/anchor&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;xsl:template match="@*|node()"&gt;<br /> &lt;xsl:copy&gt;<br /> &lt;xsl:apply-templates select="@*|node()"/&gt;<br /> &lt;/xsl:copy&gt;<br />&lt;/xsl:template&gt;<br /><br />&lt;/xsl:stylesheet&gt;<br /></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>本文寓意：如果寻求大型网站的最大自动化，根据 XML 文档自动生成 HTML 文档是不够的，还应该自动生成 XSLT 样式表。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的
          <a href="http://www.ibm.com/developerworks/library/x-xslt5.html">英文原文</a>.
        <br /><br /></li>
				<li>
						<a href="http://xml.apache.org/">Xalan XSLT
处理器</a> 是以开放源码的形式分发的。它可以在 Java 和 C++
中使用。
        <br /><br /></li>
				<li>
						<a href="http://www.jclark.com/xml/xt.html">XT</a> 是用 Java
编写的另一个流行的 XSLT 处理器。在 
          <a href="http://www.4xt.org/">XT
用户社区</a>上有更多关于 XT 的参考资料。
        <br /><br /></li>
				<li>要利用 Internet Explorer 来使用符合标准的样式表，需要升级到
          <a href="http://msdn.microsoft.com/xml/general/xmlparser.asp">MSXML
3.0</a>。
        <br /><br /></li>
				<li>
						<a href="http://www.w3.org/TR/1999/REC-xslt-19991116">XSLT
1.0</a>是在撰写本文时最新的 XSLT 正式版本。
        <br /><br /></li>
				<li>
						<a href="http://www.w3.org/TR/xslt11/">XSLT 1.1</a>
目前还在开发中。它增加了一些必需的改进。
        <br /><br /></li>
				<li>W3C
          <a href="http://www.w3.org/Style/XSL/">XSLT
页面</a>提供了许多 XSLT 参考资料的链接。
        <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/library/x-applied/?dwzone=xml">Making teams work, via XML and XSL</a> 说明了在企业中部署 XSLT
的好处。
        <br /></li>
		</ul>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" height="16" width="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www-128.ibm.com/developerworks/cn/xml/x-xslt5/#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td colspan="3">
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="100%" />
								</td>
						</tr>
						<tr align="left" valign="top">
								<td>
										<br />
								</td>
								<td>
										<img alt="" src="http://www.ibm.com/i/c.gif" height="5" width="4" />
								</td>
								<td width="100%">
										<p>
Benoit Marchal
是居住在比利时纳慕尔市的一位软件工程师兼撰稿人，他的工作领域是 Java
和 XML。他撰写了两本有关 XML 的书籍： 
        <a href="http://www.amazon.com/exec/obidos/ASIN/0789722429/">XML by
Example</a>和
        <a href="http://www.amazon.com/exec/obidos/ASIN/0672320541/">Applied
XML Solutions</a> 。他在
Pineapplesoft（一家咨询公司）任职，参与了许多电子贸易项目。他的网站是

        <a href="http://www.pineapplesoft.com/">www.pineapplesoft.com</a>。
      </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Vencent/aggbug/36714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank"><font color='GREEN'>Vincent Chen</font></a> 2006-03-21 23:28 <a href="http://www.blogjava.net/Vencent/articles/36714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>