This is the mail archive of the
docbook@lists.oasis-open.org
mailing list for the DocBook project.
[docbook] customization for image filerefs respecting xml:base
- From: Janning Vygen <vygen at gmx dot de>
- To: docbook at lists dot oasis-open dot org
- Cc: "Sanders, M." <MSA at ballastham dot com>,"Kenneth Johansson" <ke-joh at sectra dot se>
- Date: Thu, 20 Nov 2003 14:58:45 +0100
- Subject: [docbook] customization for image filerefs respecting xml:base
- Organization: Planwerk 6 /websolutions
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 (i hope, attachments are allowed)
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 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>
To unsubscribe from this list, send a post to docbook-unsubscribe@lists.oasis-open.org, or visit http://www.oasis-open.org/mlmanage/.