diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-11-08 13:39:13 -0800 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-11-08 13:39:13 -0800 |
commit | b2d73bee5e123c5e69352a447d4bc318132612d9 (patch) | |
tree | e8815e7ef185ccaba26bcd616eace378572b922e /roundtrip/blocks2dbk.xsl | |
download | docbook-xsl-stylesheets-b2d73bee5e123c5e69352a447d4bc318132612d9.tar.gz docbook-xsl-stylesheets-b2d73bee5e123c5e69352a447d4bc318132612d9.tar.bz2 docbook-xsl-stylesheets-b2d73bee5e123c5e69352a447d4bc318132612d9.zip |
Imported Upstream version 1.77.1upstream/1.77.1
Diffstat (limited to 'roundtrip/blocks2dbk.xsl')
-rw-r--r-- | roundtrip/blocks2dbk.xsl | 1732 |
1 files changed, 1732 insertions, 0 deletions
diff --git a/roundtrip/blocks2dbk.xsl b/roundtrip/blocks2dbk.xsl new file mode 100644 index 0000000..e14999f --- /dev/null +++ b/roundtrip/blocks2dbk.xsl @@ -0,0 +1,1732 @@ +<!DOCTYPE xsl:stylesheet [ +<!-- External DTD defines entities: + components :- QNames of component-level elements + blocks :- QNames of block-level elements + metadata-content :- XPath expression matching metadata styles + author-content :- XPath expression matching author styles + admonition :- XPath expression matching admonition styles + admonition-title :- XPath expression matching admonition title styles +--> +<!ENTITY % ext SYSTEM "blocks2dbk.dtd"> +%ext; +]> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:dbk='http://docbook.org/ns/docbook' + xmlns:rnd='http://docbook.org/ns/docbook/roundtrip' + xmlns:xlink='http://www.w3.org/1999/xlink'> + + <!-- $Id: blocks2dbk.xsl 8137 2008-10-09 03:37:56Z balls $ --> + <!-- Stylesheet to convert word processing docs to DocBook --> + <!-- This stylesheet processes the output of sections2blocks.xsl --> + + <xsl:output indent="yes" method="xml" + cdata-section-elements='dbk:programlisting dbk:literallayout'/> + + <!-- ================================================== --> + <!-- Parameters --> + <!-- ================================================== --> + + <xsl:param name='docbook5'>0</xsl:param> + <xsl:param name="nest.sections">1</xsl:param> + + <xsl:strip-space elements='*'/> + <xsl:preserve-space elements='dbk:para dbk:emphasis'/> + + <xsl:template match="&components; | + &blocks;"> + <xsl:choose> + <xsl:when test='self::dbk:article and + count(dbk:book) = 1 and + count(dbk:info|dbk:book) <= 2'> + <xsl:apply-templates select='dbk:book'/> + </xsl:when> + <xsl:when test='self::dbk:article and + *[1][self::dbk:para] and + *[1]/@rnd:style != "article-title" and + contains(*[1]/@rnd:style, "-title")'> + <xsl:variable name='element-name' + select='substring-before(*[1]/@rnd:style, "-title")'/> + <xsl:element name='{$element-name}' + namespace='http://docbook.org/ns/docbook'> + <dbk:info> + <xsl:apply-templates select='*[1]' + mode='rnd:metadata'/> + </dbk:info> + <xsl:apply-templates/> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <xsl:copy> + <xsl:call-template name='rnd:attributes'/> + + <xsl:variable name='metadata'> + <xsl:apply-templates select='*[1]' + mode='rnd:metadata'/> + </xsl:variable> + <xsl:if test='$metadata'> + <dbk:info> + <xsl:copy-of select='$metadata'/> + </dbk:info> + </xsl:if> + + <xsl:apply-templates/> + </xsl:copy> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:book-component'> + <xsl:variable name='element-name' + select='substring-before(*[1]/@rnd:style, "-title")'/> + + <xsl:element name='{$element-name}' + namespace='http://docbook.org/ns/docbook'> + <dbk:info> + <xsl:apply-templates select='*[1]' + mode='rnd:metadata'/> + </dbk:info> + <xsl:apply-templates/> + </xsl:element> + </xsl:template> + + <xsl:template match="dbk:para" name='rnd:para'> + <!-- Some elements are normally suppressed, + since they are processed in a different context. + If this parameter is false then the element will be processed normally. + --> + <xsl:param name='suppress' select='true()'/> + + <!-- This paragraph may be in a sidebar --> + <xsl:variable name='sidebar' + select='preceding-sibling::*[self::dbk:para and @rnd:style = "sidebar-title"][1]'/> + + <!-- This paragraph may be in the textobject of a table or figure --> + <xsl:variable name='table' + select='preceding-sibling::dbk:informaltable[1]'/> + <xsl:variable name='figure' + select='preceding-sibling::dbk:para[@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")][1]'/> + <xsl:variable name='caption' + select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]'/> + + <xsl:choose> + <!-- continue style paragraphs are handled in context --> + <xsl:when test='$suppress and + @rnd:style = "para-continue"'/> + + <!-- Certain elements gather the following paragraph --> + <xsl:when test='$suppress and + preceding-sibling::*[1][self::dbk:para and + @rnd:style = "example-title"]'/> + + <xsl:when test='$suppress and + $sidebar and + not(preceding-sibling::dbk:para[(not(@rnd:style) or @rnd:style = "") and + preceding-sibling::*[preceding-sibling::*[generate-id() = generate-id($sidebar)]]])'/> + + <!-- Separate processing is performed for table/figure titles and captions --> + <xsl:when test='$suppress and + @rnd:style = "table-title" and + following-sibling::*[1][self::dbk:informaltable|self::dbk:para[@rnd:style = "informalfigure-imagedata"]|self::dbk:para[dbk:inlinemediaobject and count(*) = 1 and normalize-space() = ""]]'/> + <xsl:when test='$suppress and + @rnd:style = "figure-title" and + following-sibling::*[1][self::dbk:para][@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")]'/> + <xsl:when test='$suppress and + (@rnd:style = "caption" or @rnd:style = "Caption") and + (preceding-sibling::*[self::dbk:informaltable] or + preceding-sibling::*[self::dbk:para][@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")])'/> + + <xsl:when test='$suppress and + $table and + $caption and + generate-id($caption/preceding-sibling::dbk:informaltable[1]) = generate-id($table)'/> + <xsl:when test='$suppress and + $figure and + $caption and + generate-id($caption/preceding-sibling::dbk:para[@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")][1]) = generate-id($figure)'/> + + <xsl:when test='@rnd:style = "imagedata-metadata" or + @rnd:style = "table-metadata"'/> + + <!-- Ignore empty paragraphs --> + <xsl:when test='(not(@rnd:style) or + @rnd:style = "") and + normalize-space(.) = "" and + not(*)'/> + + <!-- Image inline or block? --> + <xsl:when test='(not(@rnd:style) or + @rnd:style = "") and + normalize-space(.) = "" and + count(*) = 1 and + dbk:inlinemediaobject'> + <xsl:apply-templates/> + </xsl:when> + <xsl:when test='not(@rnd:style) or + @rnd:style = "" or + @rnd:style = "para-continue"'> + <dbk:para> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:para> + </xsl:when> + + <xsl:when test='@rnd:style = "xinclude"' + xmlns:xi='http://www.w3.org/2001/XInclude'> + <xi:include> + <xsl:attribute name='href'> + <xsl:apply-templates mode='rnd:xinclude'/> + </xsl:attribute> + </xi:include> + </xsl:when> + + <xsl:when test='$suppress and + preceding-sibling::*[1]/self::dbk:para[&admonition-title;]'/> + <xsl:when test='&admonition-title;'> + <xsl:element name='{substring-before(@rnd:style, "-title")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:call-template name='rnd:attributes'/> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + <xsl:apply-templates select='following-sibling::*[1]'> + <xsl:with-param name='suppress' select='false()'/> + </xsl:apply-templates> + <xsl:apply-templates select='following-sibling::*[2]' + mode='rnd:continue'/> + </xsl:element> + </xsl:when> + + <xsl:when test='starts-with(@rnd:style, "itemizedlist") or + starts-with(@rnd:style, "orderedlist")'> + + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[not(@rnd:style) or + (not(starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist")) and @rnd:style != "para-continue")][1]'/> + + <xsl:choose> + <xsl:when test='translate(substring-after(@rnd:style, "list"), "0123456789", "") != "" or + substring-after(@rnd:style, "list") = ""'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code' select='"list-bad-level"'/> + <xsl:with-param name='message'>style "<xsl:value-of select='@rnd:style'/>" is not a valid list style</xsl:with-param> + </xsl:call-template> + </xsl:when> + + <!-- TODO: the previous para-continue may not be associated with a list --> + + <!-- NB. Look back at the previous paragraph. There may be intervening tables or images. --> + <xsl:when test='preceding-sibling::dbk:para[1][starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist") or @rnd:style = "para-continue"]'/> + <xsl:when test='substring-after(@rnd:style, "list") != 1'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>list-wrong-level</xsl:with-param> + <xsl:with-param name='message'>list started at the wrong level</xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test='$stop.node'> + <xsl:element name='{substring-before(@rnd:style, "1")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = current()/@rnd:style][following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:listitem'/> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <xsl:element name='{substring-before(@rnd:style, "1")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = current()/@rnd:style]' + mode='rnd:listitem'/> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "programlisting" and + preceding-sibling::*[1][self::dbk:para and @rnd:style = "programlisting"]'/> + <xsl:when test='@rnd:style = "literallayout" and + preceding-sibling::*[1][self::dbk:para and @rnd:style = "literallayout"]'/> + <xsl:when test='@rnd:style = "programlisting" or + @rnd:style = "literallayout"'> + + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[@rnd:style != current()/@rnd:style][1]'/> + + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates/> + + <xsl:choose> + <xsl:when test='$stop.node'> + <xsl:apply-templates select='following-sibling::dbk:para[following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:programlisting'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select='following-sibling::dbk:para' + mode='rnd:programlisting'/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:when> + + <xsl:when test='@rnd:style = "example-title"'> + <xsl:element name='{substring-before(@rnd:style, "-title")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:call-template name='rnd:attributes'/> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + + <xsl:apply-templates select='following-sibling::*[1]'> + <xsl:with-param name='suppress' select='false()'/> + </xsl:apply-templates> + </xsl:element> + </xsl:when> + + <xsl:when test='@rnd:style = "sidebar-title"'> + <!-- TODO: next sidebar should stop this sidebar --> + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[(not(@rnd:style) or @rnd:style = "") and + normalize-space(.) = ""][1]'/> + + <dbk:sidebar> + <xsl:call-template name='rnd:attributes'/> + <dbk:info> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + </dbk:info> + + <xsl:choose> + <xsl:when test='$stop.node'> + <xsl:apply-templates select='following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:sidebar'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select='following-sibling::*' + mode='rnd:sidebar'/> + </xsl:otherwise> + </xsl:choose> + </dbk:sidebar> + </xsl:when> + + <xsl:when test='&admonition;'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:call-template name='rnd:attributes'/> + <dbk:para> + <xsl:apply-templates/> + </dbk:para> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:continue'/> + </xsl:element> + </xsl:when> + + <!-- TODO: make sure this is in a bibliography. + If not, create a bibliolist. + --> + <xsl:when test='@rnd:style = "bibliomixed"'> + <dbk:bibliomixed> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:bibliomixed> + </xsl:when> + <xsl:when test='@rnd:style = "biblioentry-title"'> + <dbk:biblioentry> + <xsl:call-template name='rnd:attributes'/> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + <xsl:if test='following-sibling::*[1][&metadata-content;]'> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:if> + </dbk:biblioentry> + </xsl:when> + + <xsl:when test='@rnd:style = "blockquote-attribution" and + preceding-sibling::*[1][self::dbk:para][@rnd:style = "blockquote-title" or @rnd:style = "blockquote"]'/> + <xsl:when test='@rnd:style = "blockquote-attribution"'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>improper-blockquote-attribution</xsl:with-param> + <xsl:with-param name='message'>blockquote attribution must follow a blockquote title</xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test='@rnd:style = "blockquote" or + @rnd:style = "blockquote-title"'> + <xsl:choose> + <xsl:when test='@rnd:style = "blockquote" and + preceding-sibling::*[1][self::dbk:para][starts-with(@rnd:style, "blockquote")]'/> + <xsl:otherwise> + + <xsl:variable name='stop.node' + select='following-sibling::*[not(@rnd:style = "blockquote" or + @rnd:style = "blockquote-attribution")][1]'/> + + <dbk:blockquote> + <xsl:call-template name='rnd:attributes'/> + <xsl:if test='@rnd:style = "blockquote-title"'> + <dbk:info> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + </dbk:info> + </xsl:if> + <xsl:choose> + <xsl:when test='$stop.node'> + <xsl:apply-templates select='following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]][@rnd:style = "blockquote-attribution"]' mode='rnd:blockquote-attribution'/> + <xsl:apply-templates select='self::*[@rnd:style = "blockquote"] | + following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:blockquote'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select='following-sibling::*[@rnd:style = "blockquote-attribution"]' mode='rnd:blockquote-attribution'/> + <xsl:apply-templates select='self::*[@rnd:style = "blockquote"] | + following-sibling::*' + mode='rnd:blockquote'/> + </xsl:otherwise> + </xsl:choose> + </dbk:blockquote> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "bridgehead"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </xsl:element> + </xsl:when> + + <xsl:when test='@rnd:style = "formalpara-title"'> + <dbk:formalpara> + <dbk:title> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:title> + <xsl:choose> + <xsl:when test='following-sibling::*[1][self::dbk:para][@rnd:style = "formalpara"]'> + <dbk:para> + <xsl:call-template name='rnd:attributes'> + <xsl:with-param name='node' + select='following-sibling::*[1]'/> + </xsl:call-template> + <xsl:apply-templates select='following-sibling::*[1]/node()'/> + </dbk:para> + </xsl:when> + </xsl:choose> + </dbk:formalpara> + </xsl:when> + <xsl:when test='@rnd:style = "formalpara" and + preceding-sibling::*[1][self::dbk:para][@rnd:style = "formalpara-title"]'/> + <xsl:when test='@rnd:style = "formalpara"'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>formalpara-notitle</xsl:with-param> + <xsl:with-param name='message'>formalpara used without a title</xsl:with-param> + </xsl:call-template> + </xsl:when> + + <xsl:when test='@rnd:style = "informalfigure-imagedata"'> + <xsl:variable name='caption.next' + select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/> + + <xsl:variable name='metadata' + select='preceding-sibling::*[1][self::dbk:para][@rnd:style = "imagedata-metadata"]'/> + + <xsl:choose> + <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"] or + ($metadata and preceding-sibling::*[2][self::dbk:para][@rnd:style = "figure-title"])'> + <dbk:figure> + <xsl:call-template name='rnd:attributes'/> + <dbk:info> + <dbk:title> + <xsl:choose> + <xsl:when test='$metadata'> + <xsl:apply-templates + select='preceding-sibling::*[2]/node()'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates + select='preceding-sibling::*[1]/node()'/> + </xsl:otherwise> + </xsl:choose> + </dbk:title> + </dbk:info> + <dbk:mediaobject> + <dbk:imageobject> + <dbk:imagedata> + <xsl:attribute name='fileref'> + <xsl:choose> + <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'> + <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select='.'/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <xsl:call-template name='rnd:imagedata-attributes'> + <xsl:with-param name='metadata' select='$metadata'/> + </xsl:call-template> + </dbk:imagedata> + </dbk:imageobject> + </dbk:mediaobject> + <xsl:call-template name='rnd:figure-text-caption'> + <xsl:with-param name='caption' select='$caption.next'/> + </xsl:call-template> + </dbk:figure> + </xsl:when> + <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style = "table-title"] or + ($metadata and preceding-sibling::*[2][self::dbk:para][@rnd:style = "table-title"])'> + <dbk:table> + <xsl:call-template name='rnd:attributes'/> + <dbk:info> + <dbk:title> + <xsl:choose> + <xsl:when test='$metadata'> + <xsl:apply-templates + select='preceding-sibling::*[2]/node()'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates + select='preceding-sibling::*[1]/node()'/> + </xsl:otherwise> + </xsl:choose> + </dbk:title> + </dbk:info> + + <dbk:mediaobject> + <dbk:imageobject> + <dbk:imagedata> + <xsl:attribute name='fileref'> + <xsl:choose> + <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'> + <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select='.'/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <xsl:call-template name='rnd:imagedata-attributes'> + <xsl:with-param name='metadata' select='$metadata'/> + </xsl:call-template> + </dbk:imagedata> + </dbk:imageobject> + </dbk:mediaobject> + <xsl:call-template name='rnd:figure-text-caption'> + <xsl:with-param name='caption' select='$caption.next'/> + </xsl:call-template> + </dbk:table> + </xsl:when> + <xsl:otherwise> + <dbk:informalfigure> + <xsl:call-template name='rnd:attributes'/> + <dbk:mediaobject> + <dbk:imageobject> + <dbk:imagedata> + <xsl:attribute name='fileref'> + <xsl:choose> + <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'> + <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select='.'/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <xsl:call-template name='rnd:imagedata-attributes'> + <xsl:with-param name='metadata' select='$metadata'/> + </xsl:call-template> + </dbk:imagedata> + </dbk:imageobject> + </dbk:mediaobject> + <xsl:call-template name='rnd:figure-text-caption'> + <xsl:with-param name='caption' select='$caption.next'/> + </xsl:call-template> + </dbk:informalfigure> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='(@rnd:style = "caption" or @rnd:style = "Caption") and + preceding-sibling::*[(self::dbk:para and contains(@rnd:style, "imagedata")) or self::dbk:informaltable]'/> + <xsl:when test='@rnd:style = "caption" or @rnd:style = "Caption"'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-caption</xsl:with-param> + <xsl:with-param name='message'>caption does not follow table or figure</xsl:with-param> + </xsl:call-template> + </xsl:when> + + <xsl:when test='(contains(@rnd:style, "-title") or + contains(@rnd:style, "-titleabbrev") or + contains(@rnd:style, "-subtitle")) and + not(starts-with(@rnd:style, "blockquote") or starts-with(@rnd:style, "formal"))'> + <!-- TODO: check that no non-metadata elements occur before this paragraph --> + </xsl:when> + + <!-- Metadata elements are handled in rnd:metadata mode --> + <!-- TODO: check that no non-metadata elements occur before this paragraph --> + <xsl:when test='&metadata-content;'/> + + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>unknown-style</xsl:with-param> + <xsl:with-param name='message'>unknown paragraph style "<xsl:value-of select='@rnd:style'/>" encountered</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Determine if the caption belongs to the current figure. + If so, then process the textobject content and the caption. + --> + <xsl:template name='rnd:figure-text-caption'> + <xsl:param name='caption' select='/..'/> + + <xsl:variable name='textobjs' + select='following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]]'/> + + <xsl:choose> + <xsl:when test='not($caption)'/> <!-- nothing to do --> + <xsl:when test='$textobjs[self::dbk:informaltable | + self::dbk:inlinemediaobject | + self::dbk:para[@rnd:style = "informalfigure-imagedata" or + @rnd:style = "mediaobject-imagedata"]]'/> <!-- caption belongs to something else --> + <xsl:otherwise> + <xsl:apply-templates select='$textobjs' mode='rnd:textobject'/> + + <xsl:apply-templates select='$caption' mode='rnd:caption'/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:caption'> + <dbk:caption> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:caption> + </xsl:template> + + <xsl:template name='rnd:imagedata-attributes'> + <xsl:param name='metadata' select='""'/> + + <xsl:choose> + <xsl:when test='not($metadata)'/> + <xsl:when test='contains($metadata, " ")'> + <xsl:call-template name='rnd:imagedata-attributes'> + <xsl:with-param name='metadata' + select='substring-before($metadata, " ")'/> + </xsl:call-template> + <xsl:call-template name='rnd:imagedata-attributes'> + <xsl:with-param name='metadata' + select='substring-after($metadata, " ")'/> + </xsl:call-template> + </xsl:when> + <xsl:when test='not(contains($metadata, "="))'> + <xsl:call-template name='rnd:warning'> + <xsl:with-param name='code' select='"imagedata-missing-value"'/> + <xsl:with-param name='message'> + <xsl:text>imagedata-metadata missing value for attribute "</xsl:text> + <xsl:value-of select='$metadata'/> + <xsl:text>"</xsl:text> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:variable name='name' + select='translate(normalize-space(substring-before($metadata, "=")), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/> + <xsl:variable name='value' + select='translate(normalize-space(substring-after($metadata, "=")), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/> + + <xsl:choose> + <xsl:when test='$name = "scalefit"'> + <xsl:attribute name='scalefit'> + <xsl:choose> + <xsl:when test='$value = "1" or + $value = "yes" or + $value = "true"'>1</xsl:when> + <xsl:otherwise>0</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:when> + <xsl:when test='$name = "align" or + $name = "contentdepth" or + $name = "contentwidth" or + $name = "depth" or + $name = "scale" or + $name = "valign" or + $name = "width"'> + <!-- TODO: check enumerate values--> + <xsl:attribute name='{$name}'> + <xsl:value-of select='$value'/> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code' select='"imagedata-unknown-attribute"'/> + <xsl:with-param name='message'> + <xsl:text>imagedata-metadata unknown attribute "</xsl:text> + <xsl:value-of select='$name'/> + <xsl:text>"</xsl:text> + </xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:emphasis'> + <xsl:choose> + <xsl:when test='not(@rnd:style) and @role = "italic"'> + <xsl:copy> + <xsl:apply-templates mode='rnd:copy'/> + </xsl:copy> + </xsl:when> + <xsl:when test='not(@rnd:style) or @role'> + <xsl:copy> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates mode='rnd:copy'/> + </xsl:copy> + </xsl:when> + + <xsl:when test='@rnd:style = preceding-sibling::node()[1][self::dbk:emphasis]/@rnd:style'/> + + <xsl:when test='@rnd:style = "emphasis"'> + <xsl:copy> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates mode='rnd:copy'/> + <xsl:apply-templates select='following-sibling::node()[1]' + mode='rnd:emphasis'/> + </xsl:copy> + </xsl:when> + <xsl:when test='@rnd:style = "emphasis-bold" or + @rnd:style = "emphasis-strong"'> + <xsl:copy> + <xsl:attribute name='role'>bold</xsl:attribute> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates mode='rnd:copy'/> + <xsl:apply-templates select='following-sibling::node()[1]' + mode='rnd:emphasis'/> + </xsl:copy> + </xsl:when> + <xsl:when test='@rnd:style = "emphasis-underline"'> + <xsl:copy> + <xsl:attribute name='role'>underline</xsl:attribute> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates mode='rnd:copy'/> + <xsl:apply-templates select='following-sibling::node()[1]' + mode='rnd:emphasis'/> + </xsl:copy> + </xsl:when> + + <xsl:when test='@rnd:style = "citetitle" or + @rnd:style = "literal" or + @rnd:style = "sgmltag"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + <xsl:apply-templates select='following-sibling::node()[1]' + mode='rnd:emphasis'/> + </xsl:element> + </xsl:when> + + <xsl:when test='@rnd:style = "Hyperlink" and + parent::dbk:link'> + <!-- This occurs in a hyperlink; parent should be dbk:link --> + <xsl:apply-templates/> + </xsl:when> + <xsl:when test='@rnd:style = "Hyperlink"'> + <!-- dbk:link is missing --> + <dbk:link xlink:href='{.}'> + <xsl:apply-templates/> + </dbk:link> + </xsl:when> + + <!-- In rare circumstances, Word inserts an empty element that appears to be something like a space in the editor --> + <xsl:when test='(@rnd:style = "EndnoteReference" or + @rnd:style = "FootnoteReference") and + . = ""'> + <xsl:text> </xsl:text> + </xsl:when> + + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>unknown-style</xsl:with-param> + <xsl:with-param name='message'>unknown character span style "<xsl:value-of select='@rnd:style'/>" encountered</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Coalesce emphasis elements into a single element --> + <xsl:template match='dbk:emphasis' mode='rnd:emphasis'> + <xsl:choose> + <xsl:when test='@rnd:style = preceding-sibling::node()[self::dbk:emphasis]/@rnd:style'> + <xsl:apply-templates/> + <xsl:apply-templates select='following-sibling::node()[1]' + mode='rnd:emphasis'/> + </xsl:when> + </xsl:choose> + </xsl:template> + <xsl:template match='*|text()' mode='rnd:emphasis'/> + + <xsl:template match='dbk:emphasis' mode='rnd:personname-emphasis'> + <xsl:param name='style'/> + + <xsl:choose> + <xsl:when test='@rnd:style = $style'> + <xsl:apply-templates/> + <xsl:apply-templates select='following-sibling::dbk:emphasis[1]' + mode='rnd:personname-emphasis'> + <xsl:with-param name='style' select='$style'/> + </xsl:apply-templates> + </xsl:when> + </xsl:choose> + </xsl:template> + <xsl:template match='*|text()' mode='rnd:emphasis'/> + + <xsl:template match='dbk:subscript|dbk:superscript'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates/> + </xsl:copy> + </xsl:template> + + <!-- Images --> + + <xsl:template match='dbk:inlinemediaobject'> + <xsl:choose> + <xsl:when test='not(preceding-sibling::*|following-sibling::*) and + normalize-space(..) = ""'> + + <xsl:variable name='next.captioned' + select='ancestor::dbk:para/following-sibling::*[self::dbk:informaltable or self::dbk:para[dbk:inlinemediaobject and count(*) = 1 and normalize-space() = ""]][1]'/> + + <xsl:variable name='caption' + select='ancestor::dbk:para/following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]'/> + + <xsl:variable name='metadata'> + <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:variable> + + <dbk:figure> + <xsl:if test='ancestor::dbk:para/preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"] or + $metadata'> + <dbk:info> + <xsl:if test='ancestor::dbk:para/preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"]'> + <dbk:title> + <xsl:apply-templates select='ancestor::dbk:para/preceding-sibling::*[1]/node()'/> + </dbk:title> + </xsl:if> + <xsl:copy-of select='$metadata'/> + </dbk:info> + </xsl:if> + + <dbk:mediaobject> + <xsl:apply-templates mode='rnd:copy'/> + </dbk:mediaobject> + + <xsl:choose> + <xsl:when test='not($caption)'/> + <xsl:when test='not($next.captioned)'> + <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]][not(&metadata-content;)]' + mode='rnd:figure'/> + <xsl:apply-templates select='$caption' + mode='rnd:caption'/> + </xsl:when> + <!-- Does caption belong to this image or next.captioned? + - Only if it belongs to this image do we process it here. + --> + <xsl:when test='$next.captioned[preceding-sibling::*[generate-id() = generate-id($caption)]]'> + <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]][not(&metadata-content;)]' + mode='rnd:figure'/> + <xsl:apply-templates select='$caption' + mode='rnd:caption'/> + </xsl:when> + <!-- otherwise caption does not belong to this figure --> + </xsl:choose> + </dbk:figure> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:copy'/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]' + mode='rnd:caption'> + <dbk:caption> + <dbk:para> + <xsl:apply-templates/> + </dbk:para> + </dbk:caption> + </xsl:template> + <xsl:template match='*' mode='rnd:caption'/> + + <xsl:template match='*' mode='rnd:figure'> + <xsl:call-template name='rnd:para'> + <xsl:with-param name='suppress' select='false()'/> + </xsl:call-template> + </xsl:template> + + <!-- Sidebars --> + + <xsl:template match='*' mode='rnd:sidebar'> + <xsl:call-template name='rnd:para'> + <xsl:with-param name='suppress' select='false()'/> + </xsl:call-template> + </xsl:template> + + <!-- Lists --> + + <xsl:template match='dbk:para' mode='rnd:listitem'> + <dbk:listitem> + <dbk:para> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:para> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:continue'/> + + <!-- Handle nested lists --> + <xsl:variable name='list-type' + select='concat(substring-before(@rnd:style, "list"), "list")'/> + <xsl:variable name='list-level' + select='substring-after(@rnd:style, $list-type)'/> + + <!-- Assuming only five levels of list nesting. + - This is probably better done in a previous stage using grouping. + --> + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[@rnd:style != concat("itemizedlist", $list-level + 1) and + @rnd:style != concat("orderedlist", $list-level + 1) and + @rnd:style != concat("itemizedlist", $list-level + 2) and + @rnd:style != concat("orderedlist", $list-level + 2) and + @rnd:style != concat("itemizedlist", $list-level + 3) and + @rnd:style != concat("orderedlist", $list-level + 3) and + @rnd:style != "para-continue"][1]'/> + + <xsl:variable name='nested' + select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)][1]'/> + + <xsl:choose> + <!-- Is there a nested list at all? --> + <xsl:when test='following-sibling::*[self::dbk:para and @rnd:style != "para-continue"][1][@rnd:style != concat("itemizedlist", $list-level + 1) and @rnd:style != concat("orderedlist", $list-level + 1)]'/> + + <xsl:when test='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)] and + $stop.node'> + <xsl:element name='{concat(substring-before($nested/@rnd:style, "list"), "list")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)][following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:listitem'/> + </xsl:element> + </xsl:when> + <xsl:when test='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)]'> + + <xsl:element name='{concat(substring-before($nested/@rnd:style, "list"), "list")}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)]' + mode='rnd:listitem'/> + </xsl:element> + </xsl:when> + </xsl:choose> + </dbk:listitem> + </xsl:template> + + <!-- Blockquotes --> + + <xsl:template match='dbk:para' mode='rnd:blockquote'> + <xsl:choose> + <xsl:when test='@rnd:style ="blockquote-attribution"'/> + <xsl:when test='@rnd:style ="blockquote-title"'/> + <xsl:otherwise> + <dbk:para> + <xsl:apply-templates/> + </dbk:para> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template match='dbk:para' mode='rnd:blockquote-attribution'> + <xsl:if test='@rnd:style ="blockquote-attribution"'> + <dbk:attribution> + <xsl:apply-templates/> + </dbk:attribution> + </xsl:if> + </xsl:template> + + <!-- Metadata --> + + <xsl:template match='dbk:para' mode='rnd:metadata'> + <xsl:choose> + <xsl:when test='@rnd:style = "biblioentry-title" and + parent::dbk:bibliography|parent::dbk:bibliodiv'/> + <xsl:when test='@rnd:style = "biblioentry-title"'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-metadata</xsl:with-param> + <xsl:with-param name='message'>style "<xsl:value-of select='@rnd:style'/>" must not be metadata for parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param> + </xsl:call-template> + </xsl:when> + + <xsl:when test='@rnd:style = "abstract-title" or + @rnd:style = "abstract"'> + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[@rnd:style != "abstract"][1]'/> + <xsl:choose> + <xsl:when test='$stop.node'> + <dbk:abstract> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "abstract"][following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:abstract'/> + </dbk:abstract> + <xsl:apply-templates select='$stop.node' + mode='rnd:metadata'/> + </xsl:when> + <xsl:otherwise> + <dbk:abstract> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "abstract"]' mode='rnd:abstract'/> + </dbk:abstract> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "legalnotice"'> + <xsl:variable name='stop.node' + select='following-sibling::dbk:para[@rnd:style != "legalnotice"][1]'/> + + <xsl:choose> + <xsl:when test='$stop.node'> + <dbk:legalnotice> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "legalnotice"][following-sibling::*[generate-id() = generate-id($stop.node)]]' + mode='rnd:legalnotice'/> + </dbk:legalnotice> + <xsl:apply-templates select='$stop.node' + mode='rnd:metadata'/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "legalnotice"]' + mode='rnd:legalnotice'/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "keyword"'> + <xsl:variable name='stop.node' + select='following-sibling::*[not(self::dbk:para) or + (self::dbk:para and @rnd:style != "keyword")][1]'/> + + <xsl:choose> + <xsl:when test='$stop.node'> + <dbk:keywordset> + <xsl:call-template name='rnd:keyword'> + <xsl:with-param name='nodes' + select='.|following-sibling::dbk:para[@rnd:style = "keyword"][following-sibling::*[generate-id() = generate-id($stop.node)]]'/> + </xsl:call-template> + </dbk:keywordset> + <xsl:apply-templates select='$stop.node' + mode='rnd:metadata'/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:keyword'> + <xsl:with-param name='nodes' + select='.|following-sibling::dbk:para[@rnd:style = "keyword"]'/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "author"'> + <dbk:author> + <xsl:choose> + <xsl:when test='dbk:emphasis[@rnd:style = "orgname"]'> + <dbk:orgname> + <xsl:apply-templates + select='dbk:emphasis[@rnd:style = "orgname"]' + mode='rnd:orgname'/> + </dbk:orgname> + <xsl:if test='*[not(@rnd:style = "orgname")]'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-author-orgname-combo</xsl:with-param> + <xsl:with-param name='message'>character span "<xsl:value-of select='dbk:emphasis[@rnd:style != "orgname"][1]/@rnd:style'/>" not allowed in an author paragraph combined with orgname</xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:when> + <xsl:otherwise> + <dbk:personname> + <!-- TODO: check style of author; mixed content or structured --> + <xsl:apply-templates mode='rnd:personname'/> + </dbk:personname> + </xsl:otherwise> + </xsl:choose> + <xsl:apply-templates mode='rnd:author-personblurb'/> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:author'/> + </dbk:author> + <xsl:call-template name='rnd:resume-metadata'> + <xsl:with-param name='node' select='following-sibling::*[1]'/> + </xsl:call-template> + </xsl:when> + <xsl:when test='@rnd:style = "personblurb" or + @rnd:style = "address" or + @rnd:style = "affiliation" or + @rnd:style = "contrib" or + @rnd:style = "email"'/> + + <xsl:when test='@rnd:style = "releaseinfo" or + @rnd:style = "date" or + @rnd:style = "pubdate" or + @rnd:style = "pagenums" or + @rnd:style = "issuenum" or + @rnd:style = "volumenum" or + @rnd:style = "edition" or + @rnd:style = "editor" or + @rnd:style = "othercredit" or + @rnd:style = "biblioid" or + @rnd:style = "bibliosource" or + @rnd:style = "bibliomisc" or + @rnd:style = "revhistory" or + @rnd:style = "revision"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates mode='rnd:metadata'/> + </xsl:element> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='contains(@rnd:style, "-titleabbrev")'> + <xsl:variable name='parent' + select='substring-before(@rnd:style, "-titleabbrev")'/> + + <xsl:choose> + <xsl:when test='$parent = local-name(..)'> + <dbk:titleabbrev> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:titleabbrev> + </xsl:when> + <xsl:when test='(parent::dbk:article or parent::dbk:book-component) and + preceding-sibling::dbk:para[@rnd:style = concat($parent, "-title")]'> + <dbk:titleabbrev> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:titleabbrev> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-titleabbrev</xsl:with-param> + <xsl:with-param name='message'>titleabbrev style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='contains(@rnd:style, "-title")'> + <xsl:variable name='parent' + select='substring-before(@rnd:style, "-title")'/> + + <xsl:choose> + <xsl:when test='$parent = "table" or + $parent = "figure"'> + <dbk:title> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:title> + </xsl:when> + <xsl:when test='$parent = local-name(..)'> + <dbk:title> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:title> + </xsl:when> + <xsl:when test='parent::dbk:book-component'> + <dbk:title> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:title> + </xsl:when> + <xsl:when test='parent::dbk:article and + not(../../..)'> + <dbk:title> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:title> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-title</xsl:with-param> + <xsl:with-param name='message'>title style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + + <!-- Exception to normal subtitle handling is biblioentry-subtitle --> + <xsl:when test='@rnd:style = "biblioentry-subtitle"'> + <!-- TODO: check that this is in a biblioentry --> + <dbk:subtitle> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:subtitle> + + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='contains(@rnd:style, "-subtitle")'> + <xsl:variable name='parent' + select='substring-before(@rnd:style, "-subtitle")'/> + + <xsl:choose> + <xsl:when test='$parent = local-name(..)'> + <dbk:subtitle> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:subtitle> + </xsl:when> + <xsl:when test='(parent::dbk:article or parent::dbk:book-component) and + preceding-sibling::dbk:para[@rnd:style = concat($parent, "-title")]'> + <dbk:subtitle> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:subtitle> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-subtitle</xsl:with-param> + <xsl:with-param name='message'>subtitle style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + + <xsl:when test='@rnd:style = "publisher-address" and + preceding-sibling::*[1][not(self::dbk:para) or not(@rnd:style = "publisher")]'> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-publisher-address</xsl:with-param> + <xsl:with-param name='message'>publisher-address must follow publisher</xsl:with-param> + </xsl:call-template> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='@rnd:style = "publisher-address"'> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='@rnd:style = "publisher"'> + <dbk:publisher> + <dbk:publishername> + <xsl:apply-templates/> + </dbk:publishername> + <xsl:if test='following-sibling::*[1][@rnd:style = "publisher-address"]'> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:publisher'/> + </xsl:if> + </dbk:publisher> + + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:metadata'/> + </xsl:when> + </xsl:choose> + </xsl:template> + + <xsl:template name='rnd:keyword'> + <xsl:param name='nodes' select='/..'/> + + <xsl:choose> + <xsl:when test='not($nodes)'/> + <xsl:otherwise> + <xsl:call-template name='rnd:keyword-phrases'> + <xsl:with-param name='text' select='$nodes[1]'/> + </xsl:call-template> + <xsl:call-template name='rnd:keyword'> + <xsl:with-param name='nodes' select='$nodes[position() != 1]'/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template name='rnd:keyword-phrases'> + <xsl:param name='text'/> + + <xsl:choose> + <xsl:when test='not($text)'/> + <xsl:when test='contains($text, ",")'> + <dbk:keyword> + <xsl:value-of select='normalize-space(substring-before($text, ","))'/> + </dbk:keyword> + <xsl:call-template name='rnd:keyword-phrases'> + <xsl:with-param name='text' select='substring-after($text, ",")'/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <dbk:keyword> + <xsl:value-of select='normalize-space($text)'/> + </dbk:keyword> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:emphasis' mode='rnd:metadata'> + <xsl:choose> + <xsl:when test='not(@rnd:style)'> + <xsl:copy> + <xsl:apply-templates mode='rnd:metadata'/> + </xsl:copy> + </xsl:when> + <xsl:when test='@rnd:style = "Hyperlink" and + parent::dbk:link'> + <xsl:apply-templates mode='rnd:metadata'/> + </xsl:when> + <xsl:when test='@rnd:style = "Hyperlink"'> + <dbk:link xlink:href='{.}'> + <xsl:apply-templates mode='rnd:metadata'/> + </dbk:link> + </xsl:when> + <xsl:otherwise> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates mode='rnd:metadata'/> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template match='dbk:link' mode='rnd:metadata'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates mode='rnd:metadata'/> + </xsl:copy> + </xsl:template> + <xsl:template match='dbk:inlinemediaobject' mode='rnd:metadata'> + <xsl:call-template name='rnd:copy'/> + </xsl:template> + <xsl:template match='*' mode='rnd:metadata'/> + + <xsl:template name='rnd:resume-metadata'> + <xsl:param name='node' select='/..'/> + + <xsl:choose> + <xsl:when test='$node[self::dbk:para][&author-content;]'> + <xsl:call-template name='rnd:resume-metadata'> + <xsl:with-param name='node' select='$node/following-sibling::*[1]'/> + </xsl:call-template> + </xsl:when> + <xsl:when test='$node[self::dbk:para][&metadata-content;]'> + <xsl:apply-templates select='$node' mode='rnd:metadata'/> + </xsl:when> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:abstract'> + <xsl:choose> + <xsl:when test='@rnd:style = "abstract-title"'> + <dbk:title> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:title> + </xsl:when> + <xsl:otherwise> + <dbk:para> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:para> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:legalnotice'> + <dbk:para> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:para> + </xsl:template> + + <xsl:template match='dbk:footnote' mode='rnd:personname'/> + <xsl:template match='dbk:emphasis' mode='rnd:personname'> + <!-- Need to check preceding emphasis for same style, + but blocks pretty-prints and all text nodes + are preserved in paragraph content. + --> + <xsl:variable name='previous' + select='preceding-sibling::node()[not(self::text()) or (self::text() and normalize-space() != "")]'/> + <!-- + <xsl:comment> this style is <xsl:value-of select='@rnd:style'/>, previous style is <xsl:value-of select='$previous[last()]/@rnd:style'/> # previous <xsl:value-of select='count($previous)'/></xsl:comment> +--> + <xsl:choose> + <!-- inlines are coalesced --> + <xsl:when test='@rnd:style = $previous[last()][self::dbk:emphasis]/@rnd:style'/> + <xsl:when test='@rnd:style = "honorific" or + @rnd:style = "firstname" or + @rnd:style = "lineage" or + @rnd:style = "othername" or + @rnd:style = "surname"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates/> + <xsl:apply-templates select='following-sibling::dbk:emphasis[1]' + mode='rnd:personname-emphasis'> + <xsl:with-param name='style' select='@rnd:style'/> + </xsl:apply-templates> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>bad-author-inline</xsl:with-param> + <xsl:with-param name='message'>character span "<xsl:value-of select='@rnd:style'/>" not allowed in an author paragraph</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='text()' mode='rnd:author-personblurb'/> + <xsl:template match='dbk:emphasis' mode='rnd:author-personblurb'/> + <xsl:template match='dbk:footnote' mode='rnd:author-personblurb'> + <dbk:personblurb> + <dbk:para> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates/> + </xsl:copy> + </dbk:para> + </dbk:personblurb> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:author'> + <xsl:choose> + <xsl:when test='@rnd:style = "personblurb" and + preceding-sibling::*[1][self::dbk:para and @rnd:style != "personblurb"]'> + <dbk:personblurb> + <xsl:apply-templates select='.' + mode='rnd:personblurb'/> + </dbk:personblurb> + </xsl:when> + <xsl:when test='@rnd:style = "personblurb"'> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:author'/> + </xsl:when> + + <!-- Web and mail addresses may appear in a simplified form --> + <xsl:when test='@rnd:style = "address"'> + <xsl:choose> + <xsl:when test='dbk:link and + count(dbk:link) = count(*)'> + <!-- simplified form --> + <dbk:otheraddr> + <xsl:apply-templates select='dbk:link' + mode='rnd:otheraddr'/> + </dbk:otheraddr> + </xsl:when> + <xsl:otherwise> + <dbk:address> + <xsl:apply-templates mode='rnd:author'/> + </dbk:address> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:author'/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test='@rnd:style = "affiliation"'> + <dbk:affiliation> + <xsl:choose> + <xsl:when test='not(*)'> + <dbk:jobtitle> + <xsl:apply-templates mode='rnd:author'/> + </dbk:jobtitle> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates mode='rnd:author'/> + </xsl:otherwise> + </xsl:choose> + </dbk:affiliation> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:author'/> + </xsl:when> + <xsl:when test='@rnd:style = "contrib" or + @rnd:style = "email"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates mode='rnd:author'/> + </xsl:element> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:author'/> + </xsl:when> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:link' mode='rnd:otheraddr'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates mode='rnd:otheraddr'/> + </xsl:copy> + </xsl:template> + + <!-- TODO: not all of these inlines are allowed in all elements that are children of author. + Need to further refine validation of inlines. + --> + <xsl:template match='dbk:emphasis' mode='rnd:author'> + <xsl:choose> + <xsl:when test='@rnd:style = "city" or + @rnd:style = "country" or + @rnd:style = "email" or + @rnd:style = "fax" or + @rnd:style = "jobtitle" or + @rnd:style = "orgdiv" or + @rnd:style = "orgname" or + @rnd:style = "otheraddr" or + @rnd:style = "phone" or + @rnd:style = "pob" or + @rnd:style = "postcode" or + @rnd:style = "shortaffil" or + @rnd:style = "state" or + @rnd:style = "street"'> + <xsl:element name='{@rnd:style}' + namespace='http://docbook.org/ns/docbook'> + <xsl:apply-templates/> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='rnd:error'> + <xsl:with-param name='code'>metadata-bad-inline</xsl:with-param> + <xsl:with-param name='message'>character span "<xsl:value-of select='@rnd:style'/>" not allowed in author metadata</xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:personblurb'> + <xsl:if test='@rnd:style = "personblurb"'> + <dbk:para> + <xsl:apply-templates/> + </dbk:para> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:personblurb'/> + </xsl:if> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:publisher'> + <xsl:if test='@rnd:style = "publisher-address"'> + <dbk:address> + <xsl:apply-templates/> + </dbk:address> + </xsl:if> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:programlisting'> + <xsl:text>
</xsl:text> + <xsl:apply-templates/> + </xsl:template> + + <!-- Continuing paragraphs --> + + <xsl:template match='*' mode='rnd:continue'/> + <xsl:template match='dbk:para' mode='rnd:continue'> + <xsl:if test='@rnd:style = "para-continue"'> + <dbk:para> + <xsl:call-template name='rnd:attributes'/> + <xsl:apply-templates/> + </dbk:para> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:continue'/> + </xsl:if> + </xsl:template> + <xsl:template match='dbk:informaltable' mode='rnd:continue'> + <xsl:apply-templates select='.'> + <xsl:with-param name='in-list' select='true()'/> + </xsl:apply-templates> + <xsl:apply-templates select='following-sibling::*[1]' + mode='rnd:continue'/> + </xsl:template> + + <!-- Tables --> + + <xsl:template match='dbk:informaltable'> + <xsl:param name='in-list' select='false()'/> + + <xsl:choose> + <xsl:when test='not($in-list) and + preceding-sibling::dbk:para[1][starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist") or @rnd:style = "para-continue"]'/> + <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style ="table-title"]'> + <dbk:table> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + + <dbk:info> + <xsl:apply-templates select='preceding-sibling::dbk:para[1]' + mode='rnd:table-title'/> + </dbk:info> + + <xsl:call-template name='rnd:table-textobject'/> + + <xsl:apply-templates/> + + <xsl:call-template name='rnd:table-caption'/> + </dbk:table> + </xsl:when> + <xsl:otherwise> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + + <xsl:call-template name='rnd:table-textobject'/> + + <xsl:apply-templates/> + + <xsl:call-template name='rnd:table-caption'/> + </xsl:copy> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template match='dbk:tgroup'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:if test='not(@cols)'> + <xsl:attribute name='cols'> + <xsl:call-template name='dbk:max-columns'> + <xsl:with-param name='rows' select='*/dbk:row'/> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates/> + </xsl:copy> + </xsl:template> + <xsl:template name='dbk:max-columns'> + <xsl:param name='rows' select='/..'/> + <xsl:param name='max' select='0'/> + + <!-- This is a tail-recursive algorithm. + Could improve this with other algorithm(s), + eg. divide-and-conquer. + --> + + <xsl:choose> + <xsl:when test='not($rows)'> + <xsl:value-of select='$max'/> + </xsl:when> + <xsl:when test='count($rows[1]/dbk:entry) > $max'> + <xsl:call-template name='dbk:max-columns'> + <xsl:with-param name='rows' select='$rows[position() != 1]'/> + <xsl:with-param name='max' select='count($rows[1]/dbk:entry)'/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name='dbk:max-columns'> + <xsl:with-param name='rows' select='$rows[position() != 1]'/> + <xsl:with-param name='max' select='$max'/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template match='dbk:tbody|dbk:thead|dbk:tfoot|dbk:row|dbk:colspec'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates/> + </xsl:copy> + </xsl:template> + <xsl:template match='dbk:entry'> + <dbk:entry> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates/> + </dbk:entry> + </xsl:template> + + <xsl:template match='dbk:para' mode='rnd:table-title'> + <dbk:title> + <xsl:apply-templates/> + </dbk:title> + </xsl:template> + + <!-- Find the caption associated with this table --> + <xsl:template name='rnd:table-caption'> + <xsl:variable name='candidate' + select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/> + + <xsl:if test='$candidate != "" and + generate-id($candidate/preceding-sibling::dbk:informaltable[1]) = generate-id(.)'> + <dbk:caption> + <dbk:para> + <xsl:apply-templates select='$candidate/node()'/> + </dbk:para> + </dbk:caption> + </xsl:if> + </xsl:template> + + <!-- Find table associated text --> + <xsl:template name='rnd:table-textobject'> + <xsl:variable name='caption' + select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/> + + <xsl:if test='generate-id($caption/preceding-sibling::dbk:informaltable[1]) = generate-id(.)'> + <xsl:variable name='content' + select='following-sibling::*[following-sibling::*[generate-id($caption) = generate-id()]]'/> + <xsl:if test='$content'> + <dbk:textobject> + <xsl:apply-templates select='$content' mode='rnd:textobject'/> + </dbk:textobject> + </xsl:if> + </xsl:if> + </xsl:template> + <xsl:template match='dbk:para' mode='rnd:textobject'> + <xsl:call-template name='rnd:para'> + <xsl:with-param name='suppress' select='false()'/> + </xsl:call-template> + </xsl:template> + + <!-- Footnotes --> + <xsl:template match='dbk:footnote'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates/> + </xsl:copy> + </xsl:template> + + <!-- utilities --> + + <!-- rnd:attributes reconstitutes an element's attributes --> + <xsl:template name='rnd:attributes'> + <xsl:param name='node' select='.'/> + + <xsl:apply-templates select='$node/@*[namespace-uri() != "http://docbook.org/ns/docbook/roundtrip"]' mode='rnd:copy'/> + </xsl:template> + + <xsl:template match='*' name='rnd:copy' mode='rnd:copy'> + <xsl:copy> + <xsl:apply-templates select='@*' mode='rnd:copy'/> + <xsl:apply-templates mode='rnd:copy'/> + </xsl:copy> + </xsl:template> + <xsl:template match='@*' mode='rnd:copy'> + <xsl:copy/> + </xsl:template> + + <!-- These templates are invoked whenever an error condition is detected in the conversion of a document. + --> + <xsl:template name='rnd:error'> + <xsl:param name='node' select='.'/> + <xsl:param name='code'/> + <xsl:param name='message'/> + + <xsl:comment><xsl:value-of select='$message'/></xsl:comment> + <xsl:message>ERROR "<xsl:value-of select='$code'/>": <xsl:value-of select='$message'/></xsl:message> + <rnd:error> + <rnd:code> + <xsl:value-of select='$code'/> + </rnd:code> + <rnd:message> + <xsl:value-of select='$message'/> + </rnd:message> + </rnd:error> + </xsl:template> + <xsl:template name='rnd:warning'> + <xsl:param name='node' select='.'/> + <xsl:param name='code'/> + <xsl:param name='message'/> + + <xsl:comment><xsl:value-of select='$message'/></xsl:comment> + <xsl:message>WARNING "<xsl:value-of select='$code'/>": <xsl:value-of select='$message'/></xsl:message> + <rnd:warning> + <rnd:code> + <xsl:value-of select='$code'/> + </rnd:code> + <rnd:message> + <xsl:value-of select='$message'/> + </rnd:message> + </rnd:warning> + </xsl:template> + +</xsl:stylesheet> |