当前位置: 代码迷 >> Web前端 >> DocBook XSL完全手册(XSL简?余?介?绍)
  详细解决方案

DocBook XSL完全手册(XSL简?余?介?绍)

热度:621   发布时间:2012-10-31 14:37:32.0
DocBook XSL完全手册(XSL简?短?介?绍)

文?章?标?题?

f原文链接
1. XSL处?理?模?型?
1.1. 重?要?的?上?下?文?环?境?
1.2. 编?程?特?性?
1.3. 生?成?HTML
1.4. 生?成?格?式?化?对?象?(FO)

1.?XSL处?理?模?型?

XSL是?一?个?模?板?语?言?,而?不?是?一?个?程?序?语?言?。?这?意?味?着?stylesheet 制?定?了?一?个?输?出?样?本?,而?不?是?使?用?程?序?按?步?骤?生?成?。?一?个?stylesheet 包?含?了?一?个?混?合?的?输?出?样?本?,并?且?为?每?个?样?本?佩?戴?了?输?出?指?令?。?每?一?个?晓?得?输?出?样?本?加?上?处?理?指?令?就?构?成?了?一?个?模?板?。?
通?常?情?况?,你?要?为?文?档?内?的?每?个?元?素?书?写?一?个?模?板?。?这?样?能?够?让?你?每?次?只?专?注?于?一?个?元?素?,并?持?有?一?个?stylesheet 模?块?。?XSL的?强?大?之?处?在?于?它?能?够?递?归?的?处?理?模?板?,也?就?是?说?,每?个?模?板?只?处?理?它?对?应?的?一?个?元?素?,然?后?调?用?其?它?模?板?来?处?理?它?的?子?元?素?,以?此?类?推?。?一?个?XML文?档?总?是?用?一?个?根?元?素?作?为?顶?层?元?素?,并?包?含?可?以?嵌?套?的?子?元?素?,XSL模?板?总?是?从?顶?层?开?始?扫?描?,并?照?层?级?来?处?理?元?素?。?
现?在?用?Docbook的?<para> 元?素?为?例?子?,要?把?它?转?换?成?HTML,你?希?望?使?用?HTML标?记?<p> 来?包?围?要?输?出?的?内?容?。?但?是?DocBook的?<para> 元?素?可?以?包?含?任?何?in-line 类?型?的?元?素?来?标?记?内?容?;不?用?担?心?,你?可?以?让?其?它?对?应?的?模?板?来?处?理?这?些?元?素?,因?此?你?的?<para> XSL模?板?会?是?下?面?这?样?的?简?单?:
<xsl:template match="para">


  <p>


    <xsl:apply-templates/>


  </p>


</xsl:template>
元?素?<xsl:template> 表?示?开?始?一?个?新?的?模?板?,属?性?match 声?明?什?么?元?素?要?被?应?用?模?板?,在?这?个?例?子?中?将?匹?配?任?何?的?<para> 元?素?。?模?板?指?出?要?输?出?一?个?<p> 并?执?行?<xsl:apply-template>指?令?。?这?将?告?诉?XSL处?理?器?在?stylesheet 内?寻?找?所?有?的?模?板?并?将?其?应?用?到?段?落?中?的?元?素?。?如?果?stylesheet 每?个?模?板?都?含?有?一?个?<xsl:apply-template> 指?令?,那?么?将?会?递?归?执?行?下?去?。?当?执?行?到?stylesheet 的?末?尾?时?,模?板?将?输?出?一?个?结?束?的?</p> 标?签?。?

1.1.?重?要?的?上?下?文?环?境?

既?然?不?需?要?用?线?性?的?步?骤?来?书?写?你?的?文?档?,那?么?一?个?用?来?描?述?在?什?么?地?方?应?用?这?些?模?板?的?上?下?文?环?境? 是?尤?为?重?要?的?。?大?多?数?模?板?都?提?供?了?一?个?match 属?性?来?描?述?上?下?文?环?境?,这?是?一?个?纯?粹?的?表?达?式?语?言?:XPath ,用?来?标?识?你?文?档?中?的?哪?个?部?分?将?被?应?用?这?个?模?板?。?简?单?的?上?下?文?环?境?通?常?只?声?明?一?个?元?素?名?,就?像?上?面?的?例?子?。?但?是?你?也?可?以?指?定?元?素?的?子?元?素?,子?元?素?也?可?以?指?定?属?性?值?,指?定?的?元?素?成?一?个?队?列?的?形?式?,以?此?类?推?。?下?面?的?模?板?例?子?描?述?如?何?匹?配?DocBook的?<formalpara> 元?素?
<xsl:template





 match=





