8.12 指定输出格式

尽管前面介绍的XSLT转换大都是转换为HTML文档的示例,但也介绍了少量转换结果是XML的示例。实际上,XSLT专门提供了一个<output…/>元素来指定结果文档的格式。

<output…/>元素必须作为<stylesheet…/>和<transform…/>两个元素的子元素使用,一份XSLT文档中可以包含多个<output…/>元素,XSLT会把多个<output…/>子元素里包含的多个属性合并为一个有效的<output…>元素。

使用<output…>元素时可以指定如下属性:

alt method:指定转换得到的结果文档的格式。该属性支持如下3个属性值:

● xml:指定转换结果是XML文档。

● html:指定转换结果是HTML文档。

● text:指定转换结果是文本文档。

alt version:指定输出文档的版本,例如指定method="xml"和version="1.0",则转换得到的XML文档中将包含如下声明:

alt

alt encoding:指定输出结果文档时编码所用的字符集,该属性的值不区分大小写。

alt omit-xml-declaration:指定输出结果文档时是否需要输出XML声明,该属性的值只能是yes或no。yes代表不输出,no代表输出。

alt standalone:指定输出结果文档时是否应该添加standalone="yes",该属性的值只能为yes 或no。

alt doctype-public:指定结果文档所使用的公共DTD的标识名。

alt doctype-system:指定结果文档所使用的外部DTD的URI。

alt cdata-section-elements:指定结果文档中哪些元素的字符串内容应使用CDATA片段输出。该属性的值为一系列以空格隔开的元素名。

alt indent:指定输出结果文档时是否进行合理缩进。该属性的值只能为yes或no。

alt media-type:指定结果文档的MIME内容类型。一般说来,如果输出结果是XML文档,该属性的值就是text/xml;如果输出结果是HTML文档,该属性的值就是text/html;如果输出结果是文本文档,该属性的值就是text/plain。

8.12.1 转换XML文档的相关格式

如果在<output…/>元素中指定method="xml",则意味着转换的结果文档是一份XML文档。如果没有指定method属性,method属性默认也是"xml"。

如果同时满足如下3个条件,method属性默认将是"html":

alt 结果树的根节点包含子元素。

alt 结果树中根节点的第一个子元素节点的元素名是“html”(包括任意大小写组合)。

alt 结果树中根节点的第一个子元素之前的任何文本节点只包含空白字符。

在确定了需要结果文档是XML文档之后,还可以为<output…/>元素指定各属性来指定文档格式。

假设有如下XML文档需要进行转换处理:

程序清单:codes\08\8.12\book.xml

alt

下面定义一份XSLT样式单对其进行转换,此处指定转换的结果文档为XML文档:

程序清单:codes\08\8.12\book.xslt

alt

上面的XSLT中使用<output…/>元素指定了结果文档的格式,并为该元素指定了全部属性,使用该文档转换得到的XML文档如图8.26所示。

alt

图8.26 使用<output…/>元素指定XML文档的输出格式

从图8.26可以看出,指定indent="yes"后,XML结果文档将保持良好的缩进——子元素缩进3格,开发者无法自行指定缩进多少,这也算<output…/>元素的一个小小的缺憾吧。


alt注意

读者如果使用记事本(Notepad)打开上面的结果文档,将无法看到图8.26所示结果,因为记事本需要以“\r\n”作为换行,而out.xml文档以XML文档换行符(\n)来控制换行,因此用记事本打开该文档将看不到换行效果。使用XMLSpy打开也不行,因为XMLSpy不支持GBK字符集。


8.12.2 转换HTML文档的相关格式

如果指定method为"html",或满足前面列出的3个条件,method属性默认为"html",则此时输出的结果文档将是HTML文档。

如果指定结果文档是HTML文档,则可以为<output…/>元素指定如下几个属性:encoding、indent、doctype-system、doctype-public和media-type等。如下XSLT样式单将使用<output…/>指定结果文档的输出格式:

程序清单:codes\08\8.12\html.xslt

alt

上面的XSLT中使用<output…/>元素指定了结果文档的格式,并为该元素指定了全部属性,使用该文档转换得到的HTML文档如图8.27所示。

alt

图8.27 使用<output…/>元素指定HTML文档的输出格式

从图8.27可以看出,指定indent="yes"后,HTML结果文档的子元素默认缩进3格。


alt注意

如果开发者需要转换后的结果文档是XHTML文档,而不是HTML文档,应该指定method属性为"xml",而不是"html",而且doctype-public和doctype-system的值应根据XHTML相应的DTD来指定。至于XHTML DTD的相关信息,读者可参考疯狂Java体系中《疯狂Ajax讲义》第3章的内容。