docbook/dep.xsl
5bc53be4
 <?xml version='1.0'?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 				version='1.0' xmlns:xi="http://www.w3.org/2001/XInclude">
 	<xsl:param name="output"/>
d5ceae60
 
 	<!-- Write the output into a plaintext file which will be later included
 		 into the Makefile -->
5bc53be4
 	<xsl:template match="/">
 		<xsl:document href="{$output}" method="text" indent="no" 
 					  omit-xml-declaration="yes">
 			<xsl:value-of select="concat($output, ': ')"/>
 			<xsl:apply-templates mode="subroot"/>
 		</xsl:document>
 	</xsl:template>
 	
d5ceae60
 	<!-- This template extract the name of the directory from a full pathname,
 	     in other words it returns everything but the name of the file -->
 	<xsl:template name="dirname">
 		<xsl:param name="filename"/>
 		<xsl:if test="contains($filename, '/')">
 			<xsl:value-of 
 				select="concat(substring-before($filename, '/'), '/')"/>
 			<xsl:call-template name="dirname">
 				<xsl:with-param name="filename" 
 								select="substring-after($filename, '/')"/>
5bc53be4
 			</xsl:call-template>
 		</xsl:if>
 	</xsl:template>
d5ceae60
 
 	<!-- This template is used to add a directory preefix to a filename. The
 	     prefix is only added if the filename is not absolute (i.e. it does
 	     not start with a / and if the prefix is not an empty string -->
 	<xsl:template name="addprefix">
 		<xsl:param name="prefix"/>
 		<xsl:param name="filename"/>
 		<xsl:if test="(string-length($prefix) > 0) and not(starts-with($filename, '/'))">
 			<xsl:value-of select="$prefix"/>
 		</xsl:if>
 		<xsl:value-of select="$filename"/>
 	</xsl:template>
5bc53be4
 	
d5ceae60
 	<!-- This template processes xi:include directives that include other XML
 	     documents. First the template outputs the name of the file being
 	     included and then the template traverses the included file
 	     recursively, searching fro other dependencies in that file.  The
 	     template passes the parameter prefix to other templates with its
 	     value set to the directory name of the file being included. This
 	     ensures that paths to all dependencies are relative to the main
 	     file. -->
5bc53be4
 	<xsl:template match='xi:include' mode="subroot">
d5ceae60
 		<xsl:param name="prefix"/>
 
 		<!-- Add the prefix to the name of the file being included and store
 		     the result in variable fullpath -->
 		<xsl:variable name="fullpath">
 			<xsl:call-template name="addprefix">
 				<xsl:with-param name="prefix" select="$prefix"/>
 				<xsl:with-param name="filename" select="@href"/>
 			</xsl:call-template>
 		</xsl:variable>
 
 		<!-- First of all, output the name of the file being included, with
 		     proper prefix so that the resulting dependency is relative to the
 		     top-most file being processed, not the file we are are processing
 		     in this step. -->
 		<xsl:value-of select="concat($fullpath, ' ')"/>
 
 		<!-- Traverse the file being included and search for more depencencies
 		     in that file and other files included from there. -->
5bc53be4
 		<xsl:apply-templates select="document(@href)" mode="subroot">
d5ceae60
 			<!-- Extract the directory name from $fullpath and set it as a new
 			     value of the prefix parameter before calling other templates.
 			-->
5bc53be4
 			<xsl:with-param name="prefix">
d5ceae60
 				<xsl:call-template name="dirname">
 					<xsl:with-param name="filename" select="$fullpath"/>
5bc53be4
 				</xsl:call-template>
 			</xsl:with-param>
d5ceae60
 
 			<!-- Process the included file recursively -->
5bc53be4
 		</xsl:apply-templates>
 	</xsl:template>
 	
d5ceae60
 	<!-- This template processes files included with xi:include that are not
 	     XML files, such files will only be output as dependencies and will be
 	     not traversed recursively. -->
5bc53be4
 	<xsl:template match='xi:include[@parse="text"]' mode="subroot">
d5ceae60
 		<xsl:param name="prefix"/>
 		<xsl:call-template name="addprefix">
 			<xsl:with-param name="prefix" select="$prefix"/>
 			<xsl:with-param name="filename" select="@href"/>
 		</xsl:call-template>
 		<xsl:text> </xsl:text>
5bc53be4
 	</xsl:template>
 	
d5ceae60
 	<!-- This template processes mediaobjects (such as images) included in
 	     docbook. -->
5bc53be4
 	<xsl:template match="graphic|imagedata|inlinemediaobject|textdata" 
 				  mode="subroot">
d5ceae60
 		<xsl:param name="prefix"/>
 		<xsl:call-template name="addprefix">
 			<xsl:with-param name="prefix" select="$prefix"/>
 			<xsl:with-param name="filename" select="@fileref"/>
 		</xsl:call-template>
 		<xsl:text> </xsl:text>
5bc53be4
 	</xsl:template>
 	
d5ceae60
 	<!-- Supress all other output -->
5bc53be4
 	<xsl:template match="text()|@*" mode="subroot"/>
 </xsl:stylesheet>