5.10 Document publishing
5.10.1 Document styling
5.10.1.1 Introduction
The Daisy Wiki allows to customize the styling of documents by mean of an XSLT. This custom styling is typically performed depending on the document type.
5.10.1.2 The Input XML
The input of the stylesheets is an XML document which has a structure as shown below. This is not an extensive schema containing every other element and attribute, but those that you'll need most often.
<document
isIncluded="true|false"
displayContext="standalone|something else"
xmlns:d="http://outerx.org/daisy/1.0"
xmlns:p="http://outerx.org/daisy/1.0#publisher">
<context .../>
<variantQueryString>...</variantQueryString>
<variantParams>...</variantParams>
<p:publisherResponse>
<d:document xmlns:d="http://outerx.org/daisy/1.0"
id="..."
name="..."
[... various other attributes ...] >
<d:fields>
<d:field typeId="..." name="..." label="..." valueFormatted="..."
[... other attributes and children ...]>
... more fields ...
</d:fields>
<d:parts>
<d:part typeId="..." mimeType="..." size="..." label="..." daisyHtml="true/false">
[... HTML content of the part including html/body if @daisyHtml=true ...]
</d:part>
... more parts ...
</d:parts>
<d:links>
<d:link title="..." target="..."/>
... more links ...
</d:links>
[... customFields, lockInfo, collectionIds ...]
</d:document>
</p:publisherResponse>
</document>
5.10.1.2.1 p:publisherResponse element
The p:publisherResponse element then contains the actual document (and
possibly related information) to be published. It is the result of the
5.10.1.2.2 context element
The context element is the same as in the
5.10.1.2.3 variantQueryString and variantParams
When a document is shown within a site whose default branch and language are different from the branch and language of the document, then these elements contain pre-made query string parameters that the Daisy Wiki understands. Otherwise these elements are empty.
For example:
<variantQueryString>?branch=main&language=fr</variantQueryString> <variantParams>&branch=main&language=fr</variantParams>
These can be useful when building URLs to pages related to this document, which also need the correct branch and language specified.
5.10.1.2.4 isIncluded attribute
The isIncluded attribute on the document element indicates if this document is being published as top-level document or for inclusion inside another document. Sometimes you might want to style the document a bit different when included.
5.10.1.2.5 displayContext attribute
Similarly, the displayContext attribute on the document element
gives a hint toward the context in which a document is being displayed. The
value "standalone" is used for cases where the document is displayed by itself,
rather than as part of an aggregation. The value of the displayContext comes
from the
5.10.1.3 Expected stylesheet output
The output of the XSLT should be an embeddable chunk of HTML (or XSL-FO in the case of PDF). Thus no <html> and <body> elements, but something which can be inserted inside <body> (or inside a <div>, a <td >, etc). Where the produced output will end up depends on the stylesheet creating the general page layout, or in the case of included documents, the location of the inclusion.
5.10.1.4 Where the stylesheets should be put
The stylesheets should be placed in the following directory:
<wikidata directory>/resources/skins/<skin-name>/document-styling/<format>
In which <skin-name> is the name of the skin you're using (by default: "default"), and <format> either html or xslfo. Thus for the default skin, for HTML, this becomes:
<wikidata directory>/resources/skins/default/document-styling/html
The stylesheet should be named (case sensitive):
<document-type-name>.xsl
5.10.1.5 Example 1: styling fields in a custom way
Suppose we have a document type called "TestDocType" with a " SimpleDocumentContent" part , and two fields called "field1" and "field2". The default layout will first place the parts, then the fields (in a table), and then the out-of-line links (if any).
The stylesheet below shows how to put the fields at the top of the document:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="http://outerx.org/daisy/1.0">
<xsl:import href="daisyskin:xslt/document-to-html.xsl"/>
<xsl:template match="d:document">
<h1 class="daisy-document-name"><xsl:value-of select="@name"/></h1>
<p>
Hi there! Here's the value of field1:
<xsl:value-of select="d:fields/d:field[@name='field1']/@valueFormatted"/>
and field 2:
<xsl:value-of select="d:fields/d:field[@name='field2']/@valueFormatted"/>
</p>
<xsl:apply-templates select="d:parts/d:part"/>
<xsl:apply-templates select="d:links"/>
<!-- xsl:apply-templates select="d:fields"/ -->
</xsl:template>
</xsl:stylesheet>
To minize our efforts, we import the default stylesheet and only redefine what is needed. For comparison, the default template for d:document looks as follows:
<xsl:template match="d:document"> <h1 class="daisy-document-name"><xsl:value-of select="@name"/></h1> <xsl:apply-templates select="d:parts/d:part"/> <xsl:apply-templates select="d:links"/> <xsl:apply-templates select="d:fields"/> </xsl:template>
This new stylesheet should be saved as:
<wikidata directory>/resources/skins/default/document-styling/html/TestDocType.xsl
Now surf to a document based on TestDocType, and you should see the result.
5.10.1.6 Example 2: styling parts in a custom way
In this example, suppose we have a document type called "Article" with parts "Abstract" and "Body". We would like to render the abstract in a box. The below stylesheet shows how this can be done.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="http://outerx.org/daisy/1.0">
<xsl:import href="daisyskin:xslt/document-to-html.xsl"/>
<xsl:template match="d:document">
<h1 class="daisy-document-name"><xsl:value-of select="@name"/></h1>
<div style="margin: 20px; padding: 10px; border: 1px solid black; background-color: #ffd76c">
<xsl:apply-templates select="d:parts/d:part[@name='Abstract']"/>
</div>
<xsl:apply-templates select="d:parts/d:part[@name='Body']"/>
<xsl:apply-templates select="d:links"/>
<xsl:apply-templates select="d:fields"/>
</xsl:template>
</xsl:stylesheet>
Previous