Whamcloud - gitweb
LUDOC-120 presentation: build bits for webhelp.
[doc/manual.git] / webhelp / common / addns.xsl
1 <?xml version='1.0'?>
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"
10                 version='1.0'>
11
12 <xsl:import href="../common/utility.xsl"/>
13
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="@*"/>
19
20     <!-- Add xml:base so relative paths don't get lost -->
21     <xsl:if test="not(../..)">
22       <xsl:call-template name="add-xml-base"/>
23     </xsl:if>
24
25     <xsl:apply-templates select="node()" mode="addNS"/>
26   </xsl:element>
27 </xsl:template>
28
29 <xsl:template match="processing-instruction()|comment()" mode="addNS">
30   <xsl:copy/>
31 </xsl:template>
32
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"/>
38   </xsl:variable>
39   <xsl:if test="not(@xml:base)">
40     <xsl:variable name="base">
41       <xsl:choose>
42         <xsl:when test="function-available('saxon:systemId')">
43           <xsl:value-of select="saxon:systemId()"/>
44         </xsl:when>
45         <xsl:when test="function-available('NodeInfo:systemId')">
46           <xsl:value-of select="NodeInfo:systemId()"/>
47         </xsl:when>
48         <xsl:otherwise>
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>
54             </xsl:with-param>
55             <xsl:with-param name="message">
56               <xsl:text>cannot add @xml:base to node-set root element</xsl:text>
57             </xsl:with-param>
58           </xsl:call-template>
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>
64             </xsl:with-param>
65             <xsl:with-param name="message">
66               <xsl:text>relative paths may not work</xsl:text>
67             </xsl:with-param>
68           </xsl:call-template>
69         </xsl:otherwise>
70       </xsl:choose>
71     </xsl:variable>
72     <!-- debug
73     <xsl:message>base is <xsl:value-of select="$base"/></xsl:message>
74     -->
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. -->
80             <xsl:choose>
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"/>
85               </xsl:when>
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:/'))"/>
90               </xsl:when>
91               <xsl:when test="starts-with($base, 'file:///')">
92                 <xsl:value-of select="substring-after($base,'file://')"/>
93               </xsl:when>
94               <xsl:when test="starts-with($base, 'file://')">
95                 <xsl:value-of select="substring-after($base,'file:/')"/>
96               </xsl:when>
97               <xsl:when test="starts-with($base, 'file:/')">
98                 <xsl:value-of select="substring-after($base,'file:')"/>
99               </xsl:when>
100               <xsl:otherwise>
101                 <xsl:value-of select="$base"/>
102               </xsl:otherwise>
103             </xsl:choose>
104           </xsl:with-param>
105         </xsl:call-template>
106       </xsl:attribute>
107     </xsl:if>
108   </xsl:if>
109 </xsl:template>
110
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,'/')"/>
119     </xsl:call-template>
120   </xsl:if>
121 </xsl:template>
122
123 </xsl:stylesheet>
124