"formalpara"





>








  <p>








    <xsl:apply-templates/>








  </p>








</xsl:template>











<xsl:template





 match=





"formalpara/title"





>








  <b><xsl:apply-templates/></b>








  <xsl:text>





 </xsl:text>








</xsl:template>











<xsl:template





 match=





"formalpara/para"





>








  <xsl:apply-templates/>








</xsl:template>








上?面?定?义?了?三?个?模?板?,第?一?个?应?用?于?<formalpara> 元?素?本?身?,另?外?两?个?应?用?其?子?元?素?。?在?第?二?个?模?板?中?的?match 属?性?是?一?个?XPath 表?达?式?,用?来?表?示?这?里?的?<title> 元?素?是?一?个?直?接?隶?属?与?<formalpara> 元?素?的?子?元?素?。?这?就?区?分?与?在?DocBook中?的?其?它?<title> 元?素?。?XPath 表?达?式?是?控?制?模?板?如?何?应?用?的?关?键?。?
通?常?情?况?,XSL处?理?器?的?内?部?规?则?是?在?面?对?高?层?模?板?和?底?层?模?板?时?,优?先?应?用?底?层?模?板?,这?里?的?层?次?是?元?素?的?层?级?,文?档?顶?层?是?高?层?元?素?,以?此?类?推?。?这?能?够?让?你?更?细?致?的?控?制?模?板?应?用?,但?是?在?你?没?有?为?复?杂?的?符?合?元?素?提?供?细?致?的?上?下?文?环?境?时?,XSL处?理?器?也?对?其?提?供?了?备?选?方?案?。?这?个?特?性?在?上?面?的?例?子?中?得?以?体?现?,对?于?formalpara/para ,例?子?中?提?供?的?第?三?个?模?板?,<para> 元?素?作?为?<formalpara> 元?素?的?子?元?素?,处?理?器?将?使?用?单?独?的?方?式?来?处?理?它?,它?将?不?会?再?输?出?已?经?被?父?元?素?输?出?的?<p> HTML标?签?。?如?果?formalpara/para 模?板?没?有?包?含?在?上?面?的?例?子?中?,那?么?处?理?器?将?使?用?备?选?的?模?板?match="para" ,这?个?模?板?在?上?一?个?例?子?中?定?义?。?这?样?处?理?器?将?输?出?第?二?层?<p> HTML标?签?。?
你?也?可?以?使?用?XSL中?的?modes 来?控?制?模?板?上?下?文?环?境?,这?种?方?式?已?经?被?广?泛?应?用?与?DocBook stylesheet中?。?Modes 能?够?让?你?使?用?不?同?的?方?式?来?处?理?相?同?的?输?入?。?在?<xsl:template> 模?板?定?义?中?使?用?mode 属?性?将?会?为?模?板?指?定?一?个?mode 命?名?。?这?种?情?况?下?,当?有?两?个?模?板?指?定?了?相?同?的?mode 属?性?值?,处?理?器?将?把?math 的?属?性?值?和?mode 的?属?性?值?通?过?表?达?式?and 连?接?来?作?为?一?个?过?滤?条?件?,也?就?是?说?,当?mode 属?性?值?相?同?时?则?继?续?使?用?match 属?性?值?匹?配?来?区?分?使?用?哪?个?模?板?。?这?就?让?你?对?一?个?元?素?定?义?了?两?个?不?同?的?模?板?来?针?对?不?同?的?上?下?文?环?境?。?例?如?,下?面?对?DocBook的?<listitem> 元?素?定?义?了?两?个?不?同?的?模?板?:
<xsl:template





 match=





"listitem"





