日期:2014-5-4 浏览次数:21216次 点赞次数:20

  深入XSL(5)
---联合款式表
翻译:孙一中
  
XSL提供两种机制来联合款式表:

1.款式表导入,允许款式表之间互相援用
2.款式表包含,允许款式表被原文组合. 

款式表导入
一个XSL款式表可以包含xsl:import元素.所有xsl:import元素必须出如今款式表的开头. xsl:import元素有一个 href 属性,它的值就表示要导入的款式表的URI. 绝对URI是指绝对于xsl:import元素的基URI.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:import href="article.xsl"/>
<xsl:import href="bigfont.xsl"/>
<xsl:define-attribute-set name="note-style">
<xsl:attribute-set font-posture="italic"/>
</xsl:define-attribute-set>
</xsl:stylesheet>

导向的款式表中的规则和定义比任何被导入款式表中的规则和定义都要重要.同样,一被导入的款式表中的规则和定义比之前导入的款式表中的规则和定义都要重要.普通来说,更重要的规则或定义比次重要的规则或定义要优先.每一类的规则和定义都会详细规定它.

款式表包含
一个款式表中可以用xsl:include元从来包含另一个XSL款式表. xsl:include也有href 属性,它的值就表示被包含的款式表的URI. 绝对URI是指绝对于xsl:include元素的基URI. xsl:include元素可以作为xsl:stylesheet元素的子元素,出如今任何xsl:import之后.在XML树的层次在上该包含生效.由href属性值定位的资源内容作为一个XML文档解析,在该文档中的xsl:stylesheet元素的子元素替代包含文档的xsl:include元素.同时在被包含的文档的xsl:import元素在包含文档中移上至任一存在的xsl:import元素之后. 不象xsl:import,被包含的规则或定义不影响他们被处理的方式.

嵌入款式表
通常一个款式表就是一个完整的XML文档,xsl:stylesheet元素作为文档的元素. 然而一个XSL款式表也可以嵌入在其它文档内容之中.内嵌的方式可能有两种:XSL款式表可以原文嵌入在一个非XML文档中或者xsl:stylesheet不作为文档元素出如今一个XML文档中.在第二种情况添加了出现内嵌款式,即本人规定款式的文档的可能. XSL还没无为之定义相应的机制.这是由于可以采用把款式表结合文档的通用方式来实现,只需满足:

1. 该方式允许一部分内容可以规定为款式表,例如使用有片段标识符URI
2. 该方式本身能被嵌入在文档中, 比如作为一个处理指令.定义这样的方式不在XSL的范围之内.

下例表明了怎样用xml:stylesheet处理指令将款式表和文档结合来实现内嵌款式. 其中的URI在片段标识符中使用了一个Xpointer来确定xsl:stylesheet元素的位置.

<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="#id(style1)"?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>
<head>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" id="style1">
<xsl:import href="doc.xsl"/>
<xsl:template match="id(foo)">
<fo:block font-weight="bold"><xsl:process-children/></fo:block>
</xsl:template>
</xsl:stylesheet>
</head>
<body>

<para id="foo">
...
</para>

</body>
</doc>


----------------------------------------------------------------------------