GitBucket
4.21.2
Toggle navigation
Snippets
Sign in
Files
Branches
1
Releases
1
Issues
Pull requests
Labels
Priorities
Milestones
Wiki
Forks
nigel.stanger
/
XML
Browse code
Added new template for handling "document/title" when in "chapter" mode, used for special "chapters" such as laboratories and tutorials.
master
OLD_GRAPHICS_HANDLING
1 parent
74b6e68
commit
d27c09ed10b24d4fdac1fbdc7d50f17bd02fd512
cedwards
authored
on 27 Feb 2004
Patch
Showing
2 changed files
format-master.xml
xml2xslt.xsl
Ignore Space
Show notes
View
format-master.xml
<?xml version="1.0"?> <!-- This will mostly be a list of element names to match, along with the corresponding HTML and LaTeX handling XSLT code. --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <template name="PaperCode" match="PaperCode"> <latex><xsl:value-of select="$department"/>~<xsl:value-of select="$paper"/></latex> <html> <xsl:value-of select="$department"/> <xsl:text disable-output-escaping="yes">&nbsp;</xsl:text> <xsl:value-of select="$paper"/> </html> </template> <template name="OracleServer" match="OracleServer"> <latex>Oracle9\textit{i}</latex> <html>Oracle9<I>i</I></html> </template> <template name="Blackboard" match="Blackboard"> <common> <xsl:call-template name="hyperlink-internal"> <xsl:with-param name="url">http://blackboard.otago.ac.nz/</xsl:with-param> <xsl:with-param name="label">Blackboard</xsl:with-param> </xsl:call-template> </common> </template> <!-- Plain paragraph. @indent: Whether or not to indent this paragraph (probably only relevant in LaTeX). 'no' => don't indent. otherwise => apply standard paragraph formatting. [default] --> <template name="paragraph" match="paragraph|para|p|P"> <latex><xsl:text> </xsl:text><xsl:if test="@indent = 'no'">\noindent </xsl:if><xsl:apply-templates/><xsl:text> </xsl:text></latex> <!-- HTML is weird about what things you cannot include inside paragraphs (e.g. lists of any kind). However, the end P tag is optional, so one option might simply be not to output it. --> <html><P><xsl:apply-templates/></P></html> </template> <!-- Special characters (should maybe all be named, in case they need to be called explicitly with xsl:call-template) --> <!-- I'd like to use the Unicode names for these; will look them up some time! --> <template name="newline" match="newline"> <latex><xsl:text> \\</xsl:text></latex> <html><BR/></html> </template> <template name="page-break" match="page-break|new-page"> <latex>\newpage</latex> </template> <template name="non-breaking-space" match="non-breaking-space|nbsp"> <latex>~</latex> <html><xsl:text disable-output-escaping="yes">&nbsp;</xsl:text></html> </template> <template name="non-breaking-space-math" match="non-breaking-space|nbsp" mode="math"> <latex>~</latex> <html><xsl:text disable-output-escaping="yes">&nbsp;</xsl:text></html> </template> <!-- Technically we don't need to disable output escaping for all of these, but it's probably better to code them all consistently, rather than trying to figure out which ones do need it (e.g.,   for a non-breaking space) and which ones don't (e.g., &). --> <template name="ellipsis-sign" match="ellipsis-sign|etc|ellipsis|dots"> <latex>{\ldots}</latex> <html><xsl:text disable-output-escaping="yes">&#8230;</xsl:text></html> </template> <!-- Misc typographic symbols --> <template name="endash" match="endash|en-dash"> <latex>--</latex> <html><xsl:text disable-output-escaping="yes">&#8211;</xsl:text></html> </template> <template name="emdash" match="emdash|em-dash"> <latex>---</latex> <html><xsl:text disable-output-escaping="yes">&#8212;</xsl:text></html> </template> <template name="apostrophe" match="apostrophe"> <latex>'</latex> <html><xsl:text disable-output-escaping="yes">&#8217;</xsl:text></html> </template> <template name="dollar" match="dollar"> <latex>{\$}</latex> <html>$</html> </template> <template name="percent-sign" match="percent-sign"> <latex>{\%}</latex> <html>%</html> </template> <template name="ampersand" match="ampersand"> <latex>{\&}</latex> <html><xsl:text disable-output-escaping="yes">&amp;</xsl:text></html> </template> <template name="trademark-sign" match="trademark-sign|trademark|TM"> <latex>{\texttrademark}</latex> <html><xsl:text disable-output-escaping="yes">&#8482;</xsl:text></html> </template> <template name="copyright-sign" match="copyright-sign"> <latex>{\copyright}</latex> <html><xsl:text disable-output-escaping="yes">&#169;</xsl:text></html> </template> <template name="degree-sign" match="degree-sign|degrees"> <latex>\(^{\circ}\)</latex> <html><xsl:text disable-output-escaping="yes">&#176;</xsl:text></html> </template> <template name="section-sign" match="section-sign"> <latex>{\S}</latex> <html><xsl:text disable-output-escaping="yes">&#167;</xsl:text></html> </template> <template name="paragraph-sign" match="paragraph-sign"> <latex>{\P}</latex> <html><xsl:text disable-output-escaping="yes">&#182;</xsl:text></html> </template> <!-- I think the pi symbol is only available in LaTeX in math mode, but if we're already in math mode, the extra $ signs will mess things up... --> <!-- Can we use XSLT modes to deal with this? --> <!-- Looks like a "yes": --> <template name="pi-math" match="pi" mode="math"> <latex>{\pi}</latex> <html><xsl:text disable-output-escaping="yes">&#960;</xsl:text></html> </template> <!-- When not in math mode: --> <template name="pi-normal" match="pi"> <latex>\(\pi\)</latex> <html><xsl:text disable-output-escaping="yes">&#960;</xsl:text></html> </template> <template name="LaTeX" match="LaTeX|latex"> <latex>{\LaTeX}</latex> <html>L<SUP>A</SUP>T<SUB>E</SUB>X</html> </template> <!-- Note: no equivalent of \triangleright in HTML, use right arrow instead. --> <template name="menu-separator" match="menu-separator|menusep"> <latex>\(\triangleright\)</latex> <html><xsl:text disable-output-escaping="yes">&#8594;</xsl:text></html> </template> <template name="menu-item" match="menu/item"> <latex>\menuitem{<xsl:apply-templates/>}</latex> <html><B><xsl:apply-templates/></B></html> </template> <!-- Special styles --> <template name="emph" match="emph"> <latex>\emph{<xsl:apply-templates/>}</latex> <html><EM><xsl:apply-templates/></EM></html> </template> <template name="italic" match="italic"> <latex>\textit{<xsl:apply-templates/>}</latex> <html><I><xsl:apply-templates/></I></html> </template> <template name="strong" match="strong"> <latex>\textbf{<xsl:apply-templates/>}</latex> <html><STRONG><xsl:apply-templates/></STRONG></html> </template> <template name="bold" match="bold"> <latex>\textbf{<xsl:apply-templates/>}</latex> <html><B><xsl:apply-templates/></B></html> </template> <template name="term" match="term"> <latex>\term{<xsl:apply-templates/>}</latex> <html><I CLASS="term"><xsl:apply-templates/></I></html> </template> <template name="foreign" match="foreign"> <latex>\foreign{<xsl:apply-templates/>}</latex> <html><I CLASS="foreign"><xsl:apply-templates/></I></html> </template> <template name="code" match="code"> <!-- <latex>\code{<xsl:apply-templates/>}</latex> --> <latex>\verb+<xsl:apply-templates/>+</latex> <html><CODE><xsl:apply-templates/></CODE></html> </template> <!-- Non-maths super- and subscript. --> <template name="superscript" match="superscript"> <latex>\(^{<xsl:apply-templates/>}\)</latex> <html><SUP><xsl:apply-templates/></SUP></html> </template> <template name="subscript" match="subscript"> <latex>\(_{<xsl:apply-templates/>}\)</latex> <html><SUB><xsl:apply-templates/></SUB></html> </template> <!-- Text that shouldn't be broken across a line (i.e., LaTeX \mbox). Only really relevant for LaTeX because we can't control this in HTML. --> <template name="no-break" match="no-break|mbox"> <latex>\mbox{<xsl:apply-templates/>}</latex> <html><xsl:apply-templates/></html> </template> <!-- We can decide later whether to use plain verbatim or listings. --> <template name="code-block" match="code-block"> <latex> \begin{verbatim} <xsl:apply-templates/> \end{verbatim} </latex> <html> <PRE CLASS="code"><xsl:apply-templates/></PRE> </html> </template> <!-- This is for stuff that should unequivocally be treated verbatim (e.g. problem code). --> <template name="verbatim" match="verbatim"> <latex> \begin{verbatim} <xsl:apply-templates/> \end{verbatim} </latex> <html> <PRE><xsl:apply-templates/></PRE> </html> </template> <!-- Quoted text. Handles nested quotes correctly. @single: Whether to enclose the text in single or double quotes. 'yes' => single quotes (''). otherwise => double quotes (""). [default] --> <template name="single-quote" match="quote[@single='yes']|q[@single='yes']"> <latex>`<xsl:apply-templates/>'</latex> <html> <xsl:text disable-output-escaping="yes">&#8216;</xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes">&#8217;</xsl:text> </html> </template> <template name="double-quote" match="quote|qq"> <latex>``<xsl:apply-templates/>''</latex> <html> <xsl:text disable-output-escaping="yes">&#8220;</xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes">&#8221;</xsl:text> </html> </template> <!-- With nested quotes, we need to figure out what depth of nesting we're at, then call the appropriate template depending on the initial quoting style (single or double). --> <template name="nested-double-quote" match="quote//quote"> <common> <xsl:choose> <xsl:when test="(count(ancestor::quote) mod 2) = 0"> <xsl:call-template name="double-quote"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="single-quote"/> </xsl:otherwise> </xsl:choose> </common> </template> <template name="nested-single-quote" match="quote[@single='yes']//quote" priority="2"> <common> <xsl:choose> <xsl:when test="(count(ancestor::quote) mod 2) = 0"> <xsl:call-template name="single-quote"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="double-quote"/> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Environments (in the LaTeX terminology): enumerated, ordered, and numbered lists. --> <!-- Unordered lists --> <template name="itemised-list" match="itemised-list|itemize|unordered-list|bulleted-list|bullet-list|bullet-points|UL|ul"> <latex> \begin{itemize} <xsl:apply-templates/> \end{itemize} </latex> <html> <UL> <xsl:apply-templates/> </UL> </html> </template> <!-- Ordered lists --> <template name="enumerated-list" match="enumerated-list|enumerate|ordered-list|numbered-list|question-list|OL|ol"> <latex> \begin{enumerate} <xsl:apply-templates/> \end{enumerate} </latex> <html> <OL> <xsl:apply-templates/> </OL> </html> </template> <!-- Definition or description lists. --> <template name="definition-list" match="definition-list|description-list|DL|dl"> <latex> \begin{description} <xsl:apply-templates mode="definition-list"/> \end{description} </latex> <html> <!-- Hmm, <DL>s in HTML tend to come out with the spacing a bit wrong (or maybe it's just my browser?). Might using a table be better? Messy if the keyword is long, though, and you don't get a proper hanging indent... Maybe this is something that could be handled in CSS instead. --> <DL> <xsl:apply-templates mode="definition-list"/> </DL> <!-- <TABLE BORDER="0" CELLPADDING="10"> --> <!-- <xsl:apply-templates/> --> <!-- </TABLE> --> </html> </template> <!-- List elements --> <template name="item" match="item"> <latex><xsl:text>\item </xsl:text><xsl:apply-templates/></latex> <html> <xsl:choose> <xsl:when test="count(paragraph|para|p) != 0"> <LI><xsl:apply-templates/></LI> </xsl:when> <xsl:otherwise> <LI><P><xsl:apply-templates/></P></LI> </xsl:otherwise> </xsl:choose> </html> </template> <template name="definition-item" match="item" mode="definition-list"> <latex> <xsl:text>\item[</xsl:text> <xsl:apply-templates select="keyword|topic|DT|dt"/> <xsl:text>] </xsl:text> <xsl:apply-templates select="definition|description|discourse|DD|dd"/> </latex> <html> <DT><P><xsl:apply-templates select="keyword|topic|DT|dt"/></P></DT> <DD><xsl:apply-templates select="definition|description|discourse|DD|dd"/></DD> <!-- <TR VALIGN="TOP"> --> <!-- <TD><P><xsl:apply-templates select="keyword"/></P></TD> --> <!-- <TD><xsl:apply-templates select="definition|description|discourse"/></TD> --> <!-- </TR> --> </html> </template> <template name="keyword" match="keyword|topic|DT|dt"> <latex><xsl:apply-templates/></latex> <html><STRONG><xsl:apply-templates/></STRONG></html> </template> <!-- Need to provide some context here as, e.g., <description> is also used within <image>. --> <template name="definition" match="item/definition|item/description|item/discourse|item/DD|item/dd"> <latex><xsl:apply-templates/></latex> <html> <xsl:choose> <xsl:when test="count(paragraph|para|p) != 0"> <xsl:apply-templates/> </xsl:when> <xsl:otherwise> <P><xsl:apply-templates/></P> </xsl:otherwise> </xsl:choose> </html> </template> <!-- Sample answers, which may optionally be excluded from the output. --> <template name="answer" match="answer"> <latex> <!-- It's nice to weed out the sample answer markup at the XSLT processing stage to make LaTeX run faster. Note that \showanswers still needs to be called so that LaTeX can format chapter headings like "Answers for ..." --> <xsl:if test="$showanswers='yes'"> \begin{answer} <xsl:apply-templates/> \end{answer} </xsl:if> </latex> <html> <xsl:if test="$showanswers='yes'"> <DIV CLASS="answer"> <xsl:apply-templates/> </DIV> </xsl:if> </html> </template> <!-- Sections, subsections, subsubsections, ... @label: A label that can be used for cross referencing. Any value can be used, as long as it's a legal identifier in both LaTeX and HTML. --> <template name="section" match="section"> <latex> <xsl:apply-templates> <xsl:with-param name="label"> <xsl:value-of select="@label"/> <xsl:if test="not(@label)">THERE_IS_NO_LABEL</xsl:if> </xsl:with-param> </xsl:apply-templates> </latex> <html> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:apply-templates/> <!-- Since HTML doesn't really support footnotes as such, include them as "section notes" instead. --> <xsl:if test="count(.//footnote) > 0"> <P><STRONG>Notes:</STRONG></P> <xsl:apply-templates select=".//footnote" mode="list"/> </xsl:if> </html> </template> <!-- Footnotes. --> <template name="footnote" match="footnote"> <latex>\footnote{<xsl:apply-templates/>}</latex> <html> <A> <xsl:attribute name="NAME"> <xsl:text>footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-source</xsl:text> </xsl:attribute> <xsl:attribute name="HREF"> <xsl:text>#footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-target</xsl:text> </xsl:attribute> <xsl:text>[</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>]</xsl:text> </A> </html> </template> <!-- This is only required for HTML, as LaTeX does it all for you. --> <template name="footnote-list" match="footnote" mode="list"> <html> <P> <A> <xsl:attribute name="NAME"> <xsl:text>footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-target</xsl:text> </xsl:attribute> <xsl:text>[</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>]</xsl:text> </A> <xsl:text> </xsl:text> <xsl:apply-templates/> <xsl:text> </xsl:text> <!-- Provide a back link to the original footnote marker. --> <A> <xsl:attribute name="HREF"> <xsl:text>#footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-source</xsl:text> </xsl:attribute> <xsl:text>[Back]</xsl:text> </A> </P> </html> </template> <!-- Document preamble stuff: title, author, date. --> <template name="preamble-title" match="document/title" mode="preamble"> <latex>\title{<xsl:apply-templates/>}</latex> <html> <xsl:apply-templates/> </html> </template> <template name="preamble-author" match="document/author" mode="preamble"> <latex>\author{<xsl:apply-templates/>}</latex> </template> <template name="preamble-date" match="document/date" mode="preamble"> <latex>\date{<xsl:apply-templates/>}</latex> </template> <template name="document-title" match="document/title"> <!-- Need to do something sensible for LaTeX here. --> <latex> <!-- Under the LaTeX framework, the rest of the chapter title text is generated by LaTeX macros, so this is pretty simple. --> <xsl:if test="/document/@standalone = 'yes'"><xsl:apply-templates/></xsl:if> </latex> <html> <xsl:choose> <xsl:when test="/document/@class = 'tutorial'"> <H1><xsl:call-template name="PaperCode"/> Tutorial <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:when test="/document/@class = 'laboratory'"> <H1><xsl:call-template name="PaperCode"/> Lab <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:otherwise> <H1><xsl:apply-templates/></H1> </xsl:otherwise> </xsl:choose> </html> </template> <template name="chapter-title" match="document/title" mode="chapter"> <latex> <xsl:apply-templates/> </latex> <html> <xsl:choose> <xsl:when test="/document/@class = 'tutorial'"> <H1><xsl:call-template name="PaperCode"/> Tutorial <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:when test="/document/@class = 'laboratory'"> <H1><xsl:call-template name="PaperCode"/> Lab <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:otherwise> <H1><xsl:apply-templates/></H1> </xsl:otherwise> </xsl:choose> </html> </template> <template name="document-author" match="document/author"/> <template name="document-date" match="document/date"/> <!-- Generate some number of "sub"s so we can produce, e.g., "subsubsection" for LaTeX. $depth: the number of repetitions (0 <= $depth <= 2, but there's no need to do bounds checking at the upper end, because that's already dealt with in the "section-title" template below). --> <template name="generate-subs"> <latex> <xsl:param name="depth">1</xsl:param> <xsl:if test="$depth > 1"> <xsl:text>sub</xsl:text> <xsl:call-template name="generate-subs"> <xsl:with-param name="depth"><xsl:value-of select="$depth - 1"/></xsl:with-param> </xsl:call-template> </xsl:if> </latex> </template> <!-- Generate section title with nested numbering, e.g., 1.1.3. --> <template name="section-title" match="section/title"> <latex> <xsl:param name="label"/> <xsl:text>\</xsl:text> <!-- Generate the correct number of "sub"s for LaTeX. --> <xsl:call-template name="generate-subs"> <xsl:with-param name="depth"> <xsl:number value="count(ancestor::section)"/> <xsl:if test="count(ancestor::section) > 3">3</xsl:if> </xsl:with-param> </xsl:call-template> <xsl:text>section{</xsl:text> <xsl:apply-templates/><xsl:text>}</xsl:text> <xsl:if test="$label != 'THERE_IS_NO_LABEL'"> \label{<xsl:value-of select="$label"/>} </xsl:if> </latex> <html> <!-- The depth is used in a couple of places, so we pre-calculate it. --> <xsl:variable name="depth"> <xsl:number value="1 + count(ancestor::section)"/> <xsl:if test="1 + count(ancestor::section) > 6">6</xsl:if> </xsl:variable> <xsl:text disable-output-escaping="yes"><H</xsl:text><xsl:number value="$depth"/><xsl:text disable-output-escaping="yes">></xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1"/> <xsl:text> </xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes"></H</xsl:text><xsl:number value="$depth"/><xsl:text disable-output-escaping="yes">></xsl:text> </html> </template> <!-- A quotation. @align: The alignment of the quotation paragraph. 'left' [default] 'center' 'right' --> <template name="quotation" match="quotation"> <latex> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>\begin{flush</xsl:text> <xsl:value-of select="@align"/> <xsl:text>}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{flush</xsl:text> <xsl:value-of select="@align"/> <xsl:text>}</xsl:text> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>\begin{center}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{center}</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>\begin{quote}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{quote}</xsl:text> </xsl:otherwise> </xsl:choose> </latex> <!-- Nominally we should use <BLOCKQUOTE>, but it doesn't have alignment. --> <html> <P> <xsl:if test="@align"> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> </xsl:attribute> </xsl:if> <I><xsl:apply-templates/></I> </P> </html> </template> <!-- Anything inside a <metadata> is ignored completely. (More accurately, we pick bits out of it manually as required; it's only ignored by apply-templates.) --> <template name="metadata" match="metadata"/> <!-- Anything inside an <omit> is also ignored completely. --> <template name="omit" match="omit"/> <!-- ...and the legacy id tags inside figures. --> <template match="figure/id"/> <template match="figure/label"/> <!-- Comments are not quite ignored completely, as they're carried through to the output document (kind of: "It is an error if instantiating the content of xsl:comment creates nodes other than text nodes.") --> <template name="comment" match="comment"> <latex> <xsl:text> \begin{comment}</xsl:text> <xsl:apply-templates/> <xsl:text>\end{comment} </xsl:text> </latex> <html> <xsl:comment> <xsl:apply-templates/> </xsl:comment> </html> </template> <!-- Tabular structures (LaTeX {tabular}, HTML <TABLE>). @align: The alignment of the table as a whole. 'left' [default] 'center' 'right' @border: Width of cell border for HTML tables. --> <template name="tabular" match="tabular"> <latex> <!-- Overall table alignment. --> <xsl:text>\begin{</xsl:text> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>flush</xsl:text><xsl:value-of select="@align"/> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>center</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>flushleft</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> \begin{tabular}{<xsl:apply-templates select="columns"/>} <xsl:apply-templates select="tabular-header"/> <xsl:apply-templates select="tabular-body"/> <xsl:apply-templates select="tabular-footer"/> \end{tabular} <xsl:text>\end{</xsl:text> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>flush</xsl:text><xsl:value-of select="@align"/> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>center</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>flushleft</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> <html> <TABLE> <xsl:attribute name="BORDER"> <xsl:value-of select="@border"/> <xsl:if test="not(@border)">0</xsl:if> </xsl:attribute> <xsl:if test="@align"> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> </xsl:attribute> </xsl:if> <!-- Note different ordering of tabular components: HTML requires THEAD and TFOOT to precede TBODY. --> <xsl:apply-templates select="tabular-header"/> <xsl:apply-templates select="tabular-footer"/> <xsl:apply-templates select="tabular-body"/> </TABLE> </html> </template> <!-- Specify column formatting, mainly for LaTeX, although HTML does get <TD> ALIGN values from here. @align: The alignment of this particular column. 'left' [default] 'center' 'right' @left-border: Set to '|' to include a column separator to the left of this column. @right-border: Set to '|' to include a column separator to the right of this column. Careful: including a right-border on a cell and a left-border on the next cell will produce '||', not '|'. BUT, when doing multi-column or multi-row cells, always include both borders if required, because \multicolumn overrides the default border specification. --> <template name="aligned-column" match="column[@align]"> <latex> <xsl:value-of select="@left-border"/> <xsl:value-of select="substring(@align, 1, 1)"/> <xsl:value-of select="@right-border"/> </latex> </template> <template name="unaligned-column" match="column[not(@align)]"> <latex> <xsl:value-of select="@left-border"/> <xsl:text>l</xsl:text> <xsl:value-of select="@right-border"/> </latex> </template> <template name="tabular-header" match="tabular-header"> <latex></latex> <html> <THEAD> <xsl:apply-templates/> </THEAD> </html> </template> <template name="tabular-footer" match="tabular-footer"> <latex></latex> <html> <TFOOT> <xsl:apply-templates/> </TFOOT> </html> </template> <template name="tabular-body" match="tabular-body"> <latex><xsl:apply-templates/></latex> <html> <TBODY> <xsl:apply-templates/> </TBODY> </html> </template> <!-- @no-page-break: Inhibit page breaks after this row (LaTeX only). --> <template name="row" match="row"> <latex> <xsl:apply-templates/> <xsl:text> \\</xsl:text> <xsl:if test="@no-page-break = 'yes'">*</xsl:if> <xsl:text> </xsl:text> </latex> <html> <TR> <xsl:if test="@valign"> <xsl:attribute name="VALIGN"><xsl:value-of select="@valign"/></xsl:attribute> </xsl:if> <xsl:apply-templates/> </TR> </html> </template> <!-- Horizontal rules (LaTeX only). @columns: The column range to draw the rule across. Specify as you would for a \cline in LaTeX, e.g., '3-5'. If omitted, the rule is drawn across all columns. --> <template name="row-rule-full" match="row-rule[not(@columns)]"> <latex><xsl:text>\hline </xsl:text></latex> </template> <template name="row-rule-partial" match="row-rule[@columns]"> <latex>\cline{<xsl:value-of select="@columns"/>}</latex> </template> <!-- Hmm, the multi-row stuff is somewhat broken in LaTeX, oops. Need to insert missing columns (as was done in the calendar XSL) when a multi-row cell is encountered. Also need to sort out \hlines in the presence of multi-row cells and also what happens to vertical cell borders :( This probably needs reworking. --> <!-- Multi-row cells (LaTeX only, as this is pretty trivial to achieve in HTML). @rows: The number of rows this cell spans. --> <template name="multirow-cell" match="cell" mode="multi-row"> <latex> <xsl:text>\multirow{</xsl:text> <xsl:value-of select="@rows"/> <xsl:text>}{*}{</xsl:text> <xsl:apply-templates/> <xsl:text>}</xsl:text> </latex> </template> <!-- Multi-column cells (LaTeX only, as this is pretty trivial to achieve in HTML). $num-columns: The number of rows this cell spans. --> <template name="multicolumn-cell" match="cell" mode="multi-column"> <latex> <xsl:param name="num-columns">1</xsl:param> <xsl:text>\multicolumn{</xsl:text> <xsl:value-of select="$num-columns"/> <xsl:text>}{</xsl:text> <xsl:value-of select="@left-border"/> <xsl:choose> <xsl:when test="@align"> <xsl:value-of select="substring(@align, 1, 1)"/> </xsl:when> <xsl:otherwise> <xsl:text>l</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:value-of select="@right-border"/> <xsl:text>}{</xsl:text> <xsl:choose> <xsl:when test="@rows"> <xsl:apply-templates select="." mode="multi-row"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> </template> <template match="cell"> <common> <!-- position() doesn't seem to work very well in this context. --> <xsl:variable name="column-no"><xsl:number/></xsl:variable> </common> <!-- Doing this sensibly for LaTeX is actually pretty ugly, because different attribute combinations produce different code :( This is the sort of algorithm that can only really be clearly described by a flow chart :) --> <latex> <xsl:choose> <xsl:when test="@columns"> <xsl:apply-templates select="." mode="multi-column"> <xsl:with-param name="num-columns" select="@columns"/> </xsl:apply-templates> </xsl:when> <xsl:when test="@align"> <xsl:apply-templates select="." mode="multi-column"/> </xsl:when> <xsl:when test="@rows"> <xsl:apply-templates select="." mode="multi-row"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> <xsl:if test="$column-no != last()"> & </xsl:if> </latex> <!-- It's much easier in HTML, because a <TD> is a <TD> is a <TD>, regardless of the attributes supplied. --> <html> <TD> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> <xsl:if test="not(@align)"> <xsl:value-of select="ancestor::tabular/columns/column[position() = $column-no]/@align"/> <xsl:if test="not(ancestor::tabular/columns/column[position() = $column-no]/@align)">left</xsl:if> </xsl:if> </xsl:attribute> <xsl:attribute name="VALIGN"> <xsl:value-of select="@valign"/> <xsl:if test="not(@valign)">middle</xsl:if> </xsl:attribute> <xsl:attribute name="COLSPAN"> <xsl:value-of select="@columns"/> <xsl:if test="not(@columns)">1</xsl:if> </xsl:attribute> <xsl:attribute name="ROWSPAN"> <xsl:value-of select="@rows"/> <xsl:if test="not(@rows)">1</xsl:if> </xsl:attribute> <xsl:apply-templates/> </TD> </html> </template> <!-- Hyperlinks. The content of the element is the hyperlink text. @label: A label that the hyperlink links to. The value should be an acceptable label in both LaTeX and HTML. [optional] @url: A URL that the hyperlink links to. If no link text is provided, the URL is used as the link text. [optional] --> <template name="hyperlink-label" match="hyperlink[@label]"> <latex>\hyperref[<xsl:value-of select="@label"/>]{<xsl:apply-templates/>}</latex> <html><A HREF="#{@label}"><xsl:apply-templates/></A></html> </template> <template name="hyperlink-url" match="hyperlink[@url and node()]"> <latex>\href{<xsl:value-of select="@url"/>}{<xsl:apply-templates/>}</latex> <html><A HREF="{@url}"><xsl:apply-templates/></A></html> </template> <!-- Internal parameterised hyperlink template to be called by the likes of the empty Oracle documentation elements. --> <template name="hyperlink-internal" match="hyperlink" mode="hyperlink-internal"> <common> <xsl:param xmlns:xsl-out="http://www.w3.org/1999/XSL/Transform" name="url"/> <xsl:param xmlns:xsl-out="http://www.w3.org/1999/XSL/Transform" name="label"/> </common> <latex>\href{<xsl:value-of select="$url"/>}{<xsl:apply-templates select="exsl:node-set($label)"/>}</latex> <html><A HREF="{$url}"><xsl:apply-templates select="exsl:node-set($label)"/></A></html> </template> <template name="empty-hyperlink-url" match="hyperlink[@url and not(node())]"> <!-- Note: not safe to use the url package here because \url{...} is fragile. --> <latex>\href{<xsl:value-of select="@url"/>}{\texttt{<xsl:value-of select="@url"/>}}</latex> <html><A HREF="{@url}"><CODE><xsl:value-of select="@url"/></CODE></A></html> </template> <!-- A plain URL (i.e., not necessarily a hyperlink). --> <template name="url" match="url|uri|email|e-mail|email-address|e-mail-address"> <!-- Hmm, \url{...} appears to turn the URL into a non-functional link in PDF output (probably an interaction with hyperref). Not really what we want (as the link aspect is already dealt with by the <hyperlink> templates), so we'll just use \texttt{...}. --> <latex>\texttt{<xsl:apply-templates/>}</latex> <html><CODE><xsl:apply-templates/></CODE></html> </template> <!-- References. Note the distinction betwen these and hyperlinks: a reference is merely something like "see Section 2.3", and doesn't necessarily imply a hyperlink, or vice versa. @label: The label of the item that we're referencing. It must be a valid label in both LaTeX and HTML. [required] --> <template name="reference" match="reference"> <common> <!-- Find the element whose label is the same as our label. --> <xsl:apply-templates select="//*[@label = current()/@label]" mode="reference"/> </common> </template> <!-- Do a separate template for each type of reference; easier. --> <template name="section-reference" match="section" mode="reference"> <!-- It's probably more consistent to just use \ref* and insert "Section" ourselves rather than let LaTeX do it. --> <latex>Section~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Section&#160;</xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1"/> </html> </template> <template name="figure-reference" match="figure" mode="reference"> <latex>Figure~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Figure&#160;</xsl:text> <xsl:number count="figure" level="any" format="1"/> </html> </template> <template name="table-reference" match="table" mode="reference"> <latex>Table~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Table&#160;</xsl:text> <xsl:number count="table" level="any" format="1"/> </html> </template> <!-- Figures & tables (in the LaTeX sense, i.e., "floating" items). --> <template name="figure" match="figure"> <latex> \begin{figure}<xsl:if test="@latex-placement">[<xsl:value-of select="@latex-placement"/>]</xsl:if> \centering <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> \caption{<xsl:apply-templates select="caption"/>} <xsl:if test="@label">\label{<xsl:value-of select="@label"/>}</xsl:if> <xsl:if test="count(id) != 0">\label{<xsl:value-of select="id"/>}</xsl:if> </xsl:if> \end{figure} </latex> <html> <DIV CLASS="figure"> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:if test="count(id) != 0"><A NAME="{id}"></A></xsl:if> <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> <BR/> <xsl:apply-templates select="caption"/> </xsl:if> </DIV> </html> </template> <template name="table" match="table"> <latex> \begin{table}<xsl:if test="@latex-placement">[<xsl:value-of select="@latex-placement"/>]</xsl:if> \centering <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> \caption{<xsl:apply-templates select="caption"/>} <xsl:if test="@label">\label{<xsl:value-of select="@label"/>}</xsl:if> </xsl:if> \end{table} </latex> <html> <DIV CLASS="table"> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> <BR/> <xsl:apply-templates select="caption"/> </xsl:if> </DIV> </html> </template> <template name="figure-caption" match="figure/caption"> <latex><xsl:apply-templates/></latex> <html> <STRONG>Figure <xsl:number count="figure" level="any" format="1"/>. </STRONG><xsl:apply-templates/> </html> </template> <template name="table-caption" match="table/caption"> <latex><xsl:apply-templates/></latex> <html> <STRONG>Table <xsl:number count="table" level="any" format="1"/>. </STRONG><xsl:apply-templates/> </html> </template> <!-- Images. Includes a scaling factor for LaTeX. To do: alternatively, allow defining the scaling factor by specifying what proportion of the page width the image should occupy (a la LaTeX [width] parameter). How about a <latex-attributes> element that can be used to specify \includegraphics arguments? <width keepaspectratio="yes">0.5\columnwidth</width> <height>2cm</height> <scale>0.5</scale> etc. To do: if no description is given, use the basename as the content of the ALT element. Ideally, I think we should be able to define two image formats (PDF, EPS, PNG, ...) when marking up an image: one for LaTeX output, another for HTML. --> <!-- LaTeX images are always handled the same way regardless. --> <template match="image" mode="latex"> <latex> <xsl:text>\includegraphics</xsl:text> <xsl:if test="count(latex-scaling) != 0"> <xsl:text>[scale=</xsl:text> <xsl:value-of select="latex-scaling"/> <xsl:text>]</xsl:text> </xsl:if> <!-- Use whatever standard image folder is appropriate for the context. --> <xsl:text>{</xsl:text> <xsl:choose> <!-- Could possibly change this to test="/document/@class = 'tutorial'" or similar? --> <!-- Sounds nicer...I think ideally the XSL processor would automatically figure out the path to the graphics based on the path to the source XML file. Can this be done? --> <xsl:when test="name(/child::node()[1])='tutorial' or /document/@class = 'tutorial'"> <xsl:text>\tutroot/</xsl:text><xsl:value-of select="//metadata/number-code"/><xsl:text>-</xsl:text><xsl:value-of select="//metadata/title-code"/><xsl:text>/Graphics</xsl:text> </xsl:when> <xsl:when test="name(/child::node()[1])='laboratory' or /document/@class = 'laboratory'"> <xsl:text>\labroot/</xsl:text><xsl:value-of select="//metadata/number-code"/><xsl:text>-</xsl:text><xsl:value-of select="//metadata/title-code"/><xsl:text>/Graphics</xsl:text> </xsl:when> <!-- Allow the author to specify a non-standard image location on the fly. --> <xsl:when test="count(location) != 0"> <xsl:value-of select="location"/> </xsl:when> <!-- new style in progress... --> <xsl:otherwise> <xsl:text>images/</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$image-format"/> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> </template> <template match="image[count(provide-large-version) = 0]"> <latex><xsl:apply-templates select="." mode="latex"/></latex> <html> <IMG BORDER="0"> <xsl:attribute name="SRC"> <xsl:choose> <xsl:when test="(name(/child::node()[1])='tutorial') or (name(/child::node()[1])='laboratory')"> <xsl:text>Graphics/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>-72dpi.png</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="ALT"><xsl:apply-templates select="description"/></xsl:attribute> </IMG> </html> </template> <template match="image[count(provide-large-version) != 0]"> <latex><xsl:apply-templates select="." mode="latex"/></latex> <html> <A> <xsl:attribute name="HREF"> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>-zoom.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> <IMG BORDER="0"> <xsl:attribute name="SRC"> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="ALT"> <xsl:apply-templates select="description"/> </xsl:attribute> </IMG> <BR CLEAR="right"/> <xsl:text>(Larger version)</xsl:text> </A> </html> </template> <!-- Include another XML document into the current one. Including LaTeX should be done using <latex-input>. Nothing for HTML includes at present, although this may not actually be necessary anyway given that HTML doesn't natively support this in the first place. You're probably better off just generating a separate document and linking to it. It's difficult to produce HTML fragments because the XSLT processor seems to always generate a DOCTYPE when producing HTML, whether you want it or not. Maybe you can turn this off? @file: Name of file to include. [required] --> <template name="include-xml" match="include-document"> <common> <xsl:apply-templates select="document(@file)"/> </common> </template> <!-- Environment setup. This enables you to load environment settings (e.g., required LaTeX packages, etc.) from an external configuration file. The master style sheet automatically loads a file called "environment.xml"; you don't need to do anything for this file to be loaded. Multiple configuration files may be loaded, as long as they all have different names. You can also define environment entries inline by omitting the file attribute. @file: Name of environment file. [optional] Note: this may produce an error if the file doesn't exist. The XSLT processor should be able to continue from this, however. --> <template name="environment" match="environment[@file]"> <xsl:apply-templates select="document(@file)/environment/*"/> </template> <!-- Load a LaTeX package. @options: Any arguments to the package. [optional] --> <template name="latex-package" match="latex-packages/package"> <latex>\usepackage<xsl:if test="@options">[<xsl:value-of select="@options"/>]</xsl:if>{<xsl:value-of select="."/>}</latex> </template> <template name="latex-command" match="latex-packages/command"> <latex><xsl:value-of select="."/></latex> </template> <!-- Sometimes we might need to embed raw code to handle something tricky. --> <template name="raw-latex" match="raw-code[@format = 'latex']"> <latex><xsl:apply-templates/></latex> </template> <template name="raw-html" match="raw-code[@format = 'html']"> <html><xsl:copy-of select="*"/></html> </template> <!-- Generate a LaTeX \input{} macro. --> <template name="latex-input" match="latex-input"> <latex>\input{<xsl:value-of select="."/>}</latex> </template> <!-- Conditional processing depending on the format. It may appear redundant to have two templates, but this is the only way to ensure that the LaTeX template is empty in the HTML style sheet, and vice versa. @format: the format under which this XML is to be processed. [required] --> <template name="process-when-latex" match="process-when[@format = 'latex']"> <latex><xsl:apply-templates/></latex> </template> <template name="process-when-html" match="process-when[@format = 'html']"> <html><xsl:apply-templates/></html> </template> <!-- Basic maths stuff. Anything more complicated is... complicated. We should probably be using MathML, but we still have to mangle it into HTML regardless. A <math> inside a <paragraph> is assumed to be inline, while a <math> on its own is assumed to be displayed in its own paragraph. --> <template name="math-inline" match="paragraph//math|para//math|p//math"> <latex>\(<xsl:apply-templates mode="math"/>\)</latex> <html><xsl:apply-templates mode="math"/></html> </template> <template name="math-display" match="math"> <latex>\[<xsl:apply-templates mode="math"/>\]</latex> <html><P ALIGN="center"><xsl:apply-templates mode="math"/></P></html> </template> <!-- Equation arrays --> <template name="equation-array" match="equation-array"> <latex> <xsl:text>\begin{eqnarray*} </xsl:text> <xsl:apply-templates mode="math"/> <xsl:text>\end{eqnarray*}</xsl:text> </latex> <html> <TABLE CLASS="equation" BORDER="0" ALIGN="CENTER"><xsl:apply-templates mode="math"/></TABLE> </html> </template> <!-- Hmm, LaTeX uses "&" as separators: how do we know if there's another cell coming? Ah, but the LaTeX eqnarray can have no more than three columns, so there's no need to generalise. --> <template match="equation-array/row" mode="math"> <latex> <xsl:apply-templates select="left" mode="math"/><xsl:text disable-output-escaping="yes"> & </xsl:text><xsl:apply-templates select="middle" mode="math"/><xsl:text disable-output-escaping="yes"> & </xsl:text><xsl:apply-templates select="right" mode="math"/><xsl:text> \\ \\ </xsl:text> </latex> <html> <TR><TD ALIGN="RIGHT"><xsl:apply-templates select="left"/></TD><TD ALIGN="CENTER"><xsl:apply-templates select="middle"/></TD><TD ALIGN="LEFT"><xsl:apply-templates select="right"/></TD></TR> </html> </template> <!-- Roman (upright) text inside math environments. \mathrm sounds like it's probably more correct, but doesn't retain spaces (which \textup does). --> <template name="math-text" match="text" mode="math"> <latex>\textup{<xsl:apply-templates mode="math"/>}</latex> <html><xsl:apply-templates mode="math"/></html> </template> <!-- Digit grouping separator character for large numbers. SI conventions say this should be a space (but we could make it a comma if desired). --> <template name="digit-group-separator" match="digit-group-separator|digitsep"> <common> <xsl:call-template name="non-breaking-space"/> </common> </template> <template name="digit-group-separator-math" match="digit-group-separator|digitsep" mode="math"> <common> <xsl:call-template name="non-breaking-space"/> </common> </template> <!-- Mathematical super- and subscript. --> <template name="superscript-math" match="superscript" mode="math"> <latex>^{<xsl:apply-templates mode="math"/>}</latex> <html><SUP><xsl:apply-templates mode="math"/></SUP></html> </template> <template name="subscript-math" match="subscript" mode="math"> <latex>_{<xsl:apply-templates mode="math"/>}</latex> <html><SUB><xsl:apply-templates mode="math"/></SUB></html> </template> <!-- Basic mathematical operators. Unfortunately we need to define math and non-math mode versions of each template even when they're identical, because if we're in math mode, non-math mode templates are ignored (as far as I can tell anyway). There's no such thing as mode="*" :( Do we need <left-parenthesis> and <right-parenthesis>? Maybe we're getting a little carried away with these :) --> <template name="plus-operator-math" match="plus" mode="math"> <common>+</common> </template> <template name="plus-operator" match="plus"> <common>+</common> </template> <template name="minus-operator-math" match="minus" mode="math"> <common>-</common> </template> <template name="minus-operator" match="minus"> <latex>\(-\)</latex> <html>-</html> </template> <template name="times-operator-math" match="times" mode="math"> <latex>\times</latex> <html><xsl:text disable-output-escaping="yes"> &#215; </xsl:text></html> </template> <template name="times-operator" match="times"> <latex>\(\times\)</latex> <html><xsl:text disable-output-escaping="yes"> &#215; </xsl:text></html> </template> <template name="divide-operator-math" match="divide" mode="math"> <common>/</common> </template> <template name="divide-operator" match="divide"> <common>/</common> </template> <template name="equals-operator-math" match="equals" mode="math"> <!-- Need spaces for HTML as they seem to get munched otherwise. --> <common> = </common> </template> <template name="equals-operator" match="equals"> <common> = </common> </template> <template name="approximately-equals-operator-math" match="approximately-equals|approximately-equal-to|approx" mode="math"> <latex>{\approx}</latex> <html><xsl:text disable-output-escaping="yes">&#8776;</xsl:text></html> </template> <template name="approximately-equals-operator" match="approximately-equals|approximately-equal-to|approx"> <latex>\(\approx\)</latex> <html><xsl:text disable-output-escaping="yes">&#8776;</xsl:text></html> </template> <template name="degree-sign-math" match="degree-sign" mode="math"> <latex>^{\circ}</latex> <html><xsl:text disable-output-escaping="yes">&#176;</xsl:text></html> </template> <!-- The equivalent of LaTeX's "log-like functions". @name: The name of the function. We assume the names used by LaTeX here, as they work out correct anyway. There's actually nothing to stop you using any name you like, except that it'll probably die horribly in LaTeX :) [required] --> <template name="log-like-function" match="function" mode="math"> <latex>\<xsl:value-of select="@name"/></latex> <html><xsl:value-of select="@name"/></html> </template> <!-- Any mathematical variable names. --> <template name="math-variable" match="variable" mode="math"> <latex><xsl:apply-templates mode="math"/></latex> <html><I><xsl:apply-templates mode="math"/></I></html> </template> <!-- A displayed fraction. Is there a nicer way of doing this in HTML? --> <template name="math-fraction" match="fraction" mode="math"> <latex>\frac{<xsl:apply-templates select="numerator" mode="math"/>}{<xsl:apply-templates select="denominator" mode="math"/>}</latex> <html><xsl:apply-templates select="numerator" mode="math"/><BIG> / </BIG><xsl:apply-templates select="denominator" mode="math"/></html> </template> </stylesheet>
<?xml version="1.0"?> <!-- This will mostly be a list of element names to match, along with the corresponding HTML and LaTeX handling XSLT code. --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <template name="PaperCode" match="PaperCode"> <latex><xsl:value-of select="$department"/>~<xsl:value-of select="$paper"/></latex> <html> <xsl:value-of select="$department"/> <xsl:text disable-output-escaping="yes">&nbsp;</xsl:text> <xsl:value-of select="$paper"/> </html> </template> <template name="OracleServer" match="OracleServer"> <latex>Oracle9\textit{i}</latex> <html>Oracle9<I>i</I></html> </template> <template name="Blackboard" match="Blackboard"> <common> <xsl:call-template name="hyperlink-internal"> <xsl:with-param name="url">http://blackboard.otago.ac.nz/</xsl:with-param> <xsl:with-param name="label">Blackboard</xsl:with-param> </xsl:call-template> </common> </template> <!-- Plain paragraph. @indent: Whether or not to indent this paragraph (probably only relevant in LaTeX). 'no' => don't indent. otherwise => apply standard paragraph formatting. [default] --> <template name="paragraph" match="paragraph|para|p|P"> <latex><xsl:text> </xsl:text><xsl:if test="@indent = 'no'">\noindent </xsl:if><xsl:apply-templates/><xsl:text> </xsl:text></latex> <!-- HTML is weird about what things you cannot include inside paragraphs (e.g. lists of any kind). However, the end P tag is optional, so one option might simply be not to output it. --> <html><P><xsl:apply-templates/></P></html> </template> <!-- Special characters (should maybe all be named, in case they need to be called explicitly with xsl:call-template) --> <!-- I'd like to use the Unicode names for these; will look them up some time! --> <template name="newline" match="newline"> <latex><xsl:text> \\</xsl:text></latex> <html><BR/></html> </template> <template name="page-break" match="page-break|new-page"> <latex>\newpage</latex> </template> <template name="non-breaking-space" match="non-breaking-space|nbsp"> <latex>~</latex> <html><xsl:text disable-output-escaping="yes">&nbsp;</xsl:text></html> </template> <template name="non-breaking-space-math" match="non-breaking-space|nbsp" mode="math"> <latex>~</latex> <html><xsl:text disable-output-escaping="yes">&nbsp;</xsl:text></html> </template> <!-- Technically we don't need to disable output escaping for all of these, but it's probably better to code them all consistently, rather than trying to figure out which ones do need it (e.g.,   for a non-breaking space) and which ones don't (e.g., &). --> <template name="ellipsis-sign" match="ellipsis-sign|etc|ellipsis|dots"> <latex>{\ldots}</latex> <html><xsl:text disable-output-escaping="yes">&#8230;</xsl:text></html> </template> <!-- Misc typographic symbols --> <template name="endash" match="endash|en-dash"> <latex>--</latex> <html><xsl:text disable-output-escaping="yes">&#8211;</xsl:text></html> </template> <template name="emdash" match="emdash|em-dash"> <latex>---</latex> <html><xsl:text disable-output-escaping="yes">&#8212;</xsl:text></html> </template> <template name="apostrophe" match="apostrophe"> <latex>'</latex> <html><xsl:text disable-output-escaping="yes">&#8217;</xsl:text></html> </template> <template name="dollar" match="dollar"> <latex>{\$}</latex> <html>$</html> </template> <template name="percent-sign" match="percent-sign"> <latex>{\%}</latex> <html>%</html> </template> <template name="ampersand" match="ampersand"> <latex>{\&}</latex> <html><xsl:text disable-output-escaping="yes">&amp;</xsl:text></html> </template> <template name="trademark-sign" match="trademark-sign|trademark|TM"> <latex>{\texttrademark}</latex> <html><xsl:text disable-output-escaping="yes">&#8482;</xsl:text></html> </template> <template name="copyright-sign" match="copyright-sign"> <latex>{\copyright}</latex> <html><xsl:text disable-output-escaping="yes">&#169;</xsl:text></html> </template> <template name="degree-sign" match="degree-sign|degrees"> <latex>\(^{\circ}\)</latex> <html><xsl:text disable-output-escaping="yes">&#176;</xsl:text></html> </template> <template name="section-sign" match="section-sign"> <latex>{\S}</latex> <html><xsl:text disable-output-escaping="yes">&#167;</xsl:text></html> </template> <template name="paragraph-sign" match="paragraph-sign"> <latex>{\P}</latex> <html><xsl:text disable-output-escaping="yes">&#182;</xsl:text></html> </template> <!-- I think the pi symbol is only available in LaTeX in math mode, but if we're already in math mode, the extra $ signs will mess things up... --> <!-- Can we use XSLT modes to deal with this? --> <!-- Looks like a "yes": --> <template name="pi-math" match="pi" mode="math"> <latex>{\pi}</latex> <html><xsl:text disable-output-escaping="yes">&#960;</xsl:text></html> </template> <!-- When not in math mode: --> <template name="pi-normal" match="pi"> <latex>\(\pi\)</latex> <html><xsl:text disable-output-escaping="yes">&#960;</xsl:text></html> </template> <template name="LaTeX" match="LaTeX|latex"> <latex>{\LaTeX}</latex> <html>L<SUP>A</SUP>T<SUB>E</SUB>X</html> </template> <!-- Note: no equivalent of \triangleright in HTML, use right arrow instead. --> <template name="menu-separator" match="menu-separator|menusep"> <latex>\(\triangleright\)</latex> <html><xsl:text disable-output-escaping="yes">&#8594;</xsl:text></html> </template> <template name="menu-item" match="menu/item"> <latex>\menuitem{<xsl:apply-templates/>}</latex> <html><B><xsl:apply-templates/></B></html> </template> <!-- Special styles --> <template name="emph" match="emph"> <latex>\emph{<xsl:apply-templates/>}</latex> <html><EM><xsl:apply-templates/></EM></html> </template> <template name="italic" match="italic"> <latex>\textit{<xsl:apply-templates/>}</latex> <html><I><xsl:apply-templates/></I></html> </template> <template name="strong" match="strong"> <latex>\textbf{<xsl:apply-templates/>}</latex> <html><STRONG><xsl:apply-templates/></STRONG></html> </template> <template name="bold" match="bold"> <latex>\textbf{<xsl:apply-templates/>}</latex> <html><B><xsl:apply-templates/></B></html> </template> <template name="term" match="term"> <latex>\term{<xsl:apply-templates/>}</latex> <html><I CLASS="term"><xsl:apply-templates/></I></html> </template> <template name="foreign" match="foreign"> <latex>\foreign{<xsl:apply-templates/>}</latex> <html><I CLASS="foreign"><xsl:apply-templates/></I></html> </template> <template name="code" match="code"> <!-- <latex>\code{<xsl:apply-templates/>}</latex> --> <latex>\verb+<xsl:apply-templates/>+</latex> <html><CODE><xsl:apply-templates/></CODE></html> </template> <!-- Non-maths super- and subscript. --> <template name="superscript" match="superscript"> <latex>\(^{<xsl:apply-templates/>}\)</latex> <html><SUP><xsl:apply-templates/></SUP></html> </template> <template name="subscript" match="subscript"> <latex>\(_{<xsl:apply-templates/>}\)</latex> <html><SUB><xsl:apply-templates/></SUB></html> </template> <!-- Text that shouldn't be broken across a line (i.e., LaTeX \mbox). Only really relevant for LaTeX because we can't control this in HTML. --> <template name="no-break" match="no-break|mbox"> <latex>\mbox{<xsl:apply-templates/>}</latex> <html><xsl:apply-templates/></html> </template> <!-- We can decide later whether to use plain verbatim or listings. --> <template name="code-block" match="code-block"> <latex> \begin{verbatim} <xsl:apply-templates/> \end{verbatim} </latex> <html> <PRE CLASS="code"><xsl:apply-templates/></PRE> </html> </template> <!-- This is for stuff that should unequivocally be treated verbatim (e.g. problem code). --> <template name="verbatim" match="verbatim"> <latex> \begin{verbatim} <xsl:apply-templates/> \end{verbatim} </latex> <html> <PRE><xsl:apply-templates/></PRE> </html> </template> <!-- Quoted text. Handles nested quotes correctly. @single: Whether to enclose the text in single or double quotes. 'yes' => single quotes (''). otherwise => double quotes (""). [default] --> <template name="single-quote" match="quote[@single='yes']|q[@single='yes']"> <latex>`<xsl:apply-templates/>'</latex> <html> <xsl:text disable-output-escaping="yes">&#8216;</xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes">&#8217;</xsl:text> </html> </template> <template name="double-quote" match="quote|qq"> <latex>``<xsl:apply-templates/>''</latex> <html> <xsl:text disable-output-escaping="yes">&#8220;</xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes">&#8221;</xsl:text> </html> </template> <!-- With nested quotes, we need to figure out what depth of nesting we're at, then call the appropriate template depending on the initial quoting style (single or double). --> <template name="nested-double-quote" match="quote//quote"> <common> <xsl:choose> <xsl:when test="(count(ancestor::quote) mod 2) = 0"> <xsl:call-template name="double-quote"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="single-quote"/> </xsl:otherwise> </xsl:choose> </common> </template> <template name="nested-single-quote" match="quote[@single='yes']//quote" priority="2"> <common> <xsl:choose> <xsl:when test="(count(ancestor::quote) mod 2) = 0"> <xsl:call-template name="single-quote"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="double-quote"/> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Environments (in the LaTeX terminology): enumerated, ordered, and numbered lists. --> <!-- Unordered lists --> <template name="itemised-list" match="itemised-list|itemize|unordered-list|bulleted-list|bullet-list|bullet-points|UL|ul"> <latex> \begin{itemize} <xsl:apply-templates/> \end{itemize} </latex> <html> <UL> <xsl:apply-templates/> </UL> </html> </template> <!-- Ordered lists --> <template name="enumerated-list" match="enumerated-list|enumerate|ordered-list|numbered-list|question-list|OL|ol"> <latex> \begin{enumerate} <xsl:apply-templates/> \end{enumerate} </latex> <html> <OL> <xsl:apply-templates/> </OL> </html> </template> <!-- Definition or description lists. --> <template name="definition-list" match="definition-list|description-list|DL|dl"> <latex> \begin{description} <xsl:apply-templates mode="definition-list"/> \end{description} </latex> <html> <!-- Hmm, <DL>s in HTML tend to come out with the spacing a bit wrong (or maybe it's just my browser?). Might using a table be better? Messy if the keyword is long, though, and you don't get a proper hanging indent... Maybe this is something that could be handled in CSS instead. --> <DL> <xsl:apply-templates mode="definition-list"/> </DL> <!-- <TABLE BORDER="0" CELLPADDING="10"> --> <!-- <xsl:apply-templates/> --> <!-- </TABLE> --> </html> </template> <!-- List elements --> <template name="item" match="item"> <latex><xsl:text>\item </xsl:text><xsl:apply-templates/></latex> <html> <xsl:choose> <xsl:when test="count(paragraph|para|p) != 0"> <LI><xsl:apply-templates/></LI> </xsl:when> <xsl:otherwise> <LI><P><xsl:apply-templates/></P></LI> </xsl:otherwise> </xsl:choose> </html> </template> <template name="definition-item" match="item" mode="definition-list"> <latex> <xsl:text>\item[</xsl:text> <xsl:apply-templates select="keyword|topic|DT|dt"/> <xsl:text>] </xsl:text> <xsl:apply-templates select="definition|description|discourse|DD|dd"/> </latex> <html> <DT><P><xsl:apply-templates select="keyword|topic|DT|dt"/></P></DT> <DD><xsl:apply-templates select="definition|description|discourse|DD|dd"/></DD> <!-- <TR VALIGN="TOP"> --> <!-- <TD><P><xsl:apply-templates select="keyword"/></P></TD> --> <!-- <TD><xsl:apply-templates select="definition|description|discourse"/></TD> --> <!-- </TR> --> </html> </template> <template name="keyword" match="keyword|topic|DT|dt"> <latex><xsl:apply-templates/></latex> <html><STRONG><xsl:apply-templates/></STRONG></html> </template> <!-- Need to provide some context here as, e.g., <description> is also used within <image>. --> <template name="definition" match="item/definition|item/description|item/discourse|item/DD|item/dd"> <latex><xsl:apply-templates/></latex> <html> <xsl:choose> <xsl:when test="count(paragraph|para|p) != 0"> <xsl:apply-templates/> </xsl:when> <xsl:otherwise> <P><xsl:apply-templates/></P> </xsl:otherwise> </xsl:choose> </html> </template> <!-- Sample answers, which may optionally be excluded from the output. --> <template name="answer" match="answer"> <latex> <!-- It's nice to weed out the sample answer markup at the XSLT processing stage to make LaTeX run faster. Note that \showanswers still needs to be called so that LaTeX can format chapter headings like "Answers for ..." --> <xsl:if test="$showanswers='yes'"> \begin{answer} <xsl:apply-templates/> \end{answer} </xsl:if> </latex> <html> <xsl:if test="$showanswers='yes'"> <DIV CLASS="answer"> <xsl:apply-templates/> </DIV> </xsl:if> </html> </template> <!-- Sections, subsections, subsubsections, ... @label: A label that can be used for cross referencing. Any value can be used, as long as it's a legal identifier in both LaTeX and HTML. --> <template name="section" match="section"> <latex> <xsl:apply-templates> <xsl:with-param name="label"> <xsl:value-of select="@label"/> <xsl:if test="not(@label)">THERE_IS_NO_LABEL</xsl:if> </xsl:with-param> </xsl:apply-templates> </latex> <html> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:apply-templates/> <!-- Since HTML doesn't really support footnotes as such, include them as "section notes" instead. --> <xsl:if test="count(.//footnote) > 0"> <P><STRONG>Notes:</STRONG></P> <xsl:apply-templates select=".//footnote" mode="list"/> </xsl:if> </html> </template> <!-- Footnotes. --> <template name="footnote" match="footnote"> <latex>\footnote{<xsl:apply-templates/>}</latex> <html> <A> <xsl:attribute name="NAME"> <xsl:text>footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-source</xsl:text> </xsl:attribute> <xsl:attribute name="HREF"> <xsl:text>#footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-target</xsl:text> </xsl:attribute> <xsl:text>[</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>]</xsl:text> </A> </html> </template> <!-- This is only required for HTML, as LaTeX does it all for you. --> <template name="footnote-list" match="footnote" mode="list"> <html> <P> <A> <xsl:attribute name="NAME"> <xsl:text>footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-target</xsl:text> </xsl:attribute> <xsl:text>[</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>]</xsl:text> </A> <xsl:text> </xsl:text> <xsl:apply-templates/> <xsl:text> </xsl:text> <!-- Provide a back link to the original footnote marker. --> <A> <xsl:attribute name="HREF"> <xsl:text>#footnote-</xsl:text> <xsl:number level="any" count="footnote"/> <xsl:text>-source</xsl:text> </xsl:attribute> <xsl:text>[Back]</xsl:text> </A> </P> </html> </template> <!-- Document preamble stuff: title, author, date. --> <template name="preamble-title" match="document/title" mode="preamble"> <latex>\title{<xsl:apply-templates/>}</latex> <html> <xsl:apply-templates/> </html> </template> <template name="preamble-author" match="document/author" mode="preamble"> <latex>\author{<xsl:apply-templates/>}</latex> </template> <template name="preamble-date" match="document/date" mode="preamble"> <latex>\date{<xsl:apply-templates/>}</latex> </template> <template name="document-title" match="document/title"> <!-- Need to do something sensible for LaTeX here. --> <latex> <!-- Under the LaTeX framework, the rest of the chapter title text is generated by LaTeX macros, so this is pretty simple. --> <xsl:if test="/document/@standalone = 'yes'"><xsl:apply-templates/></xsl:if> </latex> <html> <xsl:choose> <xsl:when test="/document/@class = 'tutorial'"> <H1><xsl:call-template name="PaperCode"/> Tutorial <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:when test="/document/@class = 'laboratory'"> <H1><xsl:call-template name="PaperCode"/> Lab <xsl:value-of select="//metadata/number"/><xsl:if test="$showanswers='yes'"> Sample Answers</xsl:if>: <BR/><xsl:apply-templates/></H1> </xsl:when> <xsl:otherwise> <H1><xsl:apply-templates/></H1> </xsl:otherwise> </xsl:choose> </html> </template> <template name="document-author" match="document/author"/> <template name="document-date" match="document/date"/> <!-- Generate some number of "sub"s so we can produce, e.g., "subsubsection" for LaTeX. $depth: the number of repetitions (0 <= $depth <= 2, but there's no need to do bounds checking at the upper end, because that's already dealt with in the "section-title" template below). --> <template name="generate-subs"> <latex> <xsl:param name="depth">1</xsl:param> <xsl:if test="$depth > 1"> <xsl:text>sub</xsl:text> <xsl:call-template name="generate-subs"> <xsl:with-param name="depth"><xsl:value-of select="$depth - 1"/></xsl:with-param> </xsl:call-template> </xsl:if> </latex> </template> <!-- Generate section title with nested numbering, e.g., 1.1.3. --> <template name="section-title" match="section/title"> <latex> <xsl:param name="label"/> <xsl:text>\</xsl:text> <!-- Generate the correct number of "sub"s for LaTeX. --> <xsl:call-template name="generate-subs"> <xsl:with-param name="depth"> <xsl:number value="count(ancestor::section)"/> <xsl:if test="count(ancestor::section) > 3">3</xsl:if> </xsl:with-param> </xsl:call-template> <xsl:text>section{</xsl:text> <xsl:apply-templates/><xsl:text>}</xsl:text> <xsl:if test="$label != 'THERE_IS_NO_LABEL'"> \label{<xsl:value-of select="$label"/>} </xsl:if> </latex> <html> <!-- The depth is used in a couple of places, so we pre-calculate it. --> <xsl:variable name="depth"> <xsl:number value="1 + count(ancestor::section)"/> <xsl:if test="1 + count(ancestor::section) > 6">6</xsl:if> </xsl:variable> <xsl:text disable-output-escaping="yes"><H</xsl:text><xsl:number value="$depth"/><xsl:text disable-output-escaping="yes">></xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1"/> <xsl:text> </xsl:text> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes"></H</xsl:text><xsl:number value="$depth"/><xsl:text disable-output-escaping="yes">></xsl:text> </html> </template> <!-- A quotation. @align: The alignment of the quotation paragraph. 'left' [default] 'center' 'right' --> <template name="quotation" match="quotation"> <latex> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>\begin{flush</xsl:text> <xsl:value-of select="@align"/> <xsl:text>}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{flush</xsl:text> <xsl:value-of select="@align"/> <xsl:text>}</xsl:text> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>\begin{center}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{center}</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>\begin{quote}\itshape </xsl:text> <xsl:apply-templates/> <xsl:text>\end{quote}</xsl:text> </xsl:otherwise> </xsl:choose> </latex> <!-- Nominally we should use <BLOCKQUOTE>, but it doesn't have alignment. --> <html> <P> <xsl:if test="@align"> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> </xsl:attribute> </xsl:if> <I><xsl:apply-templates/></I> </P> </html> </template> <!-- Anything inside a <metadata> is ignored completely. (More accurately, we pick bits out of it manually as required; it's only ignored by apply-templates.) --> <template name="metadata" match="metadata"/> <!-- Anything inside an <omit> is also ignored completely. --> <template name="omit" match="omit"/> <!-- ...and the legacy id tags inside figures. --> <template match="figure/id"/> <template match="figure/label"/> <!-- Comments are not quite ignored completely, as they're carried through to the output document (kind of: "It is an error if instantiating the content of xsl:comment creates nodes other than text nodes.") --> <template name="comment" match="comment"> <latex> <xsl:text> \begin{comment}</xsl:text> <xsl:apply-templates/> <xsl:text>\end{comment} </xsl:text> </latex> <html> <xsl:comment> <xsl:apply-templates/> </xsl:comment> </html> </template> <!-- Tabular structures (LaTeX {tabular}, HTML <TABLE>). @align: The alignment of the table as a whole. 'left' [default] 'center' 'right' @border: Width of cell border for HTML tables. --> <template name="tabular" match="tabular"> <latex> <!-- Overall table alignment. --> <xsl:text>\begin{</xsl:text> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>flush</xsl:text><xsl:value-of select="@align"/> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>center</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>flushleft</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> \begin{tabular}{<xsl:apply-templates select="columns"/>} <xsl:apply-templates select="tabular-header"/> <xsl:apply-templates select="tabular-body"/> <xsl:apply-templates select="tabular-footer"/> \end{tabular} <xsl:text>\end{</xsl:text> <xsl:choose> <xsl:when test="(@align = 'left') or (@align = 'right')"> <xsl:text>flush</xsl:text><xsl:value-of select="@align"/> </xsl:when> <xsl:when test="@align = 'center'"> <xsl:text>center</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>flushleft</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> <html> <TABLE> <xsl:attribute name="BORDER"> <xsl:value-of select="@border"/> <xsl:if test="not(@border)">0</xsl:if> </xsl:attribute> <xsl:if test="@align"> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> </xsl:attribute> </xsl:if> <!-- Note different ordering of tabular components: HTML requires THEAD and TFOOT to precede TBODY. --> <xsl:apply-templates select="tabular-header"/> <xsl:apply-templates select="tabular-footer"/> <xsl:apply-templates select="tabular-body"/> </TABLE> </html> </template> <!-- Specify column formatting, mainly for LaTeX, although HTML does get <TD> ALIGN values from here. @align: The alignment of this particular column. 'left' [default] 'center' 'right' @left-border: Set to '|' to include a column separator to the left of this column. @right-border: Set to '|' to include a column separator to the right of this column. Careful: including a right-border on a cell and a left-border on the next cell will produce '||', not '|'. BUT, when doing multi-column or multi-row cells, always include both borders if required, because \multicolumn overrides the default border specification. --> <template name="aligned-column" match="column[@align]"> <latex> <xsl:value-of select="@left-border"/> <xsl:value-of select="substring(@align, 1, 1)"/> <xsl:value-of select="@right-border"/> </latex> </template> <template name="unaligned-column" match="column[not(@align)]"> <latex> <xsl:value-of select="@left-border"/> <xsl:text>l</xsl:text> <xsl:value-of select="@right-border"/> </latex> </template> <template name="tabular-header" match="tabular-header"> <latex></latex> <html> <THEAD> <xsl:apply-templates/> </THEAD> </html> </template> <template name="tabular-footer" match="tabular-footer"> <latex></latex> <html> <TFOOT> <xsl:apply-templates/> </TFOOT> </html> </template> <template name="tabular-body" match="tabular-body"> <latex><xsl:apply-templates/></latex> <html> <TBODY> <xsl:apply-templates/> </TBODY> </html> </template> <!-- @no-page-break: Inhibit page breaks after this row (LaTeX only). --> <template name="row" match="row"> <latex> <xsl:apply-templates/> <xsl:text> \\</xsl:text> <xsl:if test="@no-page-break = 'yes'">*</xsl:if> <xsl:text> </xsl:text> </latex> <html> <TR> <xsl:if test="@valign"> <xsl:attribute name="VALIGN"><xsl:value-of select="@valign"/></xsl:attribute> </xsl:if> <xsl:apply-templates/> </TR> </html> </template> <!-- Horizontal rules (LaTeX only). @columns: The column range to draw the rule across. Specify as you would for a \cline in LaTeX, e.g., '3-5'. If omitted, the rule is drawn across all columns. --> <template name="row-rule-full" match="row-rule[not(@columns)]"> <latex><xsl:text>\hline </xsl:text></latex> </template> <template name="row-rule-partial" match="row-rule[@columns]"> <latex>\cline{<xsl:value-of select="@columns"/>}</latex> </template> <!-- Hmm, the multi-row stuff is somewhat broken in LaTeX, oops. Need to insert missing columns (as was done in the calendar XSL) when a multi-row cell is encountered. Also need to sort out \hlines in the presence of multi-row cells and also what happens to vertical cell borders :( This probably needs reworking. --> <!-- Multi-row cells (LaTeX only, as this is pretty trivial to achieve in HTML). @rows: The number of rows this cell spans. --> <template name="multirow-cell" match="cell" mode="multi-row"> <latex> <xsl:text>\multirow{</xsl:text> <xsl:value-of select="@rows"/> <xsl:text>}{*}{</xsl:text> <xsl:apply-templates/> <xsl:text>}</xsl:text> </latex> </template> <!-- Multi-column cells (LaTeX only, as this is pretty trivial to achieve in HTML). $num-columns: The number of rows this cell spans. --> <template name="multicolumn-cell" match="cell" mode="multi-column"> <latex> <xsl:param name="num-columns">1</xsl:param> <xsl:text>\multicolumn{</xsl:text> <xsl:value-of select="$num-columns"/> <xsl:text>}{</xsl:text> <xsl:value-of select="@left-border"/> <xsl:choose> <xsl:when test="@align"> <xsl:value-of select="substring(@align, 1, 1)"/> </xsl:when> <xsl:otherwise> <xsl:text>l</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:value-of select="@right-border"/> <xsl:text>}{</xsl:text> <xsl:choose> <xsl:when test="@rows"> <xsl:apply-templates select="." mode="multi-row"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> </template> <template match="cell"> <common> <!-- position() doesn't seem to work very well in this context. --> <xsl:variable name="column-no"><xsl:number/></xsl:variable> </common> <!-- Doing this sensibly for LaTeX is actually pretty ugly, because different attribute combinations produce different code :( This is the sort of algorithm that can only really be clearly described by a flow chart :) --> <latex> <xsl:choose> <xsl:when test="@columns"> <xsl:apply-templates select="." mode="multi-column"> <xsl:with-param name="num-columns" select="@columns"/> </xsl:apply-templates> </xsl:when> <xsl:when test="@align"> <xsl:apply-templates select="." mode="multi-column"/> </xsl:when> <xsl:when test="@rows"> <xsl:apply-templates select="." mode="multi-row"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> <xsl:if test="$column-no != last()"> & </xsl:if> </latex> <!-- It's much easier in HTML, because a <TD> is a <TD> is a <TD>, regardless of the attributes supplied. --> <html> <TD> <xsl:attribute name="ALIGN"> <xsl:value-of select="@align"/> <xsl:if test="not(@align)"> <xsl:value-of select="ancestor::tabular/columns/column[position() = $column-no]/@align"/> <xsl:if test="not(ancestor::tabular/columns/column[position() = $column-no]/@align)">left</xsl:if> </xsl:if> </xsl:attribute> <xsl:attribute name="VALIGN"> <xsl:value-of select="@valign"/> <xsl:if test="not(@valign)">middle</xsl:if> </xsl:attribute> <xsl:attribute name="COLSPAN"> <xsl:value-of select="@columns"/> <xsl:if test="not(@columns)">1</xsl:if> </xsl:attribute> <xsl:attribute name="ROWSPAN"> <xsl:value-of select="@rows"/> <xsl:if test="not(@rows)">1</xsl:if> </xsl:attribute> <xsl:apply-templates/> </TD> </html> </template> <!-- Hyperlinks. The content of the element is the hyperlink text. @label: A label that the hyperlink links to. The value should be an acceptable label in both LaTeX and HTML. [optional] @url: A URL that the hyperlink links to. If no link text is provided, the URL is used as the link text. [optional] --> <template name="hyperlink-label" match="hyperlink[@label]"> <latex>\hyperref[<xsl:value-of select="@label"/>]{<xsl:apply-templates/>}</latex> <html><A HREF="#{@label}"><xsl:apply-templates/></A></html> </template> <template name="hyperlink-url" match="hyperlink[@url and node()]"> <latex>\href{<xsl:value-of select="@url"/>}{<xsl:apply-templates/>}</latex> <html><A HREF="{@url}"><xsl:apply-templates/></A></html> </template> <!-- Internal parameterised hyperlink template to be called by the likes of the empty Oracle documentation elements. --> <template name="hyperlink-internal" match="hyperlink" mode="hyperlink-internal"> <common> <xsl:param xmlns:xsl-out="http://www.w3.org/1999/XSL/Transform" name="url"/> <xsl:param xmlns:xsl-out="http://www.w3.org/1999/XSL/Transform" name="label"/> </common> <latex>\href{<xsl:value-of select="$url"/>}{<xsl:apply-templates select="exsl:node-set($label)"/>}</latex> <html><A HREF="{$url}"><xsl:apply-templates select="exsl:node-set($label)"/></A></html> </template> <template name="empty-hyperlink-url" match="hyperlink[@url and not(node())]"> <!-- Note: not safe to use the url package here because \url{...} is fragile. --> <latex>\href{<xsl:value-of select="@url"/>}{\texttt{<xsl:value-of select="@url"/>}}</latex> <html><A HREF="{@url}"><CODE><xsl:value-of select="@url"/></CODE></A></html> </template> <!-- A plain URL (i.e., not necessarily a hyperlink). --> <template name="url" match="url|uri|email|e-mail|email-address|e-mail-address"> <!-- Hmm, \url{...} appears to turn the URL into a non-functional link in PDF output (probably an interaction with hyperref). Not really what we want (as the link aspect is already dealt with by the <hyperlink> templates), so we'll just use \texttt{...}. --> <latex>\texttt{<xsl:apply-templates/>}</latex> <html><CODE><xsl:apply-templates/></CODE></html> </template> <!-- References. Note the distinction betwen these and hyperlinks: a reference is merely something like "see Section 2.3", and doesn't necessarily imply a hyperlink, or vice versa. @label: The label of the item that we're referencing. It must be a valid label in both LaTeX and HTML. [required] --> <template name="reference" match="reference"> <common> <!-- Find the element whose label is the same as our label. --> <xsl:apply-templates select="//*[@label = current()/@label]" mode="reference"/> </common> </template> <!-- Do a separate template for each type of reference; easier. --> <template name="section-reference" match="section" mode="reference"> <!-- It's probably more consistent to just use \ref* and insert "Section" ourselves rather than let LaTeX do it. --> <latex>Section~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Section&#160;</xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1"/> </html> </template> <template name="figure-reference" match="figure" mode="reference"> <latex>Figure~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Figure&#160;</xsl:text> <xsl:number count="figure" level="any" format="1"/> </html> </template> <template name="table-reference" match="table" mode="reference"> <latex>Table~\ref*{<xsl:value-of select="@label"/>}</latex> <html> <xsl:text disable-output-escaping="yes">Table&#160;</xsl:text> <xsl:number count="table" level="any" format="1"/> </html> </template> <!-- Figures & tables (in the LaTeX sense, i.e., "floating" items). --> <template name="figure" match="figure"> <latex> \begin{figure}<xsl:if test="@latex-placement">[<xsl:value-of select="@latex-placement"/>]</xsl:if> \centering <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> \caption{<xsl:apply-templates select="caption"/>} <xsl:if test="@label">\label{<xsl:value-of select="@label"/>}</xsl:if> <xsl:if test="count(id) != 0">\label{<xsl:value-of select="id"/>}</xsl:if> </xsl:if> \end{figure} </latex> <html> <DIV CLASS="figure"> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:if test="count(id) != 0"><A NAME="{id}"></A></xsl:if> <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> <BR/> <xsl:apply-templates select="caption"/> </xsl:if> </DIV> </html> </template> <template name="table" match="table"> <latex> \begin{table}<xsl:if test="@latex-placement">[<xsl:value-of select="@latex-placement"/>]</xsl:if> \centering <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> \caption{<xsl:apply-templates select="caption"/>} <xsl:if test="@label">\label{<xsl:value-of select="@label"/>}</xsl:if> </xsl:if> \end{table} </latex> <html> <DIV CLASS="table"> <xsl:if test="@label"><A NAME="{@label}"></A></xsl:if> <xsl:apply-templates select="*[not(self::caption)]"/> <xsl:if test="count(caption) != 0"> <BR/> <xsl:apply-templates select="caption"/> </xsl:if> </DIV> </html> </template> <template name="figure-caption" match="figure/caption"> <latex><xsl:apply-templates/></latex> <html> <STRONG>Figure <xsl:number count="figure" level="any" format="1"/>. </STRONG><xsl:apply-templates/> </html> </template> <template name="table-caption" match="table/caption"> <latex><xsl:apply-templates/></latex> <html> <STRONG>Table <xsl:number count="table" level="any" format="1"/>. </STRONG><xsl:apply-templates/> </html> </template> <!-- Images. Includes a scaling factor for LaTeX. To do: alternatively, allow defining the scaling factor by specifying what proportion of the page width the image should occupy (a la LaTeX [width] parameter). How about a <latex-attributes> element that can be used to specify \includegraphics arguments? <width keepaspectratio="yes">0.5\columnwidth</width> <height>2cm</height> <scale>0.5</scale> etc. To do: if no description is given, use the basename as the content of the ALT element. Ideally, I think we should be able to define two image formats (PDF, EPS, PNG, ...) when marking up an image: one for LaTeX output, another for HTML. --> <!-- LaTeX images are always handled the same way regardless. --> <template match="image" mode="latex"> <latex> <xsl:text>\includegraphics</xsl:text> <xsl:if test="count(latex-scaling) != 0"> <xsl:text>[scale=</xsl:text> <xsl:value-of select="latex-scaling"/> <xsl:text>]</xsl:text> </xsl:if> <!-- Use whatever standard image folder is appropriate for the context. --> <xsl:text>{</xsl:text> <xsl:choose> <!-- Could possibly change this to test="/document/@class = 'tutorial'" or similar? --> <!-- Sounds nicer...I think ideally the XSL processor would automatically figure out the path to the graphics based on the path to the source XML file. Can this be done? --> <xsl:when test="name(/child::node()[1])='tutorial' or /document/@class = 'tutorial'"> <xsl:text>\tutroot/</xsl:text><xsl:value-of select="//metadata/number-code"/><xsl:text>-</xsl:text><xsl:value-of select="//metadata/title-code"/><xsl:text>/Graphics</xsl:text> </xsl:when> <xsl:when test="name(/child::node()[1])='laboratory' or /document/@class = 'laboratory'"> <xsl:text>\labroot/</xsl:text><xsl:value-of select="//metadata/number-code"/><xsl:text>-</xsl:text><xsl:value-of select="//metadata/title-code"/><xsl:text>/Graphics</xsl:text> </xsl:when> <!-- Allow the author to specify a non-standard image location on the fly. --> <xsl:when test="count(location) != 0"> <xsl:value-of select="location"/> </xsl:when> <!-- new style in progress... --> <xsl:otherwise> <xsl:text>images/</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$image-format"/> </xsl:otherwise> </xsl:choose> <xsl:text>}</xsl:text> </latex> </template> <template match="image[count(provide-large-version) = 0]"> <latex><xsl:apply-templates select="." mode="latex"/></latex> <html> <IMG BORDER="0"> <xsl:attribute name="SRC"> <xsl:choose> <xsl:when test="(name(/child::node()[1])='tutorial') or (name(/child::node()[1])='laboratory')"> <xsl:text>Graphics/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>-72dpi.png</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="ALT"><xsl:apply-templates select="description"/></xsl:attribute> </IMG> </html> </template> <template match="image[count(provide-large-version) != 0]"> <latex><xsl:apply-templates select="." mode="latex"/></latex> <html> <A> <xsl:attribute name="HREF"> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>-zoom.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> <IMG BORDER="0"> <xsl:attribute name="SRC"> <xsl:text>images/</xsl:text> <xsl:value-of select="basename"/> <xsl:text>.</xsl:text> <xsl:choose> <xsl:when test="count(format) != 0"> <xsl:value-of select="format"/> </xsl:when> <xsl:otherwise> <xsl:text>png</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="ALT"> <xsl:apply-templates select="description"/> </xsl:attribute> </IMG> <BR CLEAR="right"/> <xsl:text>(Larger version)</xsl:text> </A> </html> </template> <!-- Include another XML document into the current one. Including LaTeX should be done using <latex-input>. Nothing for HTML includes at present, although this may not actually be necessary anyway given that HTML doesn't natively support this in the first place. You're probably better off just generating a separate document and linking to it. It's difficult to produce HTML fragments because the XSLT processor seems to always generate a DOCTYPE when producing HTML, whether you want it or not. Maybe you can turn this off? @file: Name of file to include. [required] --> <template name="include-xml" match="include-document"> <common> <xsl:apply-templates select="document(@file)"/> </common> </template> <!-- Environment setup. This enables you to load environment settings (e.g., required LaTeX packages, etc.) from an external configuration file. The master style sheet automatically loads a file called "environment.xml"; you don't need to do anything for this file to be loaded. Multiple configuration files may be loaded, as long as they all have different names. You can also define environment entries inline by omitting the file attribute. @file: Name of environment file. [optional] Note: this may produce an error if the file doesn't exist. The XSLT processor should be able to continue from this, however. --> <template name="environment" match="environment[@file]"> <xsl:apply-templates select="document(@file)/environment/*"/> </template> <!-- Load a LaTeX package. @options: Any arguments to the package. [optional] --> <template name="latex-package" match="latex-packages/package"> <latex>\usepackage<xsl:if test="@options">[<xsl:value-of select="@options"/>]</xsl:if>{<xsl:value-of select="."/>}</latex> </template> <template name="latex-command" match="latex-packages/command"> <latex><xsl:value-of select="."/></latex> </template> <!-- Sometimes we might need to embed raw code to handle something tricky. --> <template name="raw-latex" match="raw-code[@format = 'latex']"> <latex><xsl:apply-templates/></latex> </template> <template name="raw-html" match="raw-code[@format = 'html']"> <html><xsl:copy-of select="*"/></html> </template> <!-- Generate a LaTeX \input{} macro. --> <template name="latex-input" match="latex-input"> <latex>\input{<xsl:value-of select="."/>}</latex> </template> <!-- Conditional processing depending on the format. It may appear redundant to have two templates, but this is the only way to ensure that the LaTeX template is empty in the HTML style sheet, and vice versa. @format: the format under which this XML is to be processed. [required] --> <template name="process-when-latex" match="process-when[@format = 'latex']"> <latex><xsl:apply-templates/></latex> </template> <template name="process-when-html" match="process-when[@format = 'html']"> <html><xsl:apply-templates/></html> </template> <!-- Basic maths stuff. Anything more complicated is... complicated. We should probably be using MathML, but we still have to mangle it into HTML regardless. A <math> inside a <paragraph> is assumed to be inline, while a <math> on its own is assumed to be displayed in its own paragraph. --> <template name="math-inline" match="paragraph//math|para//math|p//math"> <latex>\(<xsl:apply-templates mode="math"/>\)</latex> <html><xsl:apply-templates mode="math"/></html> </template> <template name="math-display" match="math"> <latex>\[<xsl:apply-templates mode="math"/>\]</latex> <html><P ALIGN="center"><xsl:apply-templates mode="math"/></P></html> </template> <!-- Equation arrays --> <template name="equation-array" match="equation-array"> <latex> <xsl:text>\begin{eqnarray*} </xsl:text> <xsl:apply-templates mode="math"/> <xsl:text>\end{eqnarray*}</xsl:text> </latex> <html> <TABLE CLASS="equation" BORDER="0" ALIGN="CENTER"><xsl:apply-templates mode="math"/></TABLE> </html> </template> <!-- Hmm, LaTeX uses "&" as separators: how do we know if there's another cell coming? Ah, but the LaTeX eqnarray can have no more than three columns, so there's no need to generalise. --> <template match="equation-array/row" mode="math"> <latex> <xsl:apply-templates select="left" mode="math"/><xsl:text disable-output-escaping="yes"> & </xsl:text><xsl:apply-templates select="middle" mode="math"/><xsl:text disable-output-escaping="yes"> & </xsl:text><xsl:apply-templates select="right" mode="math"/><xsl:text> \\ \\ </xsl:text> </latex> <html> <TR><TD ALIGN="RIGHT"><xsl:apply-templates select="left"/></TD><TD ALIGN="CENTER"><xsl:apply-templates select="middle"/></TD><TD ALIGN="LEFT"><xsl:apply-templates select="right"/></TD></TR> </html> </template> <!-- Roman (upright) text inside math environments. \mathrm sounds like it's probably more correct, but doesn't retain spaces (which \textup does). --> <template name="math-text" match="text" mode="math"> <latex>\textup{<xsl:apply-templates mode="math"/>}</latex> <html><xsl:apply-templates mode="math"/></html> </template> <!-- Digit grouping separator character for large numbers. SI conventions say this should be a space (but we could make it a comma if desired). --> <template name="digit-group-separator" match="digit-group-separator|digitsep"> <common> <xsl:call-template name="non-breaking-space"/> </common> </template> <template name="digit-group-separator-math" match="digit-group-separator|digitsep" mode="math"> <common> <xsl:call-template name="non-breaking-space"/> </common> </template> <!-- Mathematical super- and subscript. --> <template name="superscript-math" match="superscript" mode="math"> <latex>^{<xsl:apply-templates mode="math"/>}</latex> <html><SUP><xsl:apply-templates mode="math"/></SUP></html> </template> <template name="subscript-math" match="subscript" mode="math"> <latex>_{<xsl:apply-templates mode="math"/>}</latex> <html><SUB><xsl:apply-templates mode="math"/></SUB></html> </template> <!-- Basic mathematical operators. Unfortunately we need to define math and non-math mode versions of each template even when they're identical, because if we're in math mode, non-math mode templates are ignored (as far as I can tell anyway). There's no such thing as mode="*" :( Do we need <left-parenthesis> and <right-parenthesis>? Maybe we're getting a little carried away with these :) --> <template name="plus-operator-math" match="plus" mode="math"> <common>+</common> </template> <template name="plus-operator" match="plus"> <common>+</common> </template> <template name="minus-operator-math" match="minus" mode="math"> <common>-</common> </template> <template name="minus-operator" match="minus"> <latex>\(-\)</latex> <html>-</html> </template> <template name="times-operator-math" match="times" mode="math"> <latex>\times</latex> <html><xsl:text disable-output-escaping="yes"> &#215; </xsl:text></html> </template> <template name="times-operator" match="times"> <latex>\(\times\)</latex> <html><xsl:text disable-output-escaping="yes"> &#215; </xsl:text></html> </template> <template name="divide-operator-math" match="divide" mode="math"> <common>/</common> </template> <template name="divide-operator" match="divide"> <common>/</common> </template> <template name="equals-operator-math" match="equals" mode="math"> <!-- Need spaces for HTML as they seem to get munched otherwise. --> <common> = </common> </template> <template name="equals-operator" match="equals"> <common> = </common> </template> <template name="approximately-equals-operator-math" match="approximately-equals|approximately-equal-to|approx" mode="math"> <latex>{\approx}</latex> <html><xsl:text disable-output-escaping="yes">&#8776;</xsl:text></html> </template> <template name="approximately-equals-operator" match="approximately-equals|approximately-equal-to|approx"> <latex>\(\approx\)</latex> <html><xsl:text disable-output-escaping="yes">&#8776;</xsl:text></html> </template> <template name="degree-sign-math" match="degree-sign" mode="math"> <latex>^{\circ}</latex> <html><xsl:text disable-output-escaping="yes">&#176;</xsl:text></html> </template> <!-- The equivalent of LaTeX's "log-like functions". @name: The name of the function. We assume the names used by LaTeX here, as they work out correct anyway. There's actually nothing to stop you using any name you like, except that it'll probably die horribly in LaTeX :) [required] --> <template name="log-like-function" match="function" mode="math"> <latex>\<xsl:value-of select="@name"/></latex> <html><xsl:value-of select="@name"/></html> </template> <!-- Any mathematical variable names. --> <template name="math-variable" match="variable" mode="math"> <latex><xsl:apply-templates mode="math"/></latex> <html><I><xsl:apply-templates mode="math"/></I></html> </template> <!-- A displayed fraction. Is there a nicer way of doing this in HTML? --> <template name="math-fraction" match="fraction" mode="math"> <latex>\frac{<xsl:apply-templates select="numerator" mode="math"/>}{<xsl:apply-templates select="denominator" mode="math"/>}</latex> <html><xsl:apply-templates select="numerator" mode="math"/><BIG> / </BIG><xsl:apply-templates select="denominator" mode="math"/></html> </template> </stylesheet>
Ignore Space
Show notes
View
xml2xslt.xsl
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl-out="[irrelevant]" xmlns:exsl="http://exslt.org/common" > <!-- OK, this is my first bash at an XSLT transformation for a master XML document defining how to transform elements in the course handbook source into HTML and LaTeX. Hmm, meta-stylesheet?! --> <!-- <xsl:output method="text" encoding="ISO-8859-1" media-type="text/xml"/> --> <xsl:output method="xml" encoding="ISO-8859-1" cdata-section-elements="html"/> <!-- Produce HTML or LaTeX output? --> <!-- <xsl:param name="format" select="'html'"/> --> <xsl:param name="format">html</xsl:param> <!-- Define an alias for the xsl namespace to avoid confusion when generating xsl: elements in the output of this stylesheet. --> <xsl:namespace-alias stylesheet-prefix="xsl-out" result-prefix="xsl"/> <xsl:variable name="newline"> <xsl:text> </xsl:text> </xsl:variable> <xsl:variable name="space"><xsl:text> </xsl:text></xsl:variable> <xsl:template match="/"> <xsl-out:stylesheet version="1.0"> <xsl-out:strip-space elements="*"/> <!-- Would it be more accurate to call this 'subject' rather than 'department'? --> <xsl-out:param name="department">INFO</xsl-out:param> <xsl-out:param name="paper"/> <xsl-out:param name="subject-code">INFO</xsl-out:param> <xsl-out:param name="paper-number"/> <xsl-out:param name="showanswers" select="'no'"/> <!-- copy in the generated Oracle documentation code --> <xsl:copy-of select="document('oracle-docs.xsl')/stylesheet/*"/> <!-- <xsl:include href="oracle-docs.xsl" /> --> <!-- root-level documents should say what type/class of document they are (lecture, tutorial, generic, ...). Do we want to call this a class or a type? --> <!-- <xsl:variable name="doctype"><xsl:value-of select="/document/@type"/></xsl:variable> --> <xsl:choose> <xsl:when test="$format='html'"> <!-- *** HTML Output *** --> <!-- Old version: before using xsl:namespace-alias: --> <!-- <xsl-out:element name="xsl:output"> <xsl-out:attribute name="method">html</xsl-out:attribute> <xsl-out:attribute name="encoding">ISO-8859-1</xsl-out:attribute> <xsl-out:attribute name="media-type">text/html</xsl-out:attribute> <xsl-out:attribute name="doctype-public">-//W3C//DTD HTML 4.01 Transitional//EN</xsl-out:attribute> </xsl-out:element> --> <!-- New, simplified version: --> <xsl-out:output method="html" encoding="ISO-8859-1" media-type="text/html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/> <!-- Nope, includes can only appear as a child of xsl:stylesheet. --> <!-- <xsl-out:include href="xml2html-root.xsl"/> --> <xsl-out:template match="/document"> <xsl-out:comment> THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! </xsl-out:comment> <HTML> <HEAD> <LINK REL="Stylesheet" HREF="http://info-nts-05.otago.ac.nz/info321/styles.css" TYPE="text/css"/> <TITLE> <xsl-out:apply-templates select="title" mode="preamble"/> </TITLE> </HEAD> <BODY> <xsl-out:apply-templates/> <!-- How best to approach this - certain elements that need special handling (e.g. title, author) shouldn't be passed through here as well. --> <!-- How about we just match certain elements that we know can be handled safely, e.g. sections, paragraphs, ...? (...and their aliases?) --> <!-- Are introductions just another section, or should there be an introduction element? --> <!-- The solution is to get cleverer with our templates, e.g., multiple templates for <title> that have different match patterns (document/title, section/title). --> <!-- We also need to define an empty template for the <document-metadata> element so that its contents get ignored. --> <!-- Once these are done, we can just go apply-templates and forget about it. --> <HR/> <ADDRESS> <xsl-out:apply-templates select="copyright"/> <!-- Were we going with '/document/metadata'? --> <xsl-out:apply-templates select="document-metadata/cvs-id"/> <xsl-out:apply-templates select="/document/metadata/cvs-id"/> </ADDRESS> </BODY> </HTML> </xsl-out:template> </xsl:when> <xsl:when test="$format='latex'"> <!-- <xsl-out:output method="text" encoding="UTF-8" media-type="text/plain"/> --> <xsl-out:output method="text" encoding="ISO-8859-1" media-type="text/plain"/> <!-- Set to pdf if using PDFLaTeX, otherwise eps. --> <xsl-out:param name="image-format">pdf</xsl-out:param> <!-- Set to no if you want this to be included inside another document. --> <xsl-out:param name="standalone">yes</xsl-out:param> <!-- *** LaTeX Source Output *** --> <!-- Should this produce a LaTeX source fragment or an entire valid source document? --> <xsl-out:template match="/document"> <xsl-out:choose> <!-- Could perhaps deal with loading LaTeX packages using a <latex-package> element? --> <xsl-out:when test="$standalone = 'yes'"> % THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! \documentclass[12pt,a4paper]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpple} \usepackage{multirow} \usepackage{graphicx} <xsl-out:apply-templates select="document('environment.xml')/environment/latex-packages"/> \usepackage[pdftex]{hyperref} <xsl-out:apply-templates select="document('environment.xml')/environment/latex-commands"/> <xsl-out:apply-templates select="title" mode="preamble"/> <xsl-out:apply-templates select="author" mode="preamble"/> <xsl-out:apply-templates select="date" mode="preamble"/> \begin{document} \maketitle <xsl-out:apply-templates/> \vfill {\scriptsize \hfill \verb+<xsl-out:apply-templates select="document-metadata/cvs-id"/>+} \end{document} </xsl-out:when> <!-- Not standalone: --> <!-- Hmm, maybe this should go in format-master.xml... --> <xsl-out:when test="/document/@class = 'tutorial'"> \tutorial{<xsl-out:apply-templates select="/document/title" mode="chapter"/>} <!-- <xsl-out:apply-templates select="/tutorial/introduction"/> <xsl-out:for-each select="/tutorial/section"> --> <xsl-out:apply-templates select="*[not(self::title)]"/> <!-- </xsl-out:for-each> --> \vfill {\scriptsize \hfill \verb+<xsl-out:value-of select="/document/metadata/cvs-id"/>+} </xsl-out:when> <xsl-out:when test="/document/@class = 'laboratory'"> \lab{<xsl-out:apply-templates select="/document/title" mode="chapter"/>} <!-- <xsl-out:apply-templates select="/laboratory/introduction"/> <xsl-out:for-each select="/tutorial/section"> --> <xsl-out:apply-templates select="*[not(self::title)]"/> <!-- </xsl-out:for-each> --> \vfill {\scriptsize \hfill \verb+<xsl-out:value-of select="/document/metadata/cvs-id"/>+} </xsl-out:when> <xsl-out:otherwise> <!-- maybe we should assume that we're in a book documentclass and issue a \chapter here? --> \chapter{<xsl-out:apply-templates select="/document/title" mode="chapter"/>} </xsl-out:otherwise> </xsl-out:choose> </xsl-out:template> <!-- <xsl-out:element name="xsl:output"> <xsl-out:attribute name="method">text</xsl-out:attribute> <xsl-out:attribute name="encoding">ISO-8859-1</xsl-out:attribute> <xsl-out:attribute name="media-type">text/plain</xsl-out:attribute> </xsl-out:element> --> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes"> <xsl:text>Sorry, unknown format: </xsl:text><xsl:value-of select="$format"/> </xsl:message> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl-out:stylesheet> </xsl:template> <!-- General-purpose template-producing template. --> <!--<xsl:template match="template"><![CDATA[<xsl-out:template name="]]><xsl-out:value-of select="name"/><![CDATA[" match="]]><xsl-out:value-of select="match"/><![CDATA[">]]><xsl-out:copy-of select="*[local-name(.)=$format]"/><![CDATA[</xsl-out:template>]]></xsl-out:template>--> <xsl:template match="template"> <xsl-out:template> <!-- Much easier to just copy all attributes across verbatim rather --> <!-- than copying specific named attributes, because we might want to use --> <!-- attributes that weren't originally anticipated. --> <!-- Might this be a problem in future? --> <xsl:copy-of select="@*"/> <!-- <xsl:if test="@name"> --> <!-- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> --> <!-- </xsl:if> --> <!-- <xsl:if test="@match"> --> <!-- <xsl:attribute name="match"><xsl:value-of select="@match"/></xsl:attribute> --> <!-- </xsl:if> --> <!-- Copy across code that is common to all formats. --> <xsl:copy-of select="common/node()"/> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="*[name(.)=$format]/node()"/> <!-- <xsl:copy-of select="node()"/> --> <!-- <xsl:if test="$format='latex'"> <xsl:copy-of select="latex/*"/> </xsl:if> <xsl:if test="$format='html'"> <xsl:copy-of select="html/*"/> </xsl:if> --> </xsl-out:template> </xsl:template> <!-- This template produces a template that calls another template, i.e. it implements a template alias. --> <!-- The generated template probably doesn't need a name, but we'll put one in anyway. --> <xsl:template match="alias"> <xsl-out:template> <xsl:attribute name="name"><xsl:value-of select="@source"/></xsl:attribute> <xsl:attribute name="match"><xsl:value-of select="@source"/></xsl:attribute> <xsl-out:call-template> <xsl:attribute name="name"><xsl:value-of select="@target"/></xsl:attribute> </xsl-out:call-template> </xsl-out:template> </xsl:template> <!-- This template produces a template for processing style-oriented markup, such as empahsis, foreign terms, and quotations. --> <!-- <xsl:template match="d"> </xsl-out:template match> --> <!-- This template produces a template for processing an element that refers to a hyperlink. --> <xsl:template match="hyperlink"> </xsl:template> </xsl:stylesheet>
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl-out="[irrelevant]" xmlns:exsl="http://exslt.org/common" > <!-- OK, this is my first bash at an XSLT transformation for a master XML document defining how to transform elements in the course handbook source into HTML and LaTeX. Hmm, meta-stylesheet?! --> <!-- <xsl:output method="text" encoding="ISO-8859-1" media-type="text/xml"/> --> <xsl:output method="xml" encoding="ISO-8859-1" cdata-section-elements="html"/> <!-- Produce HTML or LaTeX output? --> <!-- <xsl:param name="format" select="'html'"/> --> <xsl:param name="format">html</xsl:param> <!-- Define an alias for the xsl namespace to avoid confusion when generating xsl: elements in the output of this stylesheet. --> <xsl:namespace-alias stylesheet-prefix="xsl-out" result-prefix="xsl"/> <xsl:variable name="newline"> <xsl:text> </xsl:text> </xsl:variable> <xsl:variable name="space"><xsl:text> </xsl:text></xsl:variable> <xsl:template match="/"> <xsl-out:stylesheet version="1.0"> <xsl-out:strip-space elements="*"/> <!-- Would it be more accurate to call this 'subject' rather than 'department'? --> <xsl-out:param name="department">INFO</xsl-out:param> <xsl-out:param name="paper"/> <xsl-out:param name="subject-code">INFO</xsl-out:param> <xsl-out:param name="paper-number"/> <xsl-out:param name="showanswers" select="'no'"/> <!-- copy in the generated Oracle documentation code --> <xsl:copy-of select="document('oracle-docs.xsl')/stylesheet/*"/> <!-- <xsl:include href="oracle-docs.xsl" /> --> <!-- root-level documents should say what type/class of document they are (lecture, tutorial, generic, ...). Do we want to call this a class or a type? --> <!-- <xsl:variable name="doctype"><xsl:value-of select="/document/@type"/></xsl:variable> --> <xsl:choose> <xsl:when test="$format='html'"> <!-- *** HTML Output *** --> <!-- Old version: before using xsl:namespace-alias: --> <!-- <xsl-out:element name="xsl:output"> <xsl-out:attribute name="method">html</xsl-out:attribute> <xsl-out:attribute name="encoding">ISO-8859-1</xsl-out:attribute> <xsl-out:attribute name="media-type">text/html</xsl-out:attribute> <xsl-out:attribute name="doctype-public">-//W3C//DTD HTML 4.01 Transitional//EN</xsl-out:attribute> </xsl-out:element> --> <!-- New, simplified version: --> <xsl-out:output method="html" encoding="ISO-8859-1" media-type="text/html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/> <!-- Nope, includes can only appear as a child of xsl:stylesheet. --> <!-- <xsl-out:include href="xml2html-root.xsl"/> --> <xsl-out:template match="/document"> <xsl-out:comment> THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! </xsl-out:comment> <HTML> <HEAD> <LINK REL="Stylesheet" HREF="http://info-nts-05.otago.ac.nz/info321/styles.css" TYPE="text/css"/> <TITLE> <xsl-out:apply-templates select="title" mode="preamble"/> </TITLE> </HEAD> <BODY> <xsl-out:apply-templates/> <!-- How best to approach this - certain elements that need special handling (e.g. title, author) shouldn't be passed through here as well. --> <!-- How about we just match certain elements that we know can be handled safely, e.g. sections, paragraphs, ...? (...and their aliases?) --> <!-- Are introductions just another section, or should there be an introduction element? --> <!-- The solution is to get cleverer with our templates, e.g., multiple templates for <title> that have different match patterns (document/title, section/title). --> <!-- We also need to define an empty template for the <document-metadata> element so that its contents get ignored. --> <!-- Once these are done, we can just go apply-templates and forget about it. --> <HR/> <ADDRESS> <xsl-out:apply-templates select="copyright"/> <!-- Were we going with '/document/metadata'? --> <xsl-out:apply-templates select="document-metadata/cvs-id"/> <xsl-out:apply-templates select="/document/metadata/cvs-id"/> </ADDRESS> </BODY> </HTML> </xsl-out:template> </xsl:when> <xsl:when test="$format='latex'"> <!-- <xsl-out:output method="text" encoding="UTF-8" media-type="text/plain"/> --> <xsl-out:output method="text" encoding="ISO-8859-1" media-type="text/plain"/> <!-- Set to pdf if using PDFLaTeX, otherwise eps. --> <xsl-out:param name="image-format">pdf</xsl-out:param> <!-- Set to no if you want this to be included inside another document. --> <xsl-out:param name="standalone">yes</xsl-out:param> <!-- *** LaTeX Source Output *** --> <!-- Should this produce a LaTeX source fragment or an entire valid source document? --> <xsl-out:template match="/document"> <xsl-out:choose> <!-- Could perhaps deal with loading LaTeX packages using a <latex-package> element? --> <xsl-out:when test="$standalone = 'yes'"> % THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! \documentclass[12pt,a4paper]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpple} \usepackage{multirow} \usepackage{graphicx} <xsl-out:apply-templates select="document('environment.xml')/environment/latex-packages"/> \usepackage[pdftex]{hyperref} <xsl-out:apply-templates select="document('environment.xml')/environment/latex-commands"/> <xsl-out:apply-templates select="title" mode="preamble"/> <xsl-out:apply-templates select="author" mode="preamble"/> <xsl-out:apply-templates select="date" mode="preamble"/> \begin{document} \maketitle <xsl-out:apply-templates/> \vfill {\scriptsize \hfill \verb+<xsl-out:apply-templates select="document-metadata/cvs-id"/>+} \end{document} </xsl-out:when> <!-- Not standalone: --> <!-- Hmm, maybe this should go in format-master.xml... --> <xsl-out:when test="/document/@class = 'tutorial'"> \tutorial{<xsl-out:apply-templates select="/document/title"/>} <!-- <xsl-out:apply-templates select="/tutorial/introduction"/> <xsl-out:for-each select="/tutorial/section"> --> <xsl-out:apply-templates select="*[not(self::title)]"/> <!-- </xsl-out:for-each> --> <!-- This doesn't work - not sure why. --> \vfill {\scriptsize \hfill \verb+<xsl-out:apply-templates select="/document/metadata/cvs-id"/>+} </xsl-out:when> <xsl-out:when test="/document/@class = 'laboratory'"> \lab{<xsl-out:apply-templates select="/document/title"/>} <!-- <xsl-out:apply-templates select="/laboratory/introduction"/> <xsl-out:for-each select="/tutorial/section"> --> <xsl-out:apply-templates select="*[not(self::title)]"/> <!-- </xsl-out:for-each> --> \vfill {\scriptsize \hfill \verb+<xsl-out:apply-templates select="/document/metadata/cvs-id"/>+} </xsl-out:when> <xsl-out:otherwise> <!-- maybe we should assume that we're in a book documentclass and issue a \chapter here? --> <xsl-out:apply-templates/> </xsl-out:otherwise> </xsl-out:choose> </xsl-out:template> <!-- <xsl-out:element name="xsl:output"> <xsl-out:attribute name="method">text</xsl-out:attribute> <xsl-out:attribute name="encoding">ISO-8859-1</xsl-out:attribute> <xsl-out:attribute name="media-type">text/plain</xsl-out:attribute> </xsl-out:element> --> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes"> <xsl:text>Sorry, unknown format: </xsl:text><xsl:value-of select="$format"/> </xsl:message> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl-out:stylesheet> </xsl:template> <!-- General-purpose template-producing template. --> <!--<xsl:template match="template"><![CDATA[<xsl-out:template name="]]><xsl-out:value-of select="name"/><![CDATA[" match="]]><xsl-out:value-of select="match"/><![CDATA[">]]><xsl-out:copy-of select="*[local-name(.)=$format]"/><![CDATA[</xsl-out:template>]]></xsl-out:template>--> <xsl:template match="template"> <xsl-out:template> <!-- Much easier to just copy all attributes across verbatim rather --> <!-- than copying specific named attributes, because we might want to use --> <!-- attributes that weren't originally anticipated. --> <!-- Might this be a problem in future? --> <xsl:copy-of select="@*"/> <!-- <xsl:if test="@name"> --> <!-- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> --> <!-- </xsl:if> --> <!-- <xsl:if test="@match"> --> <!-- <xsl:attribute name="match"><xsl:value-of select="@match"/></xsl:attribute> --> <!-- </xsl:if> --> <!-- Copy across code that is common to all formats. --> <xsl:copy-of select="common/node()"/> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="*[name(.)=$format]/node()"/> <!-- <xsl:copy-of select="node()"/> --> <!-- <xsl:if test="$format='latex'"> <xsl:copy-of select="latex/*"/> </xsl:if> <xsl:if test="$format='html'"> <xsl:copy-of select="html/*"/> </xsl:if> --> </xsl-out:template> </xsl:template> <!-- This template produces a template that calls another template, i.e. it implements a template alias. --> <!-- The generated template probably doesn't need a name, but we'll put one in anyway. --> <xsl:template match="alias"> <xsl-out:template> <xsl:attribute name="name"><xsl:value-of select="@source"/></xsl:attribute> <xsl:attribute name="match"><xsl:value-of select="@source"/></xsl:attribute> <xsl-out:call-template> <xsl:attribute name="name"><xsl:value-of select="@target"/></xsl:attribute> </xsl-out:call-template> </xsl-out:template> </xsl:template> <!-- This template produces a template for processing style-oriented markup, such as empahsis, foreign terms, and quotations. --> <!-- <xsl:template match="d"> </xsl-out:template match> --> <!-- This template produces a template for processing an element that refers to a hyperlink. --> <xsl:template match="hyperlink"> </xsl:template> </xsl:stylesheet>
Show line notes below