>








  <li><xsl:apply-templates/></li>








</xsl:template>











<xsl:template





 match=





"listitem"





 mode=





"xref"





>








  <xsl:number





 format=





"1"





/>








  </xsl:template>








第?一?个?模?板?应?用?于?普?通?的?列?表?输?出?情?况?,模?板?输?出?<li> HTML标?签?来?。?第?二?个?模?板?定?义?为?<xsl:apply-templates select="$target" mode="xref"/> ,这?种?情?况?下?用?来?专?门?处?理?<xref> 元?素?。?在?这?个?例?子?中?,mode 属?性?的?值?决?定?应?用?第?二?个?模?板?,它?将?初?始?带?有?序?号?的?列?表?。?因?为?在?输?出?<xref> 元?素?时?经?常?会?有?这?样?的?需?求?。?
请?记?住?,mode 的?设?置?不?会?自?动?的?贯?穿?处?理?子?模?板?<xsl:apply-templates/> 。?当?子?模?板?含?有?mode 属?性?时?,你?可?以?有?两?个?选?择?来?处?理?:
  • 要?想?继?续?使?用?mode 模?式?,也?就?是?使?用?<xsl:apply-templates mode="mode"/> 模?板?来?处?理?子?元?素?,处?理?器?将?查?找?具?有?相?同?mode 属?性?值?的?模?板?来?应?用?子?元?素?。?注?意?,这?样?的?话?你?就?没?有?备?选?方?案?,如?果?模?板?没?有?指?定?mode 属?性?值?,子?元?素?将?不?会?有?模?板?匹?配?,也?就?不?会?被?模?板?处?理?。?如?果?你?想?使?用?没?有?mode 属?性?的?模?板?作?为?备?选?,那?么?在?stylesheet 中?加?入?下?面?的?模?板?:
    <xsl:template
    
    
    
    
    
      match=
    
    
    
    
    
    "*"
    
    
    
    
    
      mode=
    
    
    
    
    
    "mode"
    
    
    
    
    
    >
    
    
    
    
    
    
    
    
      <xsl:apply-templates
    
    
    
    
    
     select=
    
    
    
    
    
    "."
    
    
    
    
    
     />
    
    
    
    
    
    
    
    
    </xsl:template>
    
    
    
    
    
    
    
    
    
    这?样?的?话?,对?于?任?何?子?元?素?,如?果?模?板?没?有?配?备?mode 属?性?值?,那?么?模?板?也?将?会?被?应?用?
  • 使?用?通?常?的?无?mode 模?板?,对?子?元?素?使?用?<xsl:apply-templates/> ,你?可?以?定?义?无?mode 模?板?

1.2.?编?程?特?性?

尽?管?XSL是?模?板?驱?动?的?,但?是?它?同?样?具?有?很?多?传?统?编?程?语?言?的?特?性?。?下?面?一?些?例?子?来?自?与?DockBook stylesheet
Assign a value to a variable:


<xsl:variable





 name=





"refelem"





 select=





"name($target)"





/>











If statement:


<xsl:if





 test=





"$show.comments"





>








    <i><xsl:call-template





 name=





"inline.charseq"





/></i>








</xsl:if>











Case statement:


<xsl:choose>








    <xsl:when





 test=





"@columns"





>








        <xsl:value-of





 select=





"@columns"





/>








    </xsl:when>








    <xsl:otherwise>





1</xsl:otherwise>








</xsl:choose>











Call a template by name like a subroutine, passing parameter values and accepting a return value:


<xsl:call-template





 name=





"xref.xreflabel"





>








   <xsl:with-param





 name=





"target"





 select=





"$target"





/>








</xsl:call-template>











然?而?你?不?能?像?在?其?它?编?程?语?言?那?样?来?使?用?上?面?这?些?结?构?,因?为?变?量? 在?特?别?的?情?况?下?会?具?有?完?全?不?同?的?行?为?。?

1.2.1.?使?用?变?量?和?参?数?

