[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: customization for image filerefs respecting xml:base
Hi all, sorry, i first posted this message to docbook@ and not docbook-apps@. i am a little bit confused today... ---------- Weitergeleitete Nachricht ---------- Subject: [docbook] customization for image filerefs respecting xml:base From: Janning Vygen <vygen@gmx.de> To: docbook@lists.oasis-open.org Hi, refering to threads [docbook-apps] Best practise: Directories and location of images [docbook-apps] xinclude and images from other directories many people use Xinclude and a directory structure to order there documents and images. As docbook html/fo stylesheets are not aware of xml:base attributes yet, you need a customization layer like the one attached. It works fine as M. Sanders reports, but i didn't really test it on my own. maybe its of any help for other people. (of course you have to import the main stylesheet or let this file be included by other layers) One feature request for the docbook xsl distribution: At the moment there are few lines in Docbook XSL where <xsl:value-of select="@fileref"/> is used. if replaced by <xsl:apply-templates select="@fileref"/> everything should work the same because default attribute template handles this case. But this way you can override the default template by your own. This would reduce my customization layer a lot and would make it much more easier to write different layers. kind regards, janning
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- customization layer for making filerefs respect xml:base attributes. It does not work for <textdata> or @linespecific. For those i guess you need to replace <xsl:value-of select="@fileref"/> with <xsl:apply-templates select="@fileref"/> in html/graphics.xsl and fo/graphics.xsl --> <!-- ===================================== --> <xsl:template name="mediaobject.filename"> <xsl:param name="object"></xsl:param> <xsl:variable name="data" select="$object/videodata |$object/imagedata |$object/audiodata |$object"/> <xsl:variable name="filename"> <xsl:choose> <xsl:when test="$data[@fileref]"> <!-- NEXT LINE IS THE ONLY CHANGE TO STANDARD XSL STYLESHEETS --> <xsl:apply-templates select="$data/@fileref"/> </xsl:when> <xsl:when test="$data[@entityref]"> <xsl:value-of select="unparsed-entity-uri($data/@entityref)"/> </xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="real.ext"> <xsl:call-template name="filename-extension"> <xsl:with-param name="filename" select="$filename"/> </xsl:call-template> </xsl:variable> <xsl:variable name="ext"> <xsl:choose> <xsl:when test="$real.ext != ''"> <xsl:value-of select="$real.ext"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$graphic.default.extension"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="graphic.ext"> <xsl:call-template name="is.graphic.extension"> <xsl:with-param name="ext" select="$ext"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$real.ext = ''"> <xsl:choose> <xsl:when test="$ext != ''"> <xsl:value-of select="$filename"/> <xsl:text>.</xsl:text> <xsl:value-of select="$ext"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$filename"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="not($graphic.ext)"> <xsl:choose> <xsl:when test="$graphic.default.extension != ''"> <xsl:value-of select="$filename"/> <xsl:text>.</xsl:text> <xsl:value-of select="$graphic.default.extension"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$filename"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$filename"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- ===================================== --> <!-- real work starts here --> <!-- ===================================== --> <xsl:template match="@fileref"> <!-- need a check for relative urls --> <xsl:choose> <xsl:when test="1"> <!-- its a relativ uri --> <xsl:call-template name="relative-uri"> </xsl:call-template> </xsl:when> <xsl:otherwise> <!-- its an absolute uri --> <xsl:value-of select="$filename"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- ===================================== --> <xsl:template name="relative-uri"> <xsl:param name="filename" select="."/> <xsl:param name="chunk" select=".."/> <xsl:variable name="destdir"> <xsl:apply-templates select="$chunk" mode="chunkbasedir"/> </xsl:variable> <xsl:variable name="srcurl"> <xsl:call-template name="strippath"> <xsl:with-param name="filename"> <xsl:call-template name="getdir"> <xsl:with-param name="filename" select="$filename/ancestor-or-self::*[@xml:base != ''][1]/@xml:base"/> </xsl:call-template> <xsl:value-of select="$filename"/> </xsl:with-param> </xsl:call-template> </xsl:variable> <xsl:variable name="srcurl.trimmed"> <xsl:call-template name="trim.common.uri.paths"> <xsl:with-param name="uriA" select="$srcurl"/> <xsl:with-param name="uriB" select="$destdir"/> <xsl:with-param name="return" select="'A'"/> </xsl:call-template> </xsl:variable> <xsl:variable name="destdir.trimmed"> <xsl:call-template name="trim.common.uri.paths"> <xsl:with-param name="uriA" select="$srcurl"/> <xsl:with-param name="uriB" select="$destdir"/> <xsl:with-param name="return" select="'B'"/> </xsl:call-template> </xsl:variable> <xsl:variable name="depth"> <xsl:call-template name="count.uri.path.depth"> <xsl:with-param name="filename" select="$destdir.trimmed"/> </xsl:call-template> </xsl:variable> <xsl:call-template name="copy-string"> <xsl:with-param name="string" select="'../'"/> <xsl:with-param name="count" select="$depth"/> </xsl:call-template> <xsl:value-of select="$srcurl.trimmed"/> </xsl:template> <!-- ===================================== --> <xsl:template name="strippath"> <xsl:param name="filename" select="''"/> <xsl:choose> <xsl:when test="contains($filename, '/../')"> <xsl:call-template name="strippath"> <xsl:with-param name="filename"> <xsl:call-template name="getdir"> <xsl:with-param name="filename" select="substring-before($filename, '/../')"/> </xsl:call-template> <xsl:value-of select="substring-after($filename, '/../')"/> </xsl:with-param> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$filename"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- ===================================== --> <xsl:template name="getdir"> <xsl:param name="filename" select="''"/> <xsl:if test="contains($filename, '/')"> <xsl:value-of select="substring-before($filename, '/')"/> <xsl:text>/</xsl:text> <xsl:call-template name="getdir"> <xsl:with-param name="filename" select="substring-after($filename, '/')"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]