Programming XSLT
stylesheets for Adlib

Axiell ALM Netherlands BV

Copyright © 2013-2016Axiell ALM Netherlands BV® All rights reserved. Adlib® is a product of Axiell ALM Netherlands BV®

The information in this document is subject to change without notice and should not be construed as a commitment by Axiell ALM Netherlands BV. Axiell assumes no responsibility for any errors that may appear in this document. The software described in this document is furnished under a licence and may be used or copied only in accordance with the terms of such a licence. While making every effort to ensure the accuracy of this document, products are continually being improved.

As a result of continuous improvements, later versions of the products may vary from those described here. Under no circumstances may this document be regarded as a part of any contractual obligation to supply software, or as a definitive product description.

24-10-2016

Contents

Introduction

1 An introduction to XML and XSLT

1.1 What is XML

1.1.1 XML document requirements

1.1.2 How XML documents may be structured

1.1.3 Available XML types

 Unstructured XML from wwwopac.ashx or adlwin.exe

 Grouped XML as produced by wwwopac.ashx

 Grouped XML as produced by adlwin.exe

1.2 What is XSLT

1.2.1 A bare stylesheet

1.2.2 XPath and templates

1.2.3 Extending the stylesheet to produce proper HMTL

1.2.4 Using CSS stylesheets

1.2.5 Applying HTML tables

1.2.6 Functions, variables and parameters in XPath

 Adlib and Axiell Collections parameters

1.2.7 Getting an example of the generated Adlib XML

1.2.8 Best practice

1.2.9 Other uses of XML and XSLT

1.2.10 More information

2 Creating output formats

2.1 Grouped XML for XSLT export/output formats

2.1.1 Setting the XML type in Designer

2.1.2 Advantages of grouped XML for use in stylesheets

2.1.3 Examples

2.2 Printing images via an XSLT stylesheet

2.2.1 Example Adlib output formats

2.2.2 Example Axiell Collections output format

2.3 Accessing the current user name in XSLT

2.4 Printing barcode labels to a normal printer

2.5 Creating text labels from HTML fields

2.5.1 Printing, export and wwwopac output

2.5.2 Notes

3 Stylesheets for Adloan slips

3.1 Available Adloan XML output

 Issues

 Returns

 Reservations

3.2 Adloan version differences

4 A web browser box display format

4.1 Web browser box setup

4.1.1 Examples

4.1.2 Adding hyperlinks to your stylesheet

4.1.3 Error handling and testing

5 Adlib Office Connect stylesheets

5.1 The Adlib Office Connect plugin

5.2 The standard stylesheets

5.2.1 Adding interface language dependent texts

24-10-2016

An introduction to XML and XSLT

Introduction

Underneath the surface of the graphical user interface of your Adlib application or Axiell Collections application, records are handled by the software in XML format, which basically is a hierarchically structured text format. Normally, you won’t encounter the XML itself, but you’ll have to know about it if you want to start using XSLT to create output formats or to edit presentation formats for Adlib Office Connect, for your Adlib Internet Server web application or for web browser boxes on application screens, to name but a few. XSLT is a stylesheet language (itself in XML format) to “transform” an XML document to some other document; this may be an XML document with the same structure but with changes made to the data in it, or it can be a differently structured XML document, or an HTML document, a PDF, or some other text file.

XML and XSLT are third-party programming technologies, so to properly learn all about them we recommend studying other sources than the document before you. In this manual though, you’ll get a quick introduction followed by actual examples applicable to the Adlib or Axiell software, enough to get you started properly.

Some functionality requires Adlib 7.1 or higher.

124-10-2016

An introduction to XML and XSLT

1An introduction to XML and XSLT

1.1 What is XML