XSL提?供?两?种?元?素?来?让?你?指?派?值?到?变?量?上?:<xsl:variable> 和?<xsl:param> 。?它?们?享?用?共?同?的?命?名?空?间?和?语?法?,都?使?用?$name 来?引?用?变?量?。?这?两?个?元?素?最?主?要?的?不?同?是?param's 的?默?认?值?能?够?被?模?板?调?用?的?<xsl:with-param> 所?取?代?,就?如?上?面?最?后?一?个?例?子?所?示?。?
下?面?两?个?例?子?同?样?来?自?DocBook:
<xsl:param





 name=





"cols"





>





1</xsl:param>








<xsl:variable





 name=





"segnum"





 select=





"position()"





/>








在?上?面?两?个?元?素?中?,param 和?variable 的?名?字?都?是?通?过?name 属?性?来?指?定?的?,可?以?看?到?param 的?名?字?是?colsvariable 的?名?字?是?segnum 。?它?们?的?值?可?以?通?过?两?种?方?式?来?提?供?,参?数?的?例?子?是?通?过?元?素?的?内?容?值?1 来?赋?值?的?,而?变?量?的?例?子?是?通?过?select 属?性?值?来?赋?值?的?,这?个?属?性?值?是?一?个?表?达?式?的?结?果?,而?元?素?本?身?并?没?有?内?容?值?。?
对?于?新?接?触?XSL的?用?户?来?说?变?量?的?特?性?有?点?古?怪?,当?你?给?一?个?变?量?赋?值?后?,你?就?不?能?在?它?的?应?用?周?期?内?改?变?它?的?值?,如?果?这?样?做?会?报?错?。?所?以?你?不?能?像?在?使?用?其?它?编?程?语?言?那?样?对?变?量?进?行?动?态?存?储?,变?量?在?它?的?应?用?周?期?内?持?有?的?是?固?定?值?,并?在?应?用?周?期?结?束?时?销?毁?。?这?个?特?性?是?在?设?计?XSL时?就?决?定?了?,因?为?XSL是?模?板?驱?动?而?非?流?程?驱?动?的?。?这?意?味?着?它?没?有?固?定?的?执?行?顺?序?,所?以?你?无?法?依?赖?一?个?能?够?改?变?值?的?变?量?。?要?想?正?确?的?使?用?变?量?,你?必?须?理?解?变?量?的?周?期?是?如?何?定?义?的?。?
如?果?一?个?变?量?定?义?在?所?有?模?板?的?外?部?,那?么?它?就?被?认?为?是?一?个?全?局?变?量?,它?对?所?有?模?板?都?生?效?。?全?局?变?量?的?值?是?固?定?不?变?的?,也?不?能?被?任?何?模?板?所?重?新?赋?值?。?但?是?你?可?以?在?模?板?内?创?建?一?个?与?全?局?变?量?同?名?的?本?地?变?量?,然?后?赋?予?其?它?的?值?。?本?地?变?量?只?能?在?其?自?己?的?应?用?周?期?内?起?作?用?。?
定?义?在?模?板?里?的?本?地?变?量?只?会?在?它?被?允?许?的?周?期?内?生?效?,也?就?是?对?在?它?之?后?的?同?胞?和?后?裔?有?效?。?要?想?理?解?这?个?周?期?,你?必?须?明?白?XSL指?令?其?实?就?是?纯?粹?的?XML元?素?,并?内?嵌?在?XML家?族?层?级?结?构?中?。?它?们?通?常?是?指?父?级?、?子?级?、?同?级?、?祖?先?级?和?后?裔?级?。?在?XML家?族?层?级?中?,给?一?个?变?量?赋?值?就?像?发?布?一?个?公?告?给?你?希?望?听?到?家?族?成?员?一?样?。?你?只?能?把?公?告?发?布?给?比?你?年?龄?低?的?同?级?(包?括?你?自?己?)和?它?们?的?后?裔?级?,也?就?是?说?定?义?在?你?前?面?的?年?长?的?同?级?将?不?会?听?到?公?告?,更?不?用?说?你?的?父?级?和?祖?先?了?。?如?果?你?发?布?不?同?的?公?告?内?容?但?是?用?相?同?的?公?告?名?给?相?同?的?被?通?知?成?员?,那?将?出?现?错?误?,(言?外?之?义?,你?重?新?给?变?量?赋?值?了?)。?请?记?住?这?里?的?家?族?并?不?是?你?的?文?档?元?素?,而?只?是?在?你?stylesheet 中?的?XSL指?令?。?手?工?编?写?stylesheet 将?对?你?跟?踪?周?期?很?有?帮?助?,XSL元?素?缩?进?和?嵌?套?将?帮?助?你?理?解?周?期?。?下?面?的?代?码?片?段?来?自?DocBook stylesheet中?的?pi.xsl 文?件?,举?例?说?明?两?个?变?量?周?期?的?不?同?。?
 1 <xsl:template





 name=





