XSLT是一种用来转换XML文档结构的说明性计算机语言,随着网络时代的发展,它的应用场合越来越广泛,影响力也越来越大。从不同观点来看,XSLT或XSL转换可以说是对XML最好的发展,也可以说是迄今发明的最恐怖的计算机语言之一。
首先,我们要知道XSL与XSLT之前要了解可扩展标记语言(EXtensible Markup Language,XML)。它是由标准化的通用标记语言(Standardized General Markup Language,SGML)派生出来的,尽管它的名字表明它是一种标记语言,且它不仅仅是一种简单的标记语言,而是一种创建和管理标记的语言。XML文档由文字组成,除此之外,没有其他的内容。XML与HTML有些相似,它们都使用尖括号,&符号等等,但它却比HTML更为强大。在XML中,定义元素的标记必须成对匹配。尽管XML文档内在的逻辑结构是完美的,但对习惯于Web页面和精美输出的用户来说,XML文档简直是丑陋之极。XML真正的优势在于数据交换格式方面,而不在于数据存储格式方面。如果将XML信息传递给某个不支持XML的应用或传递给使用其他的XML词汇表的应用,这时候需要分别为上述情况编写单独的转换程序。XSL是以XML为基础的样式单语言来表示CSS属性。XSL的设计不仅受到CSS和XML的强烈影响,而且还受一种称为文档格式语义及规范语言DSSSL的影响。
XSLT转变工作的原理与造型软件有些相似,大体上来说,样式单中的代码描述了XML源文档的所有内容,而这些内容也正是所要生成的结果文档中的内容。在XSLT转变中,没有必要像上述厨师到刽子手的变形过程中那样在相同的地方建立点到点的一一对应关系,可以将相关的内容放在任意位置。XSLT是解决转换问题的一种通用方案。对于各种不同的文档结构,通用解决方案是很有用的,因为我们不需要为各种不同的文档结构编写定制的程序代码。虽然需要为每种结构编写定制的样式单,但这些样式单通常都比过程化语言(如C++和Java)编写的程序要简单。XSLT的样式单不仅容易编写,而且也容易读,不熟悉XSLT的人都可以读懂它。因为开发的简单性和易懂性,相对于文档处理应用程序,XSLT样式单的效率要高得多。为每种文档开发特定的程序的工作量是相当惊人的,更不用说为每个文档开发一个应用程序,这也正是阻碍文本处理应用被广泛接受的一个主要原因。简而言之,XSLT在文档处理应用的两个互相矛盾的目标,即简单性和通用性这间起着重要的平衡作用。为了使XML“举止”像其他的东西,而不仅仅是表示纯内容标记,必须将它转换成其他的格式。从长远范围来看,较为简单的解决方案是使用一种通用的方法来完成对XML文档的转换。
XSLT不能指示计算机如何取得预期的结果,这正是XSLT样式单区别于传统意义上的真实“计算机编程语言”之处。XSLT仅简单地描述了结果是什么样的。而真正的转换工作,要由称为XSLT引擎或XSLT处理器的应用程序完成,并按它为合适的格式产生结果。XSLT转换的工作是指定一些由XSLT处理器实现 的结果,这些结果是对源文档中的指定部分的转换描述。简而言之,它将源树(source tree)转化为结果树(result tree)。“树”指的是某种结构化的数据,这些数据被组织成层状结构,而且源树中的数据必须是XML形式的。结果树可以是任意类型的广西。可以将XML文档转换为没有标记的,以逗号分隔平板式文档,然后将这些数据导入到数据库去;或将其转换到另一个XML词汇表中,或将其导入相同XML词汇表的另一个版本中。
XMLT能够引起人的注意,是因为可以同时巧妙地处理多个文档。其处理模型定义了下列行为:一个样式表可以引用多个XML输入文档。在这种情况下,必须有一个主要的源文件与此样式表相关联;另一方面,样式表可以接着再引用另外的输入文档。样式表可以引用额外的样式表文档,允许模块化用户样式表。这里也必须有一个主要的样式表文档。该样式表接着可以利用xsl:import和xsl:include元素引入或包含多个样式表。对于大多数XSLT处理机来说,另一个有用的功能是能够在其单次运行中产生多个输出。XSLT标准目前尚未支持这一功能。不过,市场上的许多产品提供这一功能。顶级元素和指令,这两个术语都与XSLT样式单的结构相关。样式单本身是个良构的XML文档,而为了实现良构,它只能有一个根元素。在XSLT中,这个根元素是xsl:stylesheet。在xsl:stylesheet元素的开始及结束标签之间是顶级元素和指令的混合体。它包括所有的名字在XSLT名字空间内的元素,也就是说他们的名字都是以xsl:为前缀的。所谓的顶级元素,指的是xsl:stylesheet的直接子元素;相反,所谓的指令,指的是包含在某些顶级元素中的内容。任何一个模板都必包含在一个顶级元素中,也就是说,模板不能是根元素xsl:stylesheet的直接子元素。
(作者单位:长江大学计算机科学院网络工程10802班)