XML (eXtentible Markup Language) provides a means of hierarchically structuring data in a text file. In contradiction to HTML (which is intended to lay out text or data for display in web browsers), it does not offer layout instructions. Other than a few PIs (Processing Instructions providing metadata about the document for the processor, enclosed in <? ?>) at the start of the file, the only language it contains consists of tags, the name of which can be anything the maker of the XML document desired. Every separate piece of data must be enclosed by a start and end tag, formatted like <tag>data</tag>, together called an element or node, which may be spread over different lines. The following is an example of a simple yet complete XML document (not Adlib XML in any way though), although no title has been specified for the third book:

<?xmlversion="1.0"?>

<!-- my comment --

booklist

bookisbn="901234567">

authorHesse, Herman</author

authorClaus, Hugo</author

titleSiddharta</title

</book

book

authorWolkers, Jan</author

titleTerug naar Oegstgeest</title

publisherSummer &amp; Köning</publisher

</book

book

authorAusten, Jane</author

</book

</booklist

Every XML document has to start with: <?xmlversion="1.0"?> or <?xmlversion="2.0"?> to tell the processor which XML version is implemented in this document. Optionally, you could also mention here the Unicode representation in which this file has been saved, e.g.: <?xmlversion="1.0"encoding="UTF-8"?>

1.1.1 XML document requirements

There are some further rules to putting together an XML document.

  1. Each XML document can only have one root tag. In the example above this is booklist.
  2. Tags must have sensible names, so that others can easily understand the document, and for the sake of interoperability. If it contains Adlib data, those names need not be the same as Adlib field names per se.
  3. Every element must be closed. A start tag without an end tag corrupts an XML document. If there is no data between a start and end tag, this may be indicated by a single combined tag to open and close at once: <tag/>.
    Note that there’s a difference between an empty tag, for instance <title</title> and no title tags at all, which is relevant to XSLT stylesheets processing an XML document.
  4. Tags are nested. In the example you can see that the authors Hesse and Claus are nested within the first book tag, and that the book tags are nested within the root tag booklist. This nesting is crucial to keeping data together, like it is in Adlib records.
  5. The increasing indentation (whitespace) in front of nested tags, as shown in the example, is not strictly necessary, but it keeps the document readable.
    Visual Studio is handy for writing and editing XML docs, because it suggests end tags and adds coloring, but you can edit an XML doc in any text editor, as long as you save the file in Unicode UTF-8 representation (if you want to use the XML file in Adlib).
  6. A tag may have attributes. An attribute is metadata included in a start tag, and it’s purpose is to describe something about the data in the current element or all elements nested in it. It should be in the format <tag attribute="value". In our example there is one attribute for the tag book: <book isbn="901234567">. This may not be a good example because ISBN is a field in an Adlib record, and is not really considered metadata in there. But the maker of the document decides what is metadata and what isn’t. The language of records could also be specified this way, for example: <booklist language="en-us". Every start tag may have zero, one or more attributes; attributes should be separated by a space. And every attribute must have a unique name, specified by the maker of the document, and it cannot contain spaces. The double quotes around the value are mandatory, a value in between isn’t. Note that double quotes come in different varieties, but should be the straight version, as follows: ", not “ or ” as created by MS Word for example.

  1. A few characters have to be “escaped” (meaning: replaced) when used in the data itself, because they are reserved characters to the XML language. These are:

Character / Escape sequence to use in data
&lt;
&gt;
‘ / &apos;
“ / &quot;
&amp;

In our example we see an illustration of this: <publisher>Summer &amp; Köning</publisher>. Note that other special characters in data, for instance á or € don’t need to be escaped because this is a Unicode file.

  1. XML tags and attributes are case-sensitive. So <Author> is not the same as <author>.

The easiest way of checking whether an XML document doesn’t contain any errors is by double-clicking it in Windows Explorer. If the file opens normally in Internet Explorer, there are no XML syntax errors. However if there are syntax errors, then the file doesn’t open and IE displays an error message. So, Internet Explorer can validate an XML document.

1.1.2 How XML documents may be structured