"dbhtml-attribute"





>








 2 ...


 3    <xsl:choose>








 4       <xsl:when





 test=





"$count>count($pis)"





>








 5          <!-- not found -->








 6       </xsl:when>








 7       <xsl:otherwise>








 8          <xsl:variable





 name=





"pi"





>








 9             <xsl:value-of





 select=





"$pis[$count]"





/>








10          </xsl:variable>








11          <xsl:choose>








12             <xsl:when





 test=





"contains($pi,concat($attribute, '='))"





>








13                <xsl:variable





 name=





"rest"





 select=





"substring-after($pi,concat($attribute,'='))"





/>








14                <xsl:variable





 name=





"quote"





 select=





"substring($rest,1,1)"





/>








15                <xsl:value-of





 select=





"substring-before(substring($rest,2),$quote)"





/>








16             </xsl:when>








17             <xsl:otherwise>








18             ...


19             </xsl:otherwise>








20          </xsl:choose>








21       </xsl:otherwise>








22    </xsl:choose>








23 </xsl:template>








变?量?pi 的?周?期?开?始?于?第?8行?,也?就?是?模?板?定?义?它?的?位?置?,结?束?于?第?20行?它?最?后?一?个?同?级?兄?弟?结?束?的?地?方?[1 ] 。?变?量?rest 的?周?期?开?始?于?13行?,结?束?与?15行?。?幸?运?的?是?,15行?的?输?出?表?达?式?赶?在?周?期?结?束?前?使?用?了?变?量?值?。?
让?我?们?来?看?看?当?在?变?量?的?周?期?内?使?用?<xsl:apply-templates/> 会?如?何??被?应?用?的?模?板?内?会?得?到?变?量?值?吗??答?案?是?否?定?的?。?因?为?被?应?用?的?模?板?生?效?周?期?并?没?有?真?正?的?在?变?量?周?期?内?,它?在?stylesheet 的?其?它?地?方?退?出?,并?不?是?在?变?量?的?低?龄?同?级?和?后?裔?内?退?出?。?
要?想?传?值?给?一?个?模?板?,你?可?以?使?用?<xsl:with-param/> 传?递?一?个?参?数?。?这?种?参?数?传?递?通?常?被?用?在?使?用?<xsl:call-templates/> 调?用?指?定?模?板?,尽?管?你?也?可?以?使?用?<xsl:apply-templates/> 调?用?模?板?,但?是?通?常?被?调?用?的?模?板?希?望?传?入?一?个?与?<xsl:param/> 定?义?同?名?的?参?数?。?这?样?就?可?以?在?模?板?内?使?用?这?个?参?数?值?。?任?何?传?入?的?参?数?名?如?果?在?模?板?内?没?有?被?定?义?将?被?忽?略?处?理?。?
下?面?参?数?传?递?的?例?子?来?自?docbook.xsl
<xsl:call-template





 name=





"head.content"





>








   <xsl:with-param





 name=





"node"





 select=





"$doc"





/>








   </xsl:call-template>








上?面?一?个?命?名?为?head.content 的?模?板?被?调?用?,在?调?用?周?期?内?传?递?了?一?个?名?为?node 的?参?数?,参?数?值?是?变?量?$doc 。?上?面?被?调?用?的?模?板?看?上?去?会?是?下?面?的?样?子?:
<xsl:template





 name=





"head.content"





>








   <xsl:param





 name=





"node"





 select=





"."





/>








   ...


