| <?xml version="1.0" encoding="utf-8"?> |
| <!DOCTYPE xsl:stylesheet [ |
| <!ENTITY % common.entities SYSTEM "../common/entities.ent"> |
| %common.entities; |
| ]> |
| <xsl:stylesheet |
| xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns:exsl="http://exslt.org/common" |
| xmlns="http://www.w3.org/1999/xhtml" |
| xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table" |
| xmlns:xtbl="xalan://com.nwalsh.xalan.Table" |
| xmlns:lxslt="http://xml.apache.org/xslt" |
| xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table" |
| exclude-result-prefixes="exsl stbl xtbl lxslt ptbl" |
| version="1.0"> |
| |
| <!-- $Id$ --> |
| |
| <!--==============================================================--> |
| <!-- DocBook XSL Parameter settings --> |
| <!--==============================================================--> |
| <!-- Set these to blank so can output special HTML5 empty DOCTYPE --> |
| <xsl:param name="chunker.output.doctype-system" select="''"/> |
| <xsl:param name="chunker.output.doctype-public" select="''"/> |
| |
| <xsl:param name="table.borders.with.css" select="1"/> |
| <xsl:param name="html.ext">.xhtml</xsl:param> |
| <xsl:param name="toc.list.type">ul</xsl:param> |
| <xsl:param name="css.decoration" select="1"/> |
| <xsl:param name="make.clean.html" select="1"/> |
| <xsl:param name="generate.id.attributes" select="1"/> |
| <xsl:variable name="div.element">section</xsl:variable> |
| |
| <!--==============================================================--> |
| <!-- Customized templates --> |
| <!--==============================================================--> |
| |
| <!-- HTML5: needs special doctype --> |
| <xsl:template name="user.preroot"> |
| <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text> |
| </xsl:template> |
| |
| <!-- HTML5: Replace HTML acronum with abbr for HTML 5 --> |
| <xsl:template match="acronym"> |
| <xsl:call-template name="inline.charseq"> |
| <xsl:with-param name="wrapper-name">abbr</xsl:with-param> |
| </xsl:call-template> |
| </xsl:template> |
| |
| <!-- HTML5: replace border="0" with border="" --> |
| <!-- HTML5: No @summary allowed --> |
| <!-- HTML5: replace many table atts with CSS styles --> |
| <xsl:template match="tgroup" name="tgroup"> |
| <xsl:if test="not(@cols) or @cols = '' or string(number(@cols)) = 'NaN'"> |
| <xsl:message terminate="yes"> |
| <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text> |
| </xsl:message> |
| </xsl:if> |
| |
| <xsl:variable name="summary"> |
| <xsl:call-template name="pi.dbhtml_table-summary"/> |
| </xsl:variable> |
| |
| <xsl:variable name="cellspacing"> |
| <xsl:call-template name="pi.dbhtml_cellspacing"/> |
| </xsl:variable> |
| |
| <xsl:variable name="cellpadding"> |
| <xsl:call-template name="pi.dbhtml_cellpadding"/> |
| </xsl:variable> |
| |
| <!-- First generate colgroup with attributes --> |
| <xsl:variable name="colgroup.with.attributes"> |
| <colgroup> |
| <xsl:call-template name="generate.colgroup"> |
| <xsl:with-param name="cols" select="@cols"/> |
| </xsl:call-template> |
| </colgroup> |
| </xsl:variable> |
| |
| <!-- then modify colgroup attributes with extension --> |
| <xsl:variable name="colgroup.with.extension"> |
| <xsl:choose> |
| <xsl:when test="$use.extensions != 0 |
| and $tablecolumns.extension != 0"> |
| <xsl:choose> |
| <xsl:when test="function-available('stbl:adjustColumnWidths')"> |
| <xsl:copy-of select="stbl:adjustColumnWidths($colgroup.with.attributes)"/> |
| </xsl:when> |
| <xsl:when test="function-available('xtbl:adjustColumnWidths')"> |
| <xsl:copy-of select="xtbl:adjustColumnWidths($colgroup.with.attributes)"/> |
| </xsl:when> |
| <xsl:when test="function-available('ptbl:adjustColumnWidths')"> |
| <xsl:copy-of select="ptbl:adjustColumnWidths($colgroup.with.attributes)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:message terminate="yes"> |
| <xsl:text>No adjustColumnWidths function available.</xsl:text> |
| </xsl:message> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:copy-of select="$colgroup.with.attributes"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <!-- Now convert to @style --> |
| <xsl:variable name="colgroup"> |
| <xsl:call-template name="colgroup.with.style"> |
| <xsl:with-param name="colgroup" select="$colgroup.with.extension"/> |
| </xsl:call-template> |
| </xsl:variable> |
| |
| <xsl:variable name="explicit.table.width"> |
| <xsl:call-template name="pi.dbhtml_table-width"> |
| <xsl:with-param name="node" select=".."/> |
| </xsl:call-template> |
| </xsl:variable> |
| |
| <xsl:variable name="table.width.candidate"> |
| <xsl:choose> |
| <xsl:when test="$explicit.table.width != ''"> |
| <xsl:value-of select="$explicit.table.width"/> |
| </xsl:when> |
| <xsl:when test="$default.table.width = ''"> |
| <xsl:text>100%</xsl:text> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$default.table.width"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| |
| <xsl:variable name="table.width"> |
| <xsl:if test="$default.table.width != '' |
| or $explicit.table.width != ''"> |
| <xsl:choose> |
| <xsl:when test="contains($table.width.candidate, '%')"> |
| <xsl:value-of select="$table.width.candidate"/> |
| </xsl:when> |
| <xsl:when test="$use.extensions != 0 |
| and $tablecolumns.extension != 0"> |
| <xsl:choose> |
| <xsl:when test="function-available('stbl:convertLength')"> |
| <xsl:value-of select="stbl:convertLength($table.width.candidate)"/> |
| </xsl:when> |
| <xsl:when test="function-available('xtbl:convertLength')"> |
| <xsl:value-of select="xtbl:convertLength($table.width.candidate)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:message terminate="yes"> |
| <xsl:text>No convertLength function available.</xsl:text> |
| </xsl:message> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$table.width.candidate"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:if> |
| </xsl:variable> |
| |
| <!-- assemble a table @style --> |
| <xsl:variable name="table.style"> |
| |
| <xsl:if test="$cellspacing != '' or $html.cellspacing != ''"> |
| <xsl:text>cellspacing: </xsl:text> |
| <xsl:choose> |
| <xsl:when test="$cellspacing != ''"> |
| <xsl:value-of select="$cellspacing"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$html.cellspacing"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:text>; </xsl:text> |
| </xsl:if> |
| |
| <xsl:if test="$cellpadding != '' or $html.cellpadding != ''"> |
| <xsl:text>cellpadding: </xsl:text> |
| <xsl:choose> |
| <xsl:when test="$cellpadding != ''"> |
| <xsl:value-of select="$cellpadding"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$html.cellpadding"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:text>; </xsl:text> |
| </xsl:if> |
| |
| <xsl:choose> |
| <xsl:when test="string-length($table.width) != 0"> |
| <xsl:text>width: </xsl:text> |
| <xsl:value-of select="$table.width"/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| <xsl:when test="../@pgwide=1 or local-name(.) = 'entrytbl'"> |
| <xsl:text>width: 100%; </xsl:text> |
| </xsl:when> |
| <xsl:otherwise> |
| </xsl:otherwise> |
| </xsl:choose> |
| |
| <xsl:choose> |
| <xsl:when test="../@frame='all' or (not(../@frame) and $default.table.frame='all')"> |
| <xsl:text>border-collapse: collapse; </xsl:text> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'top'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'bottom'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'left'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'right'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="../@frame='topbot' or (not(../@frame) and $default.table.frame='topbot')"> |
| <xsl:text>border-collapse: collapse;</xsl:text> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'top'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'bottom'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="../@frame='top' or (not(../@frame) and $default.table.frame='top')"> |
| <xsl:text>border-collapse: collapse;</xsl:text> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'top'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="../@frame='bottom' or (not(../@frame) and $default.table.frame='bottom')"> |
| <xsl:text>border-collapse: collapse;</xsl:text> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'bottom'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="../@frame='sides' or (not(../@frame) and $default.table.frame='sides')"> |
| <xsl:text>border-collapse: collapse;</xsl:text> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'left'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| <xsl:call-template name="border"> |
| <xsl:with-param name="side" select="'right'"/> |
| <xsl:with-param name="style" select="$table.frame.border.style"/> |
| <xsl:with-param name="color" select="$table.frame.border.color"/> |
| <xsl:with-param name="thickness" select="$table.frame.border.thickness"/> |
| </xsl:call-template> |
| </xsl:when> |
| <xsl:when test="../@frame='none'"> |
| <xsl:text>border: none;</xsl:text> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:text>border-collapse: collapse;</xsl:text> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <table> |
| <!-- HTML5: no table summary allowed --> |
| <xsl:if test="string-length($table.style) != 0"> |
| <xsl:attribute name="style"> |
| <xsl:value-of select="$table.style"/> |
| </xsl:attribute> |
| </xsl:if> |
| |
| |
| <xsl:copy-of select="$colgroup"/> |
| |
| <xsl:apply-templates select="thead"/> |
| <xsl:apply-templates select="tfoot"/> |
| <xsl:apply-templates select="tbody"/> |
| |
| <xsl:if test=".//footnote|../title//footnote"> |
| <tbody class="footnotes"> |
| <tr> |
| <td colspan="{@cols}"> |
| <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/> |
| </td> |
| </tr> |
| </tbody> |
| </xsl:if> |
| </table> |
| </xsl:template> |
| |
| <!-- HTML5: convert col attributes to col CSS styles --> |
| <xsl:template name="colgroup.with.style"> |
| <xsl:param name="colgroup"/> |
| |
| <xsl:variable name="colgroup.nodeset" select="exsl:node-set($colgroup)"/> |
| <xsl:apply-templates select="$colgroup.nodeset" mode="convert.to.style"/> |
| </xsl:template> |
| |
| <xsl:template match="colgroup" mode="convert.to.style"> |
| <xsl:copy> |
| <xsl:copy-of select="@*"/> |
| <xsl:apply-templates mode="convert.to.style"/> |
| </xsl:copy> |
| </xsl:template> |
| |
| <!-- HTML5: converts obsolete HTML attributes to CSS styles --> |
| <xsl:template match="*" mode="convert.to.style"> |
| |
| <xsl:variable name="style.from.atts"> |
| <xsl:for-each select="@*"> |
| |
| <xsl:choose> |
| <xsl:when test="local-name() = 'width'"> |
| <xsl:text>width: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| |
| <xsl:when test="local-name() = 'align'"> |
| <xsl:text>text-align: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| |
| <xsl:when test="local-name() = 'valign'"> |
| <xsl:text>vertical-align: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| |
| <xsl:when test="local-name() = 'border'"> |
| <xsl:text>border: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| |
| <xsl:when test="local-name() = 'cellspacing'"> |
| <xsl:text>border-spacing: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| |
| <xsl:when test="local-name() = 'cellpadding'"> |
| <xsl:text>padding: </xsl:text> |
| <xsl:value-of select="."/> |
| <xsl:text>; </xsl:text> |
| </xsl:when> |
| </xsl:choose> |
| </xsl:for-each> |
| </xsl:variable> |
| |
| <!-- merge existing styles with these new styles --> |
| <xsl:variable name="style"> |
| <xsl:value-of select="concat($style.from.atts, @style)"/> |
| </xsl:variable> |
| |
| <!-- HTML5: reserved for element name conversion if needed --> |
| <xsl:variable name="element.name"> |
| <xsl:value-of select="local-name(.)"/> |
| </xsl:variable> |
| |
| <xsl:element name="{$element.name}"> |
| <xsl:if test="string-length($style) != 0"> |
| <xsl:attribute name="style"> |
| <xsl:value-of select="$style"/> |
| </xsl:attribute> |
| </xsl:if> |
| <!-- Also skip disallowed summary attributes --> |
| <xsl:copy-of select="@*[local-name(.) != 'width' and |
| local-name(.) != 'summary' and |
| local-name(.) != 'border' and |
| local-name(.) != 'cellspacing' and |
| local-name(.) != 'cellpadding' and |
| local-name(.) != 'style' and |
| local-name(.) != 'align' and |
| local-name(.) != 'valign']"/> |
| <xsl:apply-templates mode="convert.to.style"/> |
| </xsl:element> |
| </xsl:template> |
| |
| <!-- HTML5: convert some attributes to CSS style attribute --> |
| <xsl:template match="entry|entrytbl"> |
| <xsl:param name="col"> |
| <xsl:choose> |
| <xsl:when test="@revisionflag"> |
| <xsl:number from="row"/> |
| </xsl:when> |
| <xsl:otherwise>1</xsl:otherwise> |
| </xsl:choose> |
| </xsl:param> |
| |
| <xsl:param name="spans"/> |
| |
| |
| <!-- Process with stock template --> |
| <xsl:variable name="cell"> |
| <xsl:call-template name="entry"> |
| <xsl:with-param name="col" select="$col"/> |
| <xsl:with-param name="spans" select="$spans"/> |
| </xsl:call-template> |
| </xsl:variable> |
| |
| <xsl:variable name="cell.nodes" select="exsl:node-set($cell)"/> |
| |
| <xsl:apply-templates select="$cell.nodes" mode="convert.to.style"/> |
| |
| </xsl:template> |
| |
| <xsl:template match="mediaobject|inlinemediaobject"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="qandaset"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="calloutlist|revhistory|footnote|figure|co"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="revhistory" mode="titlepage.mode"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="variablelist"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="orderedlist[@inheritnum = 'inherit']"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="simplelist"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="blockquote"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="note|important|warning|caution|tip"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="funcprototype" mode="ansi-tabular"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template match="funcprototype" mode="kr-tabular"> |
| <xsl:call-template name="convert.styles"/> |
| </xsl:template> |
| |
| <xsl:template name="convert.styles"> |
| <xsl:param name="content"> |
| <xsl:apply-imports/> |
| </xsl:param> |
| <xsl:variable name="nodes" select="exsl:node-set($content)"/> |
| |
| <xsl:apply-templates mode="convert.to.style" select="$nodes"/> |
| </xsl:template> |
| |
| <!-- HTML5: link rel="home" is not permitted --> |
| <!-- Add support for attributes on <html> element --> |
| <xsl:template match="*" mode="process.root"> |
| <xsl:variable name="doc" select="self::*"/> |
| |
| <xsl:call-template name="user.preroot"/> |
| <xsl:call-template name="root.messages"/> |
| |
| <html> |
| <xsl:call-template name="root.attributes"/> |
| <head> |
| <xsl:call-template name="system.head.content"> |
| <xsl:with-param name="node" select="$doc"/> |
| </xsl:call-template> |
| <xsl:call-template name="head.content"> |
| <xsl:with-param name="node" select="$doc"/> |
| </xsl:call-template> |
| <xsl:call-template name="user.head.content"> |
| <xsl:with-param name="node" select="$doc"/> |
| </xsl:call-template> |
| </head> |
| <body> |
| <xsl:call-template name="body.attributes"/> |
| <xsl:call-template name="user.header.content"> |
| <xsl:with-param name="node" select="$doc"/> |
| </xsl:call-template> |
| <xsl:apply-templates select="."/> |
| <xsl:call-template name="user.footer.content"> |
| <xsl:with-param name="node" select="$doc"/> |
| </xsl:call-template> |
| </body> |
| </html> |
| <xsl:value-of select="$html.append"/> |
| |
| <!-- Generate any css files only once, not once per chunk --> |
| <xsl:call-template name="generate.css.files"/> |
| </xsl:template> |
| |
| <xsl:template name="root.attributes"> |
| </xsl:template> |
| |
| <!-- HTML5: uses <ul> instead of <dl> for TOC --> |
| <xsl:template match="question" mode="qandatoc.mode"> |
| <xsl:variable name="firstch"> |
| <!-- Use a titleabbrev or title if available --> |
| <xsl:choose> |
| <xsl:when test="../blockinfo/titleabbrev"> |
| <xsl:apply-templates select="../blockinfo/titleabbrev[1]/node()"/> |
| </xsl:when> |
| <xsl:when test="../blockinfo/title"> |
| <xsl:apply-templates select="../blockinfo/title[1]/node()"/> |
| </xsl:when> |
| <xsl:when test="../info/titleabbrev"> |
| <xsl:apply-templates select="../info/titleabbrev[1]/node()"/> |
| </xsl:when> |
| <xsl:when test="../titleabbrev"> |
| <xsl:apply-templates select="../titleabbrev[1]/node()"/> |
| </xsl:when> |
| <xsl:when test="../info/title"> |
| <xsl:apply-templates select="../info/title[1]/node()"/> |
| </xsl:when> |
| <xsl:when test="../title"> |
| <xsl:apply-templates select="../title[1]/node()"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:apply-templates select="(*[local-name(.)!='label'])[1]/node()"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| <xsl:variable name="deflabel"> |
| <xsl:choose> |
| <xsl:when test="ancestor-or-self::*[@defaultlabel]"> |
| <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()] |
| /@defaultlabel"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$qanda.defaultlabel"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <li> |
| <a> |
| <xsl:attribute name="href"> |
| <xsl:call-template name="href.target"> |
| <xsl:with-param name="object" select=".."/> |
| </xsl:call-template> |
| </xsl:attribute> |
| <xsl:apply-templates select="." mode="label.markup"/> |
| <xsl:if test="contains($deflabel,'number') and not(label)"> |
| <xsl:apply-templates select="." mode="intralabel.punctuation"/> |
| </xsl:if> |
| <xsl:text> </xsl:text> |
| <xsl:value-of select="$firstch"/> |
| </a> |
| <!-- * include nested qandaset/qandaentry in TOC if user wants it --> |
| |
| <xsl:if test="not($qanda.nested.in.toc = 0)"> |
| <xsl:apply-templates select="following-sibling::answer" mode="qandatoc.mode"/> |
| </xsl:if> |
| </li> |
| </xsl:template> |
| |
| <xsl:template match="answer" mode="qandatoc.mode"> |
| <xsl:if test="descendant::question"> |
| <xsl:call-template name="process.qanda.toc"/> |
| </xsl:if> |
| </xsl:template> |
| |
| <!-- html5 uses <ul> instead of <dl> for toc --> |
| <xsl:template name="process.qanda.toc"> |
| <ul> |
| <xsl:apply-templates select="qandadiv" mode="qandatoc.mode"/> |
| <xsl:apply-templates select="qandaset|qandaentry" mode="qandatoc.mode"/> |
| </ul> |
| </xsl:template> |
| |
| <xsl:template match="qandadiv" mode="qandatoc.mode"> |
| <!-- |
| <dt><xsl:apply-templates select="title" mode="qandatoc.mode"/></dt> |
| <dd><xsl:call-template name="process.qanda.toc"/></dd> |
| --> |
| <li> |
| <xsl:apply-templates select="title" mode="qandatoc.mode"/> |
| <xsl:call-template name="process.qanda.toc"/> |
| </li> |
| </xsl:template> |
| |
| <xsl:template match="audiodata"> |
| <xsl:variable name="filename"> |
| <xsl:call-template name="mediaobject.filename"> |
| <xsl:with-param name="object" select=".."/> |
| </xsl:call-template> |
| </xsl:variable> |
| |
| <audio> |
| <xsl:call-template name="common.html.attributes"/> |
| |
| <xsl:attribute name="src"> |
| <xsl:value-of select="$filename"/> |
| </xsl:attribute> |
| |
| <xsl:apply-templates select="@*"/> |
| <xsl:apply-templates select="../multimediaparam"/> |
| |
| <!-- add any fallback content --> |
| <xsl:call-template name="audio.fallback"/> |
| </audio> |
| </xsl:template> |
| |
| <!-- generate <video> element for html5 --> |
| <xsl:template match="videodata"> |
| <xsl:variable name="filename"> |
| <xsl:call-template name="mediaobject.filename"> |
| <xsl:with-param name="object" select=".."/> |
| </xsl:call-template> |
| </xsl:variable> |
| |
| <video> |
| <xsl:call-template name="common.html.attributes"/> |
| |
| <xsl:attribute name="src"> |
| <xsl:value-of select="$filename"/> |
| </xsl:attribute> |
| |
| <xsl:call-template name="video.poster"/> |
| |
| <xsl:apply-templates select="@*[local-name() != 'fileref']"/> |
| <xsl:apply-templates select="../multimediaparam"/> |
| |
| <!-- add any fallback content --> |
| <xsl:call-template name="video.fallback"/> |
| </video> |
| </xsl:template> |
| |
| <!-- use only an imageobject with @role = 'poster' --> |
| <xsl:template name="video.poster"> |
| <xsl:variable name="imageobject" select="../../imageobject[@role = 'poster'][1]"/> |
| <xsl:if test="$imageobject"> |
| <xsl:attribute name="poster"> |
| <xsl:value-of select="$imageobject/imagedata/@fileref"/> |
| </xsl:attribute> |
| </xsl:if> |
| </xsl:template> |
| |
| <xsl:template match="videodata/@fileref"> |
| <!-- already handled by videodata template --> |
| </xsl:template> |
| |
| <xsl:template match="audiodata/@fileref"> |
| <!-- already handled by audiodata template --> |
| </xsl:template> |
| |
| <xsl:template match="videodata/@contentwidth"> |
| <xsl:attribute name="width"> |
| <xsl:value-of select="."/> |
| </xsl:attribute> |
| </xsl:template> |
| |
| <xsl:template match="videodata/@contentdepth"> |
| <xsl:attribute name="height"> |
| <xsl:value-of select="."/> |
| </xsl:attribute> |
| </xsl:template> |
| |
| <xsl:template match="videodata/@depth"> |
| <xsl:attribute name="height"> |
| <xsl:value-of select="."/> |
| </xsl:attribute> |
| </xsl:template> |
| |
| <!-- pass through these attributes --> |
| <xsl:template match="videodata/@autoplay | |
| videodata/@controls | |
| audiodata/@autoplay | |
| audiodata/@controls"> |
| <xsl:copy-of select="."/> |
| </xsl:template> |
| |
| <xsl:template match="videodata/@*" priority="-1"> |
| <!-- Do nothing with the rest of the attributes --> |
| </xsl:template> |
| |
| <xsl:template match="audiodata/@*" priority="-1"> |
| <!-- Do nothing with the rest of the attributes --> |
| </xsl:template> |
| |
| <xsl:template match="multimediaparam"> |
| <xsl:call-template name="process.multimediaparam"> |
| <xsl:with-param name="object" select=".."/> |
| <xsl:with-param name="param.name" select="@name"/> |
| <xsl:with-param name="param.value" select="@value"/> |
| </xsl:call-template> |
| </xsl:template> |
| |
| <!-- Determines the best value of a media attribute from the |
| attributes and multimediaparam elements --> |
| <xsl:template name="process.multimediaparam"> |
| <xsl:param name="object" select="NOTANELEMENT"/> |
| <xsl:param name="param.name"/> |
| <xsl:param name="param.value"/> |
| |
| <xsl:choose> |
| <xsl:when test="$object/*/@*[local-name(.) = $param.name]"> |
| <!-- explicit attribute with that name takes precedence --> |
| <xsl:attribute name="{$param.name}"> |
| <xsl:value-of select="$object/*/@*[local-name(.) = $param.name]"/> |
| </xsl:attribute> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:attribute name="{$param.name}"> |
| <xsl:value-of select="$param.value"/> |
| </xsl:attribute> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <xsl:template name="video.fallback"> |
| <xsl:param name="videodata" select="."/> |
| <xsl:variable name="textobject" select="$videodata/../../textobject"/> |
| |
| <xsl:apply-templates select="$textobject" mode="fallback"/> |
| </xsl:template> |
| |
| <xsl:template name="audio.fallback"> |
| <xsl:param name="audiodata" select="."/> |
| <xsl:variable name="textobject" select="$audiodata/../../textobject"/> |
| |
| <xsl:apply-templates select="$textobject" mode="fallback"/> |
| </xsl:template> |
| |
| <xsl:template match="textobject" mode="fallback"> |
| <div> |
| <xsl:apply-templates select="." mode="class.attribute"/> |
| <xsl:apply-templates/> |
| </div> |
| </xsl:template> |
| |
| <!-- HTML5: no body attributes --> |
| <xsl:template name="body.attributes"/> |
| |
| </xsl:stylesheet> |