If you were to write an XML document yourself, you would in principle be free to structure it any way you wanted. But if XML documents must be exchangeable between diverse software programs, you’ll probably want the XML to adhere to some rules. Because you’ll not only have software producing XML but also software to do something with the XML input (like the Adlib Internet Server webapplication or Adlib Office Connect for example), and therefor the hierarchy in the XML file must be what the software expects it to be.

For Adlib you usually won’t write XML documents manually: they are produced internally by Adlib as the (intermediate and/or end) result of an export or print job or as the search result from wwwopac. So the software will by default produce XML documents, which adhere to earlier specified rules for Adlib XML files, together forming the so-called Adlib XML schema. Whenever third-party software produces XML documents to be processed by Adlib software at some point, it must also comply to this schema.
There are two methods to specify rules to which XML files must adhere, via a DTD (Document Type Definition) or XSD (XML Schema Definition).

  • DTD is an old-fashioned way, although the EAD (Encoded Archival Description) still uses it. A disadvantage of the DTD is its syntax, which allows for files to become unreadable because of their complexity.
  • XSD,the XML Schema Definition is DTD’s successor. It is an XML file itself.

Adlib XML is formatted according to the adlibXML.xsd (which can be viewed in full at The most important thing you need to know about Adlib XML is that only the XML tags of the three highest levels have been defined, namely: adlibXML (root tag), recordlist (may occur only once), record (may occur indefinitly). Further, there is a diagnostic tag on the level of the recordlist, which contains metadataabout the search, such as the elapsed time and the number of records that were found.The fields in the records are contained within each record element and have the English field name by which they are declared in the database .inf file. The structure of an Adlib record itself is not defined in the schema definition because this differs per database and XML type.

1.1.3 Available XML types

Within the Adlib XML schema, different XML types are possible, mainly separated into unstructured and grouped XML, but grouped XML still has variations. XML is either produced by adlwin.exe (which runs your Adlib Museum, Library and Archive applications for Windows) or by wwwopac.ashx (API) (which processes Adlib data for the Internet Server web application or Adlib Office Connect).

Unstructured XML from wwwopac.ashx or adlwin.exe

Unstructured XML can be produced by wwwopac.ashx or be exported by adlwin.exe, if requested so.

Unstructured XML has a flat structure: all fields and their occurrences are immediate children of the record element. If a field has multiple occurrences, then all those occurrences are listed directly underneath each other.

  • Of a multilingual field (if present), only the value of the currently searched data language is returned by wwwopac.ashx, and it is returned directly in the field node, without language or invariancy attributes.Adlwin.exe on the other hand, will export all language values.
  • Of an enumerative field, wwwopac.ashxonly returns the neutral value, directly in the enumerative field node, unless you specify the presentation language with the language parameter followed by a standard language code without square brackets around it, in which case only the relevant translation is returned, directly in the enumerative field node.Adlwin.exe on the other hand, returns the neutral value as an attribute to the field node while all user interface translations are listed inside the field element, in a text subnode per language.

Below you can see an abbreviated example of an adlwin.exe export of a Dutch record with repeated object_name nodes and a record_type enumerative field, to unstructured XML:

<?xmlversion="1.0"encoding="UTF-8" ?>

adlibXMLxmlns:xsi="

xsi:noNamespaceSchemaLocation="
adlibXML.xsd"

recordList

record

priref139</priref

institution.nameNederlands Textielmuseum</institution.name

descriptionGordijnstof met voorstelling van kookboeken.
Verticaal ruggen van boeken in verschillende breedten en
kleuren. Op de ruggen titels van kookboeken.</description

institution.place/>

production.date.end1960</production.date.end

reproduction.format/>

reproduction.reference06243.jpg</reproduction.reference

object_number00216243</object_number

object_nameinterieurtextiel</object_name

object_nameraambedekking</object_name

<object_namegordijnstof</object_name

titleGordijnstof met kookboeken</title

record_typeoption="OBJECT"value="OBJECT"

textlanguage="0"single object</text

textlanguage="1"enkelvoudig object</text

textlanguage="2"objet individuel</text

textlanguage="3"Einzelnes Objekt</text

</record_type

</record

</recordList

diagnostic

xmltypeUnstructured</xmltype

hits1</hits

dbnamecollect</dbname

dsnameintern</dsname

</diagnostic

</adlibXML

Grouped XML as produced by wwwopac.ashx

Grouped XML is hierarchically structured XML: fields may be a direct child of the record element, or when a field group name has been defined in the data dictionary, a child of a group element with the name of the group. In this case the group element is a child of the record element. There are differences between the grouped XML of records retrieved for brief display and that of a single record retrieved for detailed display. The rest of this paragraph considers the grouped XML retrieved for detailed display; examples of both types of XML can be studied at by first adding &xmltype=grouped to the example queries, if needed, and then executing them.

If at least one of the fields in a field group has multiple occurrences, then the entire field group is repeated as many times. Empty occurrences of fields in a field group are retrieved as well. The main advantage of the grouped type over the unstructured one is that it becomes easier to process repeated occurrences of grouped fields, using XSLT. In unstructured Adlib XML, all fields and field occurrences are just listed in one long list inside the <record> node, whilst in grouped Adlib XML, fields are grouped within a field group node (if a relevant field group exists in the data dictionary) and that field group node is repeated for each field group occurrence.

  • Of a multilingual field (if present), all language values are returned as value subnodes of the field node; the language code and invariancy flag per language value are returned as attributes to the value nodes.
  • Of an enumerative field, both the neutral value and all available translations of the enumerative value are returned, in value subnodes underneath the enumerative field node; the presentation languages are attributes to the value nodes, and are indicated by an Adlib language number, not by their language code. The presentation language parameter does not apply to the grouped XML output type.

Apartial example of grouped wwwopac.ashx output of a single record retrieved in detail:

<?xmlversion="1.0"encoding="UTF-8"?>

adlibXML

recordList

recordselected="False"modification="2012-05-31T11:11:27"
created="2007-02-07T14:40:36"priref="10"

<acquisition.date1816</acquisition.date

administration_namePDP</administration_name

content.person.nameVenus</content.person.name

content.person.nameCupid</content.person.name

content.person.name.type

<valuelang="neutral"PERSON</value

<valuelang="0"Person</value

<valuelang="1"persoon</value

<valuelang="2"personne</value

<valuelang="3"Person</value

<valuelang="4"إسمشخص</value

<valuelang="6"πρόσωπο</value

</content.person.name.type

creator.role.lref2</creator.role.lref

Dimension

dimension.value118.1</dimension.value

<dimension.typeheight</dimension.type

<dimension.type.lref6</dimension.type.lref

<dimension.unitcm</dimension.unit

<dimension.unit.lref8</dimension.unit.lref

</Dimension

Dimension

<dimension.value208.9</dimension.value

<dimension.typewidth</dimension.type

<dimension.type.lref7</dimension.type.lref

<dimension.unitcm</dimension.unit

<dimension.unit.lref8</dimension.unit.lref

</Dimension

institution.nameThe Fitzwilliam Museum</institution.name

institution.name.lref4</institution.name.lref

institution.place/>

Material

material.partmedium</material.part

materialoil paint</material

</Material

Material

<material.partsupport</material.part

<materialcanvas</material

</Material

object_categorypainting</object_category

object_category.lref1</object_category.lref

object_number109</object_number

priref10</priref

Production

<creatorPalma, Jacopo il Vecchio</creator

<creator.date_of_birth/>

<creator.date_of_death/>

<creator.history/>

<creator.qualifier/>

<creator.rolepainter</creator.role

<production.notes/>

<production.place/>

</Production

Title

title

<valuelang="el-GR"invariant="false"Venus and