模?板?期?望?一?个?参?数?是?因?为?模?板?定?义?中?声?明?了?一?个?<xsl:param/> ,并?且?名?字?和?传?入?参?数?名?相?同?。?模?板?内?的?<xsl:param/> 提?供?了?一?个?默?认?值?,如?果?传?入?的?参?数?名?没?有?与?其?匹?配?,那?么?将?在?模?板?内?使?用?默?认?值?。?

1.3.?生?成?HTML

从?你?的?DocBook文?件?生?成?HTML需?要?使?用?HTML版?本?的?stylesheet ,这?些?由?stylesheet 的?HTML驱?动?文?件?docbook/html/docbook.xsl 来?完?成?。?这?是?一?个?主?stylesheet 文?件?,它?使?用?<xsl:include/> 导?入?其?它?组?件?文?件?组?装?一?个?完?整?的?stylesheet 用?来?生?成?HTML
DocBook stylesheet生?成?HTML的?方?式?是?通?过?应?用?模?板?来?输?出?一?些?文?本?内?容?和?HTML元?素?的?混?合?体?。?从?docbook.xsl 的?顶?层?开?始?:
<xsl:template





 match=





"/"





>








  <xsl:variable





 name=





"doc"





 select=





"*[1]"





/>








  <html>








  <head>








    <xsl:call-template





 name=





"head.content"





>








      <xsl:with-param





 name=





"node"





 select=





"$doc"





/>








    </xsl:call-template>








  </head>








  <body>








    <xsl:apply-templates/>








  </body>








  </html>








  </xsl:template>








模?板?匹?配?到?你?输?入?文?档?的?根?元?素?,然?后?就?开?始?递?归?应?用?模?板?。?首?先?定?义?了?一?个?变?量?doc ,然?后?输?出?两?个?HTML元?素?<html> 和?<head> 。?接?着?调?用?名?为?head.content 模?板?来?处?理?HTML的?<head> ,关?闭?<head> 后?就?开?始?<body> 。?这?里?使?用?<xsl:apply-templates/> 来?递?归?处?理?输?入?文?档?中?的?内?容?,最?终?关?闭?像?HTML文?件?的?输?出?。?
简?单?的?HTML元?素?可?以?用?不?带?任?何?属?性?的?元?素?生?成?,如?<html> ,但?是?如?果?HTML元?素?输?出?依?赖?上?下?文?环?境?,你?就?需?要?一?个?强?大?的?机?制?来?选?取?输?出?元?素?并?且?还?会?生?成?它?们?的?属?性?和?属?性?值?。?下?面?的?代?码?片?段?来?自?于?sections.xsl ,其?展?示?了?用?<xsl:element> 和?<xsl:attibute> 来?生?成?HTML的?头?标?签?
 1 <xsl:element





 name=





"h{$level}"





>








 2   <xsl:attribute





 name=





"class"





>





title</xsl:attribute>








 3   <xsl:if





 test=





"$level





<





3"





>








 4     <xsl:attribute





 name=





"style"





>





clear: all</xsl:attribute>








 5   </xsl:if>








 6   <a>








 7     <xsl:attribute





 name=





"name"





>








 8       <xsl:call-template





 name=





"object.id"





/>








 9     </xsl:attribute>








10     <b><xsl:copy-of





 select=





"$title"





/></b>








11   </a>








12 </xsl:element>








