教学是一种令人难以置信的学习体验。我在公司的培训课程和有关会议上为开发人员讲授 XML 和 XSLT,经常发现为了向学员澄清一个复杂的问题所作的努力使我自己加深了对问题的理解。我不仅仅是在教我的学员,也是在教我自己。
另外,学员也会带来自己独到的观点,常常迫使我重新思考问题的某些方面并得出新的结论。本文就源于这样的一次经历。我认识到接触过 JSP、PHP、ASP 或 ColdFusion 的学员经常对 XSLT 抱有不正确的设想,这种设想会造成错误的编码。在寻求如何澄清这一问题时,我开始思考 XSLT 处理程序(如 Xalan、Saxon 或 MSXML)到底是如何工作的。这种新的看问题的角度给了我帮助,相信对您也会有所助益。
相似性与区别
初看起来,各种 Web 开发语言之间有很多相似之处,如 JSP 或 PHP 以及 XSLT。最明显的,它们都允许开发人员在 HTML 标签中混合编码:JSP 使用 Java 编写代码,PHP 使用特别的脚本语言,而对于 XSLT 代码则是 XSLT 名称空间的 XML 标签。
这种相似性隐藏了本质的区别。对于 JSP(以及 PHP、ASP 和 ColdFusion),HTML 标签被作为文本处理。事实上,当 JASP 页面在 servlet 中编译时,所有的 HTML 标签都被转移到写语句中。基本上,标签与代码的混合仅仅是为了方便编写代码——这意味着您不需要编写大量的写语句。
而 XSLT 却不是这样。XSLT 处理程序把标签看成是上等公民。XSLT 中的“T”代表转换(Transformation)。转换什么呢?把 XML 文档转换成另一个 XML 文档(HTML 被认为是 XML 的一种变体),或者更准确地说,把树转换成其他的树。什么是 树呢?想一想 W3C DOM(在 Java 技术中是 org.w3c.dom 包)。尽管出于性能的原因,现代 XSLT 处理程序内部并不使用 DOM(一个优化库会更有效),但这样有助于把 XSLT 看作是从一棵 DOM 树转换成另一棵 DOM 树的语言。
和 JSP 或 PHP 不同,XSLT 处理程序并不是把标签盲目地写入输出。相反,XSLT 处理程序的工作如下:
作为 DOM 树(在内部,处理程序优化了 DOM,但这不影响我们的讨论)加载输入文档。
对输入树进行深度优先的遍历,这和您在编程 101 中所学的深度优先算法没有什么不同。
遍历文档的过程中,为当前节点在样式表中选择一个模板。
应用该模板,模板描述了如何在输出树中创建 0 个、1 个或多个节点。
遍历完成时,按照输入树和模板中的规则生成一棵新树(输出树)。
根据 HTML 或者 XML 语法写入输出树。
注意,也可以选择深度优先遍历之外的其他算法。但这里我要强调的是 XSLT 处理程序把输入和输出都看作是树。这种处理方式带来了三种结果:
处理程序可以改变语法。根据 xsl:output 语句的值,处理程序可以按照 XML 或者 HTML 语法写入结果。Web 开发语言不能这样做,因为它们把 HTML 标签看作是文本,盲目地复制到输出中。
虽然偶尔可能出错,但处理程序尽量保证输出是结构良好的 XML 文档。
开发人员必须按照树操作表达自己的问题。
下一节中我将说明这句话的含义。
深度优先的遍历
这一节将比较两个样式表。第一个是典型的 XSLT 样式表,第二个对第一个进行了改写,以便公开所采用的深度优先遍历算法。虽然您不会采用这种编码风格,但它有助于解释处理程序是如何工作的。
常规样式表
清单 1 是一个示例 XML 文档, 图 1是相应的 DOM 树。 清单 2是一个简单的样式表,它把清单 1 转换成 HTML。
清单 1. XML 文档
<?xml version="1.0"?>
<db:article xmlns:db="http://ananas.org/2002/docbook/subset">
<db:title>XSLT, JSP and PHP</db:title>
<db:section>
<db:title>Is there a difference?</db:title>
<db:para>Yes there is! XSLT is a pure XML technology that
traces its roots to <db:emphasis>tree manipulation
algorithms</db:emphasis>. JSP and PHP offer an ingenious
solution to combine scripting languages with HTML/XML
tagging.</db:para>
<db:para>The difference may not be obvious when you're first
learning XSLT (after all, it offers tags and instructions),
but understanding the difference will make you a
<db:emphasis role="bold">stronger and better</db:emphasis>
上一篇:用XSLT进行WSDL处理
下一篇:使用Java和XSLT生成动态Web页面






