那么一个XML文档,在XSLT看来,它的树形模型到底是什么样的呢?我们还是以代码
<?xml version="1.0" encoding="UTF-16"?>
<?xml-stylesheet type="text/xsl" href="helloworld.xslt"?>
<root>
<name>Hehangjun</name>
<name>何杭军</name>
</root>
为例,对应于该XML文档的树形用下图表示:
从上图中我们可以看出两点,XSLT的树模型非常类似于DOM规范中规定的树形结构;并且
XSLT的树模型省略了处理指令,不仅如此在XSLT的源树结构中还省略了XML文档中的注释
元素,因此对于源树来说根结点只有一个元素节点,这一点特别重要。结果树的模型在
总体上和源树非常类似,但是也有一些细微的不同,最明显得差别表现在结果树的根元
素可以有不止一个的子节点,这样XSLT的转换结果中就可能出现多个文档元素,换句话
说转换出来的XML文档可能不是一个语法正确的XML文档(XML语法规定文档只能有一个文
档元素)。这在XSLT的规范中是合法的,XSLT规范规定"结果树不构成良定义的XML是可
能的,但是它必须可以充当良定义的XML文档的部分",它的意思是转换得到的文档除了
"只有一个文档元素"这一条不满足XML语法的要求意外,其它的XML语法都满足。举例来
说,下述的转换结果是XSLT能做到的:
<people>
<name>Hehangjun</name>
</people>
<people>
<name>何杭军</name>
</people>
要得到上述合理的输出,可以这样写XSLT文档:
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transfor
m">
<xsl:template match="/root">
<xsl:for-each select="name">
<people><name>
<xsl:value-of select="."/>
</name></people>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