整?个?例?子?生?成?了?一?个?单?独?的?HTML头?元?素?。?第?1行?定?义?了?一?个?HTML元?素?,例?子?中?元?素?的?名?字?是?一?个?带?有?变?量?$level 的?表?达?式?,变?量?是?通?过?参?数?出?入?模?板?的?。?这?样?的?话?模?板?就?会?生?成?<hi> 、?<h2> 、?等?等?。?具?体?生?成?哪?个?依?赖?于?上?下?文?环?境?。?第?2行?为?头?元?素?添?加?了?一?个?属?性?class="title" 。?第?3-5行?添?加?了?属?性?style="clear all" ,但?是?只?适?用?于?头?元?素?的?层?级?数?小?于?3的?情?况?。?第?6行?打?开?一?个?锚?元?素?<a> 。?看?上?去?没?带?有?任?何?属?性?,其?实?是?在?第?7-9行?为?<a> 元?素?添?加?了?name 属?性?。?这?个?例?子?描?述?XSL管?理?的?输?出?元?素?是?一?个?活?的?元?素?,而?不?只?是?一?个?文?本?串?。?第?10行?输?出?头?元?素?的?标?题?文?本?,同?样?是?通?过?传?递?参?数?的?形?式?获?得?,然?后?关?闭?HTML粗?体?标?签?。?第?11行?使?用?</a> 关?闭?锚?标?签?,第?12行?是?头?元?素?的?关?闭?标?签?,这?就?结?束?了?头?元?素?的?定?义?。?
当?你?随?着?模?板?的?递?归?来?处?理?元?素?时?,可?能?会?疑?惑?在?你?文?档?里?的?内?容?文?本?是?如?何?被?模?板?输?出?的?,在?docbook.xsl 文?件?中?你?会?找?到?如?下?的?模?板?,它?专?门?用?来?内?容?文?本?。?
<xsl:template





 match=





"text()"





>








  <xsl:value-of





 select=





"."





/>








</xsl:template>








这?个?模?板?的?主?体?由?文?本?节?点?的?值?组?成?,它?只?是?文?本?。?通?常?,如?果?你?的?stylesheet 中?没?有?提?供?匹?配?的?模?板?,XSL处?理?器?都?有?一?些?内?建?的?模?板?来?获?取?内?容?文?本?。?上?面?的?模?板?就?是?提?供?这?样?的?功?能?,只?不?过?它?明?确?定?义?在?stylesheet 文?件?中?。?

1.4.?生?成?格?式?化?对?象?(FO)

使?用?fo 版?本?的?stylesheet 可?以?把?你?的?DocBook XML生?成?格?式?化?对?象?。?这?里?需?要?在?你?的?stylesheet 中?使?用?docbook/fo/docbook.xsl 。?在?你?的?主?stylesheet 文?件?中?使?用?<xsl:include> 引?入?所?有?的?组?件?组?装?成?完?整?的?stylesheet 来?生?成?格?式?化?对?象?。?生?成?格?式?化?对?象?只?完?成?了?输?出?过?程?的?一?半?,你?还?需?要?使?用?XSL-FO 处?理?器?,比?如?FOP。?
DocBook的?fo stylesheet和?HTML stylesheet的?工?作?方?式?类?似?,就?是?用?<fo:something> 形?式?的?标?签?代?替?相?应?的?HTML标?签?。?例?如?,输?出?in-line 类?型?并?且?使?用?monospace 字?体?,fo的?形?式?会?是?如?下?的?样?子?:
<fo:inline-sequence





  font-family=





"monospace"





>





/usr/man</fo:inline-sequence>








输?出?一?个?DocBook <filename> 元?素?,在?docbook/fo/inline.xsl 中?的?模?板?定?义?看?起?来?像?如?下?的?样?子?:
<xsl:template





 match=





"filename"





>








  <xsl:call-template





 name=





"inline.monoseq"





/>








</xsl:template>











<xsl:template





 name=





"inline.monoseq"





>








  <xsl:param





 name=





"content"





>








    <xsl:apply-templates/>








  </xsl:param>








  <fo:inline-sequence





 font-family=





"monospace"





>








    <xsl:copy-of





 select=





"$content"





/>








  </fo:inline-sequence>








</xsl:template>








在?XSL标?准?中?指?定?了?很?多?XSL-FO标?签?和?属?性?的?规?范?,要?描?述?在?DocBook中?如?何?遵?循?这?些?规?范?显?然?已?经?超?出?本?书?的?范?围?。?庆?幸?的?是?,这?些?只?是?中?间?格?式?,你?不?许?要?马?上?去?处?理?,除?非?你?正?在?自?己?编?写?stylesheets 。?


[1 ] 从?技?术?上?来?讲?,变?量?的?周?期?延?伸?到?<xsl:variable> 父?级?元?素?结?束?的?地?方?,也?就?是?它?最?后?一?个?同?级?兄?弟?

?