深入XSL(4)---模板(轉(zhuǎn))
發(fā)表時(shí)間:2023-08-14 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]深入XSL(4)---模板翻譯:孫一中1 概述當(dāng)應(yīng)用于源元素的規(guī)則被確定后,就要具體實(shí)現(xiàn)該規(guī)則的模板.一個(gè)模板能包含文字結(jié)果的元素, 字符數(shù)據(jù)和產(chǎn)生結(jié)果樹部分的指令.指令由XSL名域中的元素來表示,...
深入XSL(4)
---模板
翻譯:孫一中
1 概述
當(dāng)應(yīng)用于源元素的規(guī)則被確定后,就要具體實(shí)現(xiàn)該規(guī)則的模板.一個(gè)模板能包含文字結(jié)果的元素, 字符數(shù)據(jù)和產(chǎn)生結(jié)果樹部分的指令.指令由XSL名域中的元素來表示,可以選擇后代元素來處理. 有兩類這樣的指令, xsl:process-children 和xsl:process; xsl:process-children指令處理源元素的鄰近子元素, 而xsl:process指令處理由指定模式來選擇的元素.見下例:
<xsl:template match="chapter/title">
<fo:rule-graphic/>
<fo:block space-before="2pt">
<xsl:text>Chapter </xsl:text>
<xsl:number/>
<xsl:text>: </xsl:text>
<xsl:process-children/>
</fo:block>
<fo:rule-graphic/>
</xsl:template>
2 文字結(jié)果元素
在一個(gè)模板中,樣式表中不屬于XSL名域的元素具體化將產(chǎn)生相同類型的節(jié)點(diǎn);生成的元素節(jié)點(diǎn)會(huì)有已經(jīng)對(duì)在模板樹中的元素規(guī)定的屬性. 文字結(jié)果元素的一個(gè)屬性的值被認(rèn)為是一個(gè)屬性值模板:它能包含在花括號(hào)({})中的字符串. 結(jié)果元素節(jié)點(diǎn)的名域前綴映射是在樣式表中移去映射到XSL名域的URI后的映射.因?yàn)閄SL處理器只作用于屬于XSL名域的元素,所以就有這樣的問題:如何新建屬于XSL名域的元素?URI是http://www.w3.org/TR/WD-xsl的名域如果緊接出現(xiàn)一個(gè)或多個(gè)的/quote成為被引用的名域.應(yīng)用名域?qū)⒆魈厥馓幚?
3 命名屬性集
xsl:define-attribute-set元素定義了一自命名的屬性集合. "name"屬性規(guī)定了屬性集的名稱. xsl:define-attribute-set元素的內(nèi)容是一個(gè)規(guī)定屬性的xsl:attribute-set元素.一個(gè)文字結(jié)果元素或者一個(gè)xsl:attribute-set元素能指定一屬性集名稱為xsl:use屬性的值.下面的例子產(chǎn)生了一個(gè)稱為title-style的屬性集并在模板規(guī)則中使用它.
<xsl:define-attribute-set name="title-style">
<xsl:attribute-set font-size="12pt" font-weight="bold"/>
</xsl:define-attribute-set>
<xsl:template match="chapter/heading">
<fo:block xsl:use="title-style" quadding="start">
<xsl:process-children/>
</fo:block>
</xsl:template>
4 模板中的文字
模板也能包含PCDATA(Parsed Character Data). 在模板中去除空格后的每個(gè)數(shù)據(jù)字符將在結(jié)果樹中產(chǎn)生一個(gè)數(shù)據(jù)字符.文字的數(shù)據(jù)字符也可以包裝在一個(gè)xsl:text元素中.這樣的包裝處理可能改變空格的去除但不影響XSL處理器對(duì)字符的處理.
5 xsl:process-children的處理
下例新建用于chapter元素的塊(block) 并處理它的相鄰子元素.
<xsl:template match="chapter">
<fo:block>
<xsl:process-children/>
</fo:block>
</xsl:template>
xsl:process-children指令處理當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn),包括字符. 處理源樹中的字符是將字符添加到結(jié)果樹.因此,其中的<標(biāo)記在源樹中表示<字符,該源樹將由內(nèi)置的模板規(guī)則在結(jié)果樹中轉(zhuǎn)換為<字符,而當(dāng)結(jié)果樹具體化為一個(gè)XML文檔時(shí),<字符又將表示為< .
6 xsl:process的處理
xsl:process元素處理由一個(gè)模式選擇的元素. xsl:process 元素的模式是一個(gè)選擇模式,因而它被間接地定位到當(dāng)前節(jié)點(diǎn).下面的例子對(duì)author-group的所有author子節(jié)點(diǎn)進(jìn)行處理:
<xsl:template match="author-group">
<fo:sequence>
<xsl:process select="author"/>
</fo:sequence>
</xsl:template>
xsl:process元素處理所有匹配規(guī)定模式的元素.字符數(shù)據(jù)不被xsl:process元素匹配.模式不能包含屬性模式(AttributePattern)除非它作為屬性限定(AttributeQualifier)的一部分. 模式控制了發(fā)生匹配的深度.下例處理所有author節(jié)點(diǎn)中first-name元素:
<xsl:template match="author-group">
<fo:sequence>
<xsl:process select="author/first-name"/>
</fo:sequence>
</xsl:template>
在模式中使用//操作符可以匹配任意的深度. 下例處理在book元素中的所有heading元素.
<xsl:template match="book">
<fo:block>
<xsl:process select=".//heading"/>
</fo:block>
</xsl:template>
7 直接處理
當(dāng)結(jié)果是已知的規(guī)則結(jié)構(gòu),能夠直接確定選擇元素的模板是很有益的. xsl:for-each元素包括一個(gè)模板,它具體實(shí)現(xiàn)由select屬性規(guī)定的每個(gè)選擇元素.比如對(duì)下面的XML文檔:
<customers>
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer>
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer>
</customers>
下面的XSL將生成一個(gè)HTML文檔,包括一個(gè)表格,其中的一行就為一個(gè)custom元素
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Customers</TITLE>
</HEAD>
<BODY>
<TABLE>
<TBODY>
<xsl:for-each select="customers/customer">
<TR>
<TH>
<xsl:process select="name"/>
</TH>
<xsl:for-each select="order">
<TD>
<xsl:process-children/>
</TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</TBODY>
</TABLE>
</BODY>
</HTML>
</xsl:template>
8 模板中的條件
XSL中有兩個(gè)指令來支持條件處理: xsl:if和xsl:choose. xsl:if指令提供簡單的if-then的條件選擇; xsl:choose支持多條件的選擇.
9 計(jì)算產(chǎn)生的文本
在模板中, xsl:value-of元素能用于計(jì)算產(chǎn)生的文本,比如通過從源樹中提取文本或插入字符常數(shù)的值. 它由xsl:value-of元素通過一個(gè)規(guī)定為expr 屬性值的字串表達(dá)式來實(shí)現(xiàn). 字串表達(dá)式也能在文字結(jié)果元素的屬性值中使用,只要將該字串表達(dá)式套入{}中.
10 宏
宏能產(chǎn)生結(jié)果集合還能被引用,就象一個(gè)單獨(dú)的對(duì)象.在下例中,為一封裝的段落定義了一個(gè)宏,在其內(nèi)容之前增加“Warning!”語句.在匹配warning元素的規(guī)則中該宏被引用.
<xsl:define-macro name="warning-para">
<fo:box>
<fo:block>
<xsl:text>Warning! </xsl:text>
<xsl:contents/>
</fo:block>
</fo:box>
</xsl:define-macro>
<xsl:template match="warning">
<xsl:invoke macro="warning-para">
<xsl:process-children/>
</xsl-invoke>
</xsl:template>
-------------------------------------------------------------------------------