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 support for boxed and numbered exercises.
master
1 parent
a24207d
commit
4f45f648840c3b3623875cf103235d9064125a2e
Nigel Stanger
authored
on 4 Sep 2013
Patch
Showing
3 changed files
modules/cross-references.xml
modules/q-and-a.xml
xml2xslt.xsl
Ignore Space
Show notes
View
modules/cross-references.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Cross-references. Note the distinction betwen these and hyperlinks: a cross-reference is merely something like "see Section 2.3", and doesn't necessarily imply a hyperlink, or vice versa. The "reference" mode templates generate the main reference text, e.g., "see Section 2.3", "see Figure 1", etc. The "page-reference" mode template generate page reference text, e.g., "on page 23". --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Top level template for cross-references. There are separate templates below for each type of referenced item, as this is easier to implement. @label: The label of the item that we're referencing. It must be a valid label in both LaTeX and HTML. [required] @include-pageref: If "yes", also append a page reference (LaTeX only; this is handled by the "item-page-reference" template below). --> <template name="reference" match="reference[@label]"> <common> <!-- Find the element whose label is the same as our label. --> <xsl:apply-templates select="//*[@label = current()/@label]" mode="reference" /> <xsl:if test="@include-pageref = 'yes'"> <xsl:apply-templates select="//*[@label = current()/@label]" mode="page-reference" /> </xsl:if> </common> </template> <!-- ERROR: reference element with no label. --> <template name="broken-reference" match="reference[not( @label )]"> <common> <xsl:message terminate="yes">Reference elements must include a label attribute.</xsl:message> </common> </template> <!-- Section reference. --> <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. --> <common formats="/latex/xelatex/"> <xsl:text>Section~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Section&nbsp;</xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1" /> </common> </template> <!-- Figure reference. --> <template name="figure-reference" match="figure" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>Figure~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Figure&nbsp;</xsl:text> <xsl:choose> <xsl:when test="$showanswers='yes'"> <xsl:number count="figure" level="any" format="1" /> </xsl:when> <xsl:otherwise> <xsl:number count="figure[not(ancestor::answer) and not(ancestor::omit) and not(ancestor::comment)]" level="any" format="1" /> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Table reference. --> <template name="table-reference" match="table" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>Table~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Table&nbsp;</xsl:text> <xsl:choose> <xsl:when test="$showanswers='yes'"> <xsl:number count="table" level="any" format="1" /> </xsl:when> <xsl:otherwise> <xsl:number count="table[not(ancestor::answer) and not(ancestor::omit) and not(ancestor::comment)]" level="any" format="1" /> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Exercise reference. --> <template name="exercise-reference" match="exercise" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>Exercise~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Exercise&nbsp;</xsl:text> <xsl:choose> <xsl:when test="$showanswers='yes'"> <xsl:number count="exercise" level="any" format="1" /> </xsl:when> <xsl:otherwise> <xsl:number count="exercise[not(ancestor::answer) and not(ancestor::omit) and not(ancestor::comment)]" level="any" format="1" /> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Common template for item page references, as they're identical for all items. Standalone page references (i.e., not to a specific item) are dealt with below. --> <template name="item-page-reference" match="section|figure|table" mode="page-reference"> <common formats="/latex/xelatex/"> <xsl:text> on page~\pageref{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> </template> <!-- Generate a standalone label for use in direct page references. Any content within the element is ignored. TODO: Hmm, this seems to generate the correct page number in LaTeX but the hyperlink is to the wrong page (one lower?). Something to worry about later. @label: The label to be inserted. It must be a valid label in both LaTeX and HTML. [required] --> <template name="page" match="page[@label]"> <common formats="/latex/xelatex/"> <xsl:text>\label{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <a id="{@label}"></a> </common> </template> <!-- ERROR: page element with no label. --> <template name="broken-page" match="page[not( @label )]"> <common> <xsl:message terminate="yes">Page elements must include a label attribute.</xsl:message> </common> </template> <!-- Standalone direct reference to a page (i.e., not associated with some other item like a figure or table). This only really makes sense in LaTeX, as HTML doesn't have page numbers. For HTML, we fudge things by inserting the string "here", which will make sense if the reference is wrapped with a hyperlink (as they usually should be). --> <template name="direct-page-reference" match="page[@label]" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>page~\pageref{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">here</xsl:text> </common> </template> </stylesheet>
<?xml version="1.0" encoding="utf-8"?> <!-- Cross-references. Note the distinction betwen these and hyperlinks: a cross-reference is merely something like "see Section 2.3", and doesn't necessarily imply a hyperlink, or vice versa. The "reference" mode templates generate the main reference text, e.g., "see Section 2.3", "see Figure 1", etc. The "page-reference" mode template generate page reference text, e.g., "on page 23". --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Top level template for cross-references. There are separate templates below for each type of referenced item, as this is easier to implement. @label: The label of the item that we're referencing. It must be a valid label in both LaTeX and HTML. [required] @include-pageref: If "yes", also append a page reference (LaTeX only; this is handled by the "item-page-reference" template below). --> <template name="reference" match="reference[@label]"> <common> <!-- Find the element whose label is the same as our label. --> <xsl:apply-templates select="//*[@label = current()/@label]" mode="reference" /> <xsl:if test="@include-pageref = 'yes'"> <xsl:apply-templates select="//*[@label = current()/@label]" mode="page-reference" /> </xsl:if> </common> </template> <!-- ERROR: reference element with no label. --> <template name="broken-reference" match="reference[not( @label )]"> <common> <xsl:message terminate="yes">Reference elements must include a label attribute.</xsl:message> </common> </template> <!-- Section reference. --> <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. --> <common formats="/latex/xelatex/"> <xsl:text>Section~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Section&nbsp;</xsl:text> <xsl:number count="section" level="multiple" format="1.1.1.1.1.1" /> </common> </template> <!-- Figure reference. --> <template name="figure-reference" match="figure" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>Figure~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Figure&nbsp;</xsl:text> <xsl:choose> <xsl:when test="$showanswers='yes'"> <xsl:number count="figure" level="any" format="1" /> </xsl:when> <xsl:otherwise> <xsl:number count="figure[not(ancestor::answer) and not(ancestor::omit) and not(ancestor::comment)]" level="any" format="1" /> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Table reference. --> <template name="table-reference" match="table" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>Table~\ref*{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">Table&nbsp;</xsl:text> <xsl:choose> <xsl:when test="$showanswers='yes'"> <xsl:number count="table" level="any" format="1" /> </xsl:when> <xsl:otherwise> <xsl:number count="table[not(ancestor::answer) and not(ancestor::omit) and not(ancestor::comment)]" level="any" format="1" /> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Common template for item page references, as they're identical for all items. Standalone page references (i.e., not to a specific item) are dealt with below. --> <template name="item-page-reference" match="section|figure|table" mode="page-reference"> <common formats="/latex/xelatex/"> <xsl:text> on page~\pageref{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> </template> <!-- Generate a standalone label for use in direct page references. Any content within the element is ignored. TODO: Hmm, this seems to generate the correct page number in LaTeX but the hyperlink is to the wrong page (one lower?). Something to worry about later. @label: The label to be inserted. It must be a valid label in both LaTeX and HTML. [required] --> <template name="page" match="page[@label]"> <common formats="/latex/xelatex/"> <xsl:text>\label{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <a id="{@label}"></a> </common> </template> <!-- ERROR: page element with no label. --> <template name="broken-page" match="page[not( @label )]"> <common> <xsl:message terminate="yes">Page elements must include a label attribute.</xsl:message> </common> </template> <!-- Standalone direct reference to a page (i.e., not associated with some other item like a figure or table). This only really makes sense in LaTeX, as HTML doesn't have page numbers. For HTML, we fudge things by inserting the string "here", which will make sense if the reference is wrapped with a hyperlink (as they usually should be). --> <template name="direct-page-reference" match="page[@label]" mode="reference"> <common formats="/latex/xelatex/"> <xsl:text>page~\pageref{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:text disable-output-escaping="yes">here</xsl:text> </common> </template> </stylesheet>
Ignore Space
Show notes
View
modules/q-and-a.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Elements for generating question and sample answer text in the likes of tutorial and lab exercises. --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Question text. This only exists so that we can ensure that appropriate <p> tags are correctly inserted. If this template didn't exist, showing the answers would generate invalid HTML. The answers are enclosed in a <div class="answer">...</div>. Without this template, the answer markup ends up embedded inside <p>...</p>, which is invalid. --> <template name="question" match="question"> <common formats="/latex/xelatex/"><xsl:apply-templates /></common> <common formats="/html/xhtml/"> <xsl:choose> <!-- Check whether there are actual paragraphs inside the question. If so, let them worry about inserting the <p> tags. --> <xsl:when test="count(paragraph|para|p|question|answer|code-block) != 0"> <xsl:apply-templates /> </xsl:when> <!-- Otherwise, insert <p> tags surrounding the question content. --> <xsl:otherwise> <p><xsl:apply-templates /></p> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Sample answers, which may optionally be excluded from the output. This can be done globally for all answers by setting the style sheet parameter $showanswers to "no", or it can be done locally on a question-by-question basis by setting the @hide attribute of the element to "yes". @hide: If "yes", don't include this answer in the output stream. The default is to include the answer. --> <template name="answer" match="answer"> <common formats="/latex/xelatex/"> <!-- 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'"> <xsl:text>\begin{answer}</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:apply-templates /> <xsl:text>\end{answer}</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:call-template name="newline-internal" /> </xsl:if> </common> <common formats="/html/xhtml/"> <xsl:if test="$showanswers='yes'"> <div class="answer"> <xsl:apply-templates /> </div> </xsl:if> </common> </template> <!-- Match hidden answers and do nothing. --> <template name="hidden-answer" match="answer[@hide='yes']" /> <!-- Generate an "exercise". These are numbered and labelled, and are displayed in a box. @label --> <template name="exercise" match="exercise"> <common formats="/latex/xelatex/"> <xsl:text>\medskip</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:text>\begin{exercise}</xsl:text> <xsl:if test="@label"> <xsl:text>\label{</xsl:text> <xsl:value-of select="@label" /> <xsl:text>}</xsl:text> <xsl:call-template name="newline-internal" /> </xsl:if> <xsl:apply-templates /> <xsl:call-template name="newline-internal" /> <xsl:text>\end{exercise}</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:text>\medskip</xsl:text> </common> <common formats="/html/xhtml/"> <xsl:if test="@label"><a id="{@label}"></a></xsl:if> <p style="border: 1px solid black; padding: 0.25em; margin-top: 0.5em; margin-bottom: 0.5em;"> <strong> <xsl:text>Exercise </xsl:text> <xsl:number count="exercise" level="any" format="1" /> <xsl:text>: </xsl:text> </strong> <xsl:apply-templates /> </p> </common> </template> </stylesheet>
<?xml version="1.0" encoding="utf-8"?> <!-- Elements for generating question and sample answer text in the likes of tutorial and lab exercises. --> <stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- Question text. This only exists so that we can ensure that appropriate <p> tags are correctly inserted. If this template didn't exist, showing the answers would generate invalid HTML. The answers are enclosed in a <div class="answer">...</div>. Without this template, the answer markup ends up embedded inside <p>...</p>, which is invalid. --> <template name="question" match="question"> <common formats="/latex/xelatex/"><xsl:apply-templates /></common> <common formats="/html/xhtml/"> <xsl:choose> <!-- Check whether there are actual paragraphs inside the question. If so, let them worry about inserting the <p> tags. --> <xsl:when test="count(paragraph|para|p|question|answer|code-block) != 0"> <xsl:apply-templates /> </xsl:when> <!-- Otherwise, insert <p> tags surrounding the question content. --> <xsl:otherwise> <p><xsl:apply-templates /></p> </xsl:otherwise> </xsl:choose> </common> </template> <!-- Sample answers, which may optionally be excluded from the output. This can be done globally for all answers by setting the style sheet parameter $showanswers to "no", or it can be done locally on a question-by-question basis by setting the @hide attribute of the element to "yes". @hide: If "yes", don't include this answer in the output stream. The default is to include the answer. --> <template name="answer" match="answer"> <common formats="/latex/xelatex/"> <!-- 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'"> <xsl:text>\begin{answer}</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:apply-templates /> <xsl:text>\end{answer}</xsl:text> <xsl:call-template name="newline-internal" /> <xsl:call-template name="newline-internal" /> </xsl:if> </common> <common formats="/html/xhtml/"> <xsl:if test="$showanswers='yes'"> <div class="answer"> <xsl:apply-templates /> </div> </xsl:if> </common> </template> <!-- Match hidden answers and do nothing. --> <template name="hidden-answer" match="answer[@hide='yes']" /> </stylesheet>
Ignore Space
Show notes
View
xml2xslt.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl-out="[irrelevant]" xmlns:exsl="http://exslt.org/common" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:infosci="http://info-nts-12.otago.ac.nz/infosci"> <!-- 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="utf-8" media-type="text/xml" /> --> <xsl:output method="xml" encoding="utf-8" cdata-section-elements="html" /> <!-- What target format are we generating a styesheet for? Possible values: html, xhtml, latex (includes pdflatex), xelatex. --> <xsl:param name="target-format"><xsl:text>html</xsl:text></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" /> <!-- Some useful variables. (Could some of these become callable templates?) --> <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="2.0" exclude-result-prefixes="exsl"> <xsl-out:strip-space elements="*" /> <xsl-out:param name="subject-code"><xsl:text>INFO</xsl:text></xsl-out:param> <xsl-out:param name="paper-number" /> <xsl-out:param name="paper-year" select="year-from-date( current-date() )"/> <xsl-out:param name="period-code" /> <xsl-out:param name="showanswers"><xsl:text>no</xsl:text></xsl-out:param> <xsl-out:param name="base-path"><xsl:text>.</xsl:text></xsl-out:param> <!-- Full period string corresponding to the supplied period code. --> <xsl-out:variable name="period-string"> <xsl-out:choose> <xsl-out:when test="$period-code = 'SS'"> <xsl-out:text>Summer School</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'S1'"> <xsl-out:text>Semester One</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'S2'"> <xsl-out:text>Semester Two</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'FY'"> <xsl-out:text>Full Year</xsl-out:text> </xsl-out:when> <xsl-out:otherwise> <xsl-out:message terminate="yes"> <xsl-out:text>Unrecognised period code "</xsl-out:text> <xsl-out:value-of select="$period-code" /> <xsl-out:text>".</xsl-out:text> </xsl-out:message> </xsl-out:otherwise> </xsl-out:choose> </xsl-out:variable> <!-- The date and time when the document was last built. --> <xsl-out:variable name="date-built" select="current-dateTime()" /> <!-- Get the name of the document being processed. --> <xsl-out:variable name="document-name" select="reverse( tokenize( base-uri(), '/' ) )[1]" /> <!-- Include the generated Oracle documentation code. --> <xsl-out:include href="oracle-docs.xsl" /> <!-- Include the generated teaching calendar dates. --> <!-- <xsl-out:include href="calendar_dates.xsl" /> --> <!-- We're going to use the text encoding in a few different places, so let's work out what it should be now. --> <xsl:variable name="text-encoding"> <xsl:choose> <xsl:when test="($target-format = 'latex') or ($target-format = 'html')"> <xsl:text>iso-8859-1</xsl:text> </xsl:when> <xsl:when test="($target-format = 'xelatex') or ($target-format = 'xhtml')"> <xsl:text>utf-8</xsl:text> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes"> <xsl:text>Sorry, unknown target format: </xsl:text><xsl:value-of select="$target-format" /> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- 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> --> <!-- First, output the document preamble according to target format. This is generally different for each target format. --> <xsl:choose> <!-- The HTML formats are fairly simple: the only things that change are the doctypes, version number and text encoding. --> <xsl:when test="$target-format = 'html'"> <xsl-out:output method="html" encoding="{$text-encoding}" version="4.01" media-type="text/html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd" /> </xsl:when> <xsl:when test="$target-format = 'xhtml'"> <xsl-out:output method="xml" encoding="{$text-encoding}" byte-order-mark="no" version="1.1" media-type="text/html" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> </xsl:when> <!-- The LaTeX formats, however have a bunch of miscellaneous boilerplate that appears at the start of every document, and requires more complex interleaving because of hyperref. Since we need to stuff this into a template later on, we define this using a callable template, so that we can do useful things like apply-templates within it (which wouldn't work if we just used a variable). --> <xsl:when test="$target-format = 'latex'"> <xsl-out:output method="text" encoding="{$text-encoding}" media-type="text/plain" /> <!-- Set to no if you want this to be included inside another document. Appears here because it's used in the document preamble. --> <xsl-out:param name="standalone"><xsl:text>yes</xsl:text></xsl-out:param> <xsl-out:template name="latex-preamble"> <xsl-out:text> \usepackage{mathpazo} % mathpple is deprecated \usepackage[T1]{fontenc} \usepackage{textcomp} </xsl-out:text> <xsl-out:apply-templates select="environment/latex-packages" /> <xsl-out:text> % Safer to specify the hyperref options directly rather than relying on % the default hyperref.cfg, as XeLaTeX seems to ignore it :(. \usepackage[ pdftex,% pdfpagemode=UseNone,% colorlinks,% urlcolor=blue,% citecolor=blue,% linkcolor=blue,% breaklinks ]{hyperref} \renewcommand{\ttdefault}{blg} </xsl-out:text> </xsl-out:template> </xsl:when> <xsl:when test="$target-format = 'xelatex'"> <xsl-out:output method="text" encoding="{$text-encoding}" media-type="text/plain" /> <!-- Set to no if you want this to be included inside another document. Appears here because it's used in the document preamble. --> <xsl-out:param name="standalone"><xsl:text>yes</xsl:text></xsl-out:param> <xsl-out:template name="latex-preamble"> <xsl-out:text> \usepackage[no-math]{fontspec} \usepackage{mathspec} \usepackage{xunicode} \usepackage{xltxtra} \usepackage{textcomp} % ??? </xsl-out:text> <xsl-out:apply-templates select="environment/latex-packages" /> <xsl-out:text> % Safer to specify the hyperref options directly rather than relying on % the default hyperref.cfg, as XeLaTeX seems to ignore it :(. \usepackage[ xetex,% pdfpagemode=UseNone,% colorlinks,% urlcolor=blue,% citecolor=blue,% linkcolor=blue,% breaklinks ]{hyperref} \defaultfontfeatures{Mapping=tex-text} \setmainfont{TeX Gyre Pagella} \setmathsfont(Digits){TeX Gyre Pagella} \setmonofont[Scale=MatchLowercase]{Letter Gothic 12 Pitch} </xsl-out:text> </xsl-out:template> </xsl:when> <!-- No need for an otherwise, as weird target formats will have already been trapped by the definition of the text-encoding variable above. --> </xsl:choose> <!-- Next, output the main document body according to target format. This is generally the same across similar target formats. --> <xsl:choose> <xsl:when test="($target-format = 'html') or ($target-format = 'xhtml')"> <!-- *** (X)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">UTF-8</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> --> <!-- Default to PNG images for web dispay. --> <xsl-out:param name="image-format"><xsl:text>png</xsl:text></xsl-out:param> <!-- 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> <xsl-out:element name="link"> <xsl-out:attribute name="rel"> <xsl-out:text>Stylesheet</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="href"> <xsl-out:text>https://blackboard.otago.ac.nz/bbcswebdav/courses/</xsl-out:text> <xsl-out:value-of select="$subject-code" /> <xsl-out:value-of select="$paper-number" /> <xsl-out:text>_</xsl-out:text> <xsl-out:value-of select="$period-code" /> <xsl-out:text>DNS_</xsl-out:text> <xsl-out:value-of select="$paper-year" /> <xsl-out:text>/db_styles.css</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="type"> <xsl-out:text>text/css</xsl-out:text> </xsl-out:attribute> </xsl-out:element> <xsl-out:element name="meta"> <xsl-out:attribute name="http-equiv"> <xsl-out:text>Content-type</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="content"> <xsl-out:text> <xsl:text>text/html;charset=</xsl:text> <xsl:value-of select="$text-encoding" /> </xsl-out:text> </xsl-out:attribute> </xsl-out:element> <title> <xsl-out:choose> <xsl-out:when test="@class = 'calendar'"> <xsl-out:value-of select="$subject-code" /> <xsl-out:value-of select="$paper-number" /> <xsl-out:text> Teaching Calendar, </xsl-out:text> <xsl-out:value-of select="$period-string" /> <xsl-out:text>, </xsl-out:text> <xsl-out:value-of select="$paper-year" /> </xsl-out:when> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="preamble" /> </xsl-out:otherwise> </xsl-out:choose> </title> </head> <body> <xsl-out:choose> <xsl-out:when test="@class = 'calendar'" /> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="title" /> <xsl-out:apply-templates select="due-date" mode="title" /> </xsl-out:otherwise> </xsl-out:choose> <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 /> <!-- Since HTML doesn't support footnotes as such, we instead include them as endnotes at the end of the document. --> <xsl-out:if test="count(//footnote) > 0"> <h3>Notes</h3> <xsl-out:apply-templates select="//footnote" mode="list" /> <hr /> </xsl-out:if> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </body> </html> </xsl-out:template> </xsl:when> <xsl:when test="($target-format = 'latex') or ($target-format = 'xelatex')"> <!-- Set to pdf if using PDFLaTeX, otherwise eps. --> <xsl-out:param name="image-format"><xsl:text>pdf</xsl:text></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> <xsl-out:when test="$standalone = 'yes'"> <xsl-out:text> % THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! \documentclass[12pt,a4paper]{article} \usepackage[margin=1in]{geometry} \usepackage{multirow} \usepackage{graphicx} \usepackage{verbatim} % needed for \verbatiminput \usepackage{relalg} % needed for join operators \usepackage{pifont} \usepackage{siunitx} % number and SI unit formatting \usepackage{listings} % nicely formatted code listings \usepackage[normalem]{ulem} % fancy underlining, strikeout, etc. \usepackage{boxedminipage} </xsl-out:text> <xsl-out:call-template name="latex-preamble" /> <xsl-out:apply-templates select="environment/latex-commands" /> <xsl-out:text> \newenvironment{answer}{\par\vspace{0.5em}\itshape}{\normalfont\vspace{1.5em}} % Listings setup. We preload the most obviously like languages to speed things % up. Other languages will still work, just not quite as quickly. \lstloadlanguages{Oracle} \lstset{basicstyle=\ttfamily,basewidth=0.5em,escapeinside={(@}{@)}, showspaces=false,showstringspaces=false} % Environment for worksheet exercises. \newcounter{exercise} \setcounter{exercise}{0} \newenvironment{exercise}% {\noindent\refstepcounter{exercise}\begin{boxedminipage}{\columnwidth}\textbf{Exercise \theexercise:}}% {\end{boxedminipage}} </xsl-out:text> <xsl-out:apply-templates select="title" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:apply-templates select="author" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:apply-templates select="date|due-date" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:text> \begin{document} \maketitle </xsl-out:text> <xsl-out:apply-templates /> <!-- If you're having problems with the build date appearing in weird or annoying locations (usually because of floating items like tables and figures), set document/@auto-latex-build-date to "no". You can then use the build-date element to insert the build date wherever you like, if necessary. This really only applies to LaTeX documents. The behaviour of HTML documents is much more predictable because they don't have elements with "minds of their own", so the build date is guaranteed to always appear at the very end. --> <xsl-out:if test="not( @auto-latex-build-date ) or ( @auto-latex-build-date != 'no' )"> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </xsl-out:if> <xsl-out:text>\end{document}</xsl-out:text> </xsl-out:when> <!-- Not standalone: --> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="chapter" /> <xsl-out:apply-templates select="*[not(self::title)]" /> <xsl-out:if test="not( @auto-latex-build-date ) or ( @auto-latex-build-date != 'no' )"> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </xsl-out:if> </xsl-out:otherwise> </xsl-out:choose> </xsl-out:template> </xsl:when> <!-- No need for an otherwise, as weird formats will have already been trapped by the definition of the text-encoding variable above. --> </xsl:choose> <xsl:apply-templates /> </xsl-out:stylesheet> </xsl:template> <!-- Copy across templates according to the target format. If there's no common code for a particular format, an empty template is generated. --> <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="@*" /> <!-- Copy across code that is common to ALL target formats. Any code not specific to a particular target format will therefore always appear FIRST in the resulting template. --> <xsl:copy-of select="common[not(@formats)]/node()" /> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="common[contains(@formats, concat('/', $target-format, '/'))]/node()" /> <xsl:copy-of select="*[name(.) = $target-format]/node()" /> </xsl-out:template> </xsl:template> <!-- Dealing with functions is slightly more complex than templates, as functions aren't allowed to be empty. We therefore have to completely ignore function definitions that have no code for the target format. The second, more specific template will match in preference to the empty one. --> <xsl:template match="function" /> <xsl:template match="function[common[contains( @formats, concat( '/', $target-format, '/' ) )]]|function[common[not( @formats )]]"> <xsl-out:function> <!-- 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="@*" /> <!-- Copy across code that is common to ALL target formats. Any code not specific to a particular target format will therefore always appear FIRST in the resulting template. --> <xsl:copy-of select="common[not( @formats )]/node()" /> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="common[contains( @formats, concat( '/', $target-format, '/' ) )]/node()" /> <xsl:copy-of select="*[name( . )=$target-format]/node()" /> </xsl-out:function> </xsl:template> <!-- Include templates from a stylesheet sub-module. This enables us to modularise the master stylesheet. --> <xsl:template match="include"> <xsl:apply-templates select="document( @href )/stylesheet/*" /> </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" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl-out="[irrelevant]" xmlns:exsl="http://exslt.org/common" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:infosci="http://info-nts-12.otago.ac.nz/infosci"> <!-- 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="utf-8" media-type="text/xml" /> --> <xsl:output method="xml" encoding="utf-8" cdata-section-elements="html" /> <!-- What target format are we generating a styesheet for? Possible values: html, xhtml, latex (includes pdflatex), xelatex. --> <xsl:param name="target-format"><xsl:text>html</xsl:text></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" /> <!-- Some useful variables. (Could some of these become callable templates?) --> <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="2.0" exclude-result-prefixes="exsl"> <xsl-out:strip-space elements="*" /> <xsl-out:param name="subject-code"><xsl:text>INFO</xsl:text></xsl-out:param> <xsl-out:param name="paper-number" /> <xsl-out:param name="paper-year" select="year-from-date( current-date() )"/> <xsl-out:param name="period-code" /> <xsl-out:param name="showanswers"><xsl:text>no</xsl:text></xsl-out:param> <xsl-out:param name="base-path"><xsl:text>.</xsl:text></xsl-out:param> <!-- Full period string corresponding to the supplied period code. --> <xsl-out:variable name="period-string"> <xsl-out:choose> <xsl-out:when test="$period-code = 'SS'"> <xsl-out:text>Summer School</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'S1'"> <xsl-out:text>Semester One</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'S2'"> <xsl-out:text>Semester Two</xsl-out:text> </xsl-out:when> <xsl-out:when test="$period-code = 'FY'"> <xsl-out:text>Full Year</xsl-out:text> </xsl-out:when> <xsl-out:otherwise> <xsl-out:message terminate="yes"> <xsl-out:text>Unrecognised period code "</xsl-out:text> <xsl-out:value-of select="$period-code" /> <xsl-out:text>".</xsl-out:text> </xsl-out:message> </xsl-out:otherwise> </xsl-out:choose> </xsl-out:variable> <!-- The date and time when the document was last built. --> <xsl-out:variable name="date-built" select="current-dateTime()" /> <!-- Get the name of the document being processed. --> <xsl-out:variable name="document-name" select="reverse( tokenize( base-uri(), '/' ) )[1]" /> <!-- Include the generated Oracle documentation code. --> <xsl-out:include href="oracle-docs.xsl" /> <!-- Include the generated teaching calendar dates. --> <!-- <xsl-out:include href="calendar_dates.xsl" /> --> <!-- We're going to use the text encoding in a few different places, so let's work out what it should be now. --> <xsl:variable name="text-encoding"> <xsl:choose> <xsl:when test="($target-format = 'latex') or ($target-format = 'html')"> <xsl:text>iso-8859-1</xsl:text> </xsl:when> <xsl:when test="($target-format = 'xelatex') or ($target-format = 'xhtml')"> <xsl:text>utf-8</xsl:text> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes"> <xsl:text>Sorry, unknown target format: </xsl:text><xsl:value-of select="$target-format" /> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- 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> --> <!-- First, output the document preamble according to target format. This is generally different for each target format. --> <xsl:choose> <!-- The HTML formats are fairly simple: the only things that change are the doctypes, version number and text encoding. --> <xsl:when test="$target-format = 'html'"> <xsl-out:output method="html" encoding="{$text-encoding}" version="4.01" media-type="text/html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd" /> </xsl:when> <xsl:when test="$target-format = 'xhtml'"> <xsl-out:output method="xml" encoding="{$text-encoding}" byte-order-mark="no" version="1.1" media-type="text/html" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> </xsl:when> <!-- The LaTeX formats, however have a bunch of miscellaneous boilerplate that appears at the start of every document, and requires more complex interleaving because of hyperref. Since we need to stuff this into a template later on, we define this using a callable template, so that we can do useful things like apply-templates within it (which wouldn't work if we just used a variable). --> <xsl:when test="$target-format = 'latex'"> <xsl-out:output method="text" encoding="{$text-encoding}" media-type="text/plain" /> <!-- Set to no if you want this to be included inside another document. Appears here because it's used in the document preamble. --> <xsl-out:param name="standalone"><xsl:text>yes</xsl:text></xsl-out:param> <xsl-out:template name="latex-preamble"> <xsl-out:text> \usepackage{mathpazo} % mathpple is deprecated \usepackage[T1]{fontenc} \usepackage{textcomp} </xsl-out:text> <xsl-out:apply-templates select="environment/latex-packages" /> <xsl-out:text> % Safer to specify the hyperref options directly rather than relying on % the default hyperref.cfg, as XeLaTeX seems to ignore it :(. \usepackage[ pdftex,% pdfpagemode=UseNone,% colorlinks,% urlcolor=blue,% citecolor=blue,% linkcolor=blue,% breaklinks ]{hyperref} \renewcommand{\ttdefault}{blg} </xsl-out:text> </xsl-out:template> </xsl:when> <xsl:when test="$target-format = 'xelatex'"> <xsl-out:output method="text" encoding="{$text-encoding}" media-type="text/plain" /> <!-- Set to no if you want this to be included inside another document. Appears here because it's used in the document preamble. --> <xsl-out:param name="standalone"><xsl:text>yes</xsl:text></xsl-out:param> <xsl-out:template name="latex-preamble"> <xsl-out:text> \usepackage[no-math]{fontspec} \usepackage{mathspec} \usepackage{xunicode} \usepackage{xltxtra} \usepackage{textcomp} % ??? </xsl-out:text> <xsl-out:apply-templates select="environment/latex-packages" /> <xsl-out:text> % Safer to specify the hyperref options directly rather than relying on % the default hyperref.cfg, as XeLaTeX seems to ignore it :(. \usepackage[ xetex,% pdfpagemode=UseNone,% colorlinks,% urlcolor=blue,% citecolor=blue,% linkcolor=blue,% breaklinks ]{hyperref} \defaultfontfeatures{Mapping=tex-text} \setmainfont{TeX Gyre Pagella} \setmathsfont(Digits){TeX Gyre Pagella} \setmonofont[Scale=MatchLowercase]{Letter Gothic 12 Pitch} </xsl-out:text> </xsl-out:template> </xsl:when> <!-- No need for an otherwise, as weird target formats will have already been trapped by the definition of the text-encoding variable above. --> </xsl:choose> <!-- Next, output the main document body according to target format. This is generally the same across similar target formats. --> <xsl:choose> <xsl:when test="($target-format = 'html') or ($target-format = 'xhtml')"> <!-- *** (X)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">UTF-8</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> --> <!-- Default to PNG images for web dispay. --> <xsl-out:param name="image-format"><xsl:text>png</xsl:text></xsl-out:param> <!-- 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> <xsl-out:element name="link"> <xsl-out:attribute name="rel"> <xsl-out:text>Stylesheet</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="href"> <xsl-out:text>https://blackboard.otago.ac.nz/bbcswebdav/courses/</xsl-out:text> <xsl-out:value-of select="$subject-code" /> <xsl-out:value-of select="$paper-number" /> <xsl-out:text>_</xsl-out:text> <xsl-out:value-of select="$period-code" /> <xsl-out:text>DNS_</xsl-out:text> <xsl-out:value-of select="$paper-year" /> <xsl-out:text>/db_styles.css</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="type"> <xsl-out:text>text/css</xsl-out:text> </xsl-out:attribute> </xsl-out:element> <xsl-out:element name="meta"> <xsl-out:attribute name="http-equiv"> <xsl-out:text>Content-type</xsl-out:text> </xsl-out:attribute> <xsl-out:attribute name="content"> <xsl-out:text> <xsl:text>text/html;charset=</xsl:text> <xsl:value-of select="$text-encoding" /> </xsl-out:text> </xsl-out:attribute> </xsl-out:element> <title> <xsl-out:choose> <xsl-out:when test="@class = 'calendar'"> <xsl-out:value-of select="$subject-code" /> <xsl-out:value-of select="$paper-number" /> <xsl-out:text> Teaching Calendar, </xsl-out:text> <xsl-out:value-of select="$period-string" /> <xsl-out:text>, </xsl-out:text> <xsl-out:value-of select="$paper-year" /> </xsl-out:when> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="preamble" /> </xsl-out:otherwise> </xsl-out:choose> </title> </head> <body> <xsl-out:choose> <xsl-out:when test="@class = 'calendar'" /> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="title" /> <xsl-out:apply-templates select="due-date" mode="title" /> </xsl-out:otherwise> </xsl-out:choose> <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 /> <!-- Since HTML doesn't support footnotes as such, we instead include them as endnotes at the end of the document. --> <xsl-out:if test="count(//footnote) > 0"> <h3>Notes</h3> <xsl-out:apply-templates select="//footnote" mode="list" /> <hr /> </xsl-out:if> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </body> </html> </xsl-out:template> </xsl:when> <xsl:when test="($target-format = 'latex') or ($target-format = 'xelatex')"> <!-- Set to pdf if using PDFLaTeX, otherwise eps. --> <xsl-out:param name="image-format"><xsl:text>pdf</xsl:text></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> <xsl-out:when test="$standalone = 'yes'"> <xsl-out:text> % THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT! \documentclass[12pt,a4paper]{article} \usepackage[margin=1in]{geometry} \usepackage{multirow} \usepackage{graphicx} \usepackage{verbatim} % needed for \verbatiminput \usepackage{relalg} % needed for join operators \usepackage{pifont} \usepackage{siunitx} % number and SI unit formatting \usepackage{listings} % nicely formatted code listings \usepackage[normalem]{ulem} % fancy underlining, strikeout, etc. </xsl-out:text> <xsl-out:call-template name="latex-preamble" /> <xsl-out:apply-templates select="environment/latex-commands" /> <xsl-out:text> \newenvironment{answer}{\par\vspace{0.5em}\itshape}{\normalfont\vspace{1.5em}} % Listings setup. We preload the most obviously like languages to speed things % up. Other languages will still work, just not quite as quickly. \lstloadlanguages{Oracle} \lstset{basicstyle=\ttfamily,basewidth=0.5em,escapeinside={(@}{@)}, showspaces=false,showstringspaces=false} </xsl-out:text> <xsl-out:apply-templates select="title" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:apply-templates select="author" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:apply-templates select="date|due-date" mode="preamble" /> <xsl-out:call-template name="newline-internal" /> <xsl-out:text> \begin{document} \maketitle </xsl-out:text> <xsl-out:apply-templates /> <!-- If you're having problems with the build date appearing in weird or annoying locations (usually because of floating items like tables and figures), set document/@auto-latex-build-date to "no". You can then use the build-date element to insert the build date wherever you like, if necessary. This really only applies to LaTeX documents. The behaviour of HTML documents is much more predictable because they don't have elements with "minds of their own", so the build date is guaranteed to always appear at the very end. --> <xsl-out:if test="not( @auto-latex-build-date ) or ( @auto-latex-build-date != 'no' )"> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </xsl-out:if> <xsl-out:text>\end{document}</xsl-out:text> </xsl-out:when> <!-- Not standalone: --> <xsl-out:otherwise> <xsl-out:apply-templates select="title" mode="chapter" /> <xsl-out:apply-templates select="*[not(self::title)]" /> <xsl-out:if test="not( @auto-latex-build-date ) or ( @auto-latex-build-date != 'no' )"> <xsl-out:call-template name="build-date-internal"> <xsl-out:with-param name="format">long</xsl-out:with-param> <xsl-out:with-param name="style">footer</xsl-out:with-param> </xsl-out:call-template> </xsl-out:if> </xsl-out:otherwise> </xsl-out:choose> </xsl-out:template> </xsl:when> <!-- No need for an otherwise, as weird formats will have already been trapped by the definition of the text-encoding variable above. --> </xsl:choose> <xsl:apply-templates /> </xsl-out:stylesheet> </xsl:template> <!-- Copy across templates according to the target format. If there's no common code for a particular format, an empty template is generated. --> <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="@*" /> <!-- Copy across code that is common to ALL target formats. Any code not specific to a particular target format will therefore always appear FIRST in the resulting template. --> <xsl:copy-of select="common[not(@formats)]/node()" /> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="common[contains(@formats, concat('/', $target-format, '/'))]/node()" /> <xsl:copy-of select="*[name(.) = $target-format]/node()" /> </xsl-out:template> </xsl:template> <!-- Dealing with functions is slightly more complex than templates, as functions aren't allowed to be empty. We therefore have to completely ignore function definitions that have no code for the target format. The second, more specific template will match in preference to the empty one. --> <xsl:template match="function" /> <xsl:template match="function[common[contains( @formats, concat( '/', $target-format, '/' ) )]]|function[common[not( @formats )]]"> <xsl-out:function> <!-- 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="@*" /> <!-- Copy across code that is common to ALL target formats. Any code not specific to a particular target format will therefore always appear FIRST in the resulting template. --> <xsl:copy-of select="common[not( @formats )]/node()" /> <!-- Copy across code that is specific to the current format. --> <xsl:copy-of select="common[contains( @formats, concat( '/', $target-format, '/' ) )]/node()" /> <xsl:copy-of select="*[name( . )=$target-format]/node()" /> </xsl-out:function> </xsl:template> <!-- Include templates from a stylesheet sub-module. This enables us to modularise the master stylesheet. --> <xsl:template match="include"> <xsl:apply-templates select="document( @href )/stylesheet/*" /> </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