2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 xmlns:exsl="http://exslt.org/common"
4 xmlns:fo="http://www.w3.org/1999/XSL/Format"
5 xmlns:xlink="http://www.w3.org/1999/xlink"
6 xmlns:d="http://docbook.org/ns/docbook"
7 xmlns:saxon="http://icl.com/saxon"
8 xmlns:NodeInfo="http://org.apache.xalan.lib.NodeInfo"
9 exclude-result-prefixes="d exsl saxon NodeInfo"
12 <xsl:import href="../common/utility.xsl"/>
14 <!-- Template to add the namespace to non-namespaced documents -->
15 <xsl:template match="*" mode="addNS">
16 <xsl:element name="{local-name()}"
17 namespace="http://docbook.org/ns/docbook">
18 <xsl:copy-of select="@*"/>
20 <!-- Add xml:base so relative paths don't get lost -->
21 <xsl:if test="not(../..)">
22 <xsl:call-template name="add-xml-base"/>
25 <xsl:apply-templates select="node()" mode="addNS"/>
29 <xsl:template match="processing-instruction()|comment()" mode="addNS">
33 <xsl:template name="add-xml-base">
34 <!-- * Get a title for current doc so that we let the user -->
35 <!-- * know what document we are processing at this point. -->
36 <xsl:variable name="doc.title">
37 <xsl:call-template name="get.doc.title"/>
39 <xsl:if test="not(@xml:base)">
40 <xsl:variable name="base">
42 <xsl:when test="function-available('saxon:systemId')">
43 <xsl:value-of select="saxon:systemId()"/>
45 <xsl:when test="function-available('NodeInfo:systemId')">
46 <xsl:value-of select="NodeInfo:systemId()"/>
49 <xsl:call-template name="log.message">
50 <xsl:with-param name="level">Warn</xsl:with-param>
51 <xsl:with-param name="source" select="$doc.title"/>
52 <xsl:with-param name="context-desc">
53 <xsl:text>no @xml:base</xsl:text>
55 <xsl:with-param name="message">
56 <xsl:text>cannot add @xml:base to node-set root element</xsl:text>
59 <xsl:call-template name="log.message">
60 <xsl:with-param name="level">Warn</xsl:with-param>
61 <xsl:with-param name="source" select="$doc.title"/>
62 <xsl:with-param name="context-desc">
63 <xsl:text>no @xml:base</xsl:text>
65 <xsl:with-param name="message">
66 <xsl:text>relative paths may not work</xsl:text>
73 <xsl:message>base is <xsl:value-of select="$base"/></xsl:message>
75 <xsl:if test="$base != ''">
76 <xsl:attribute name="xml:base">
77 <xsl:call-template name="systemIdToBaseURI">
78 <xsl:with-param name="systemId">
79 <!-- file: seems to confuse some processors. -->
81 <!-- however, windows paths must use file:///c:/path -->
82 <xsl:when test="starts-with($base, 'file:///') and
83 substring($base, 10, 1) = ':'">
84 <xsl:value-of select="$base"/>
86 <xsl:when test="starts-with($base, 'file:/')
87 and substring($base, 8, 1) = ':'">
88 <xsl:value-of select="concat('file:///',
89 substring-after($base,'file:/'))"/>
91 <xsl:when test="starts-with($base, 'file:///')">
92 <xsl:value-of select="substring-after($base,'file://')"/>
94 <xsl:when test="starts-with($base, 'file://')">
95 <xsl:value-of select="substring-after($base,'file:/')"/>
97 <xsl:when test="starts-with($base, 'file:/')">
98 <xsl:value-of select="substring-after($base,'file:')"/>
101 <xsl:value-of select="$base"/>
111 <xsl:template name="systemIdToBaseURI">
112 <xsl:param name="systemId" select="''"/>
113 <xsl:if test="contains($systemId,'/')">
114 <xsl:value-of select="substring-before($systemId,'/')"/>
115 <xsl:text>/</xsl:text>
116 <xsl:call-template name="systemIdToBaseURI">
117 <xsl:with-param name="systemId"
118 select="substring-after($systemId,'/')"/>