- Prepare an InDesign template.
- Arrange data into a suitable format for the InDesign template to understand.
- Import the data into the template
Why read this article?
Setting up the InDesign template is an one-off job, with one sample product entry. You write the XML transformation code once. Then, when you import the data, the single-book template replicates itself to create as many catalogue entries as there are product records in your data — potentially thousands and thousands of catalogue entries with a single click. Then reuse your template and code for the next season’s catalogue.
What is ONIX?
ONIX is a way of sending rich book data to the companies who need it – Nielsen, Bowker and so on. But ONIX’s comprehensive nature means that it can be quite verbose. In a catalogue, we don’t need every last bit of information about a product. So we’re going to convert our ONIX XML message into another XML file that’s less wordy, using a language called XSLT. Then we’ll be able to import it into InDesign. (In fact, InDesign can handle the conversion process itself, when we import the XML.)
Get the demo files
Download the files here [zip file, 15mb]. It contains an InDesign template. Here’s the structure pane of our InDesign template, showing how each entry will be structured: we’re going to need to whittle our ONIX down until we’ve got an XML file that matches this structure.
To prepare the data for it, using an XSL transformation:
Open the XSL code file
transform.xsl: this is how the
transform.xsl file looks.
Line 1 tells the computer that this is an XML file.
Line 2 defines the first tag, called
and gives a bit more information about this part of the file – which is that this code is XSL.
Line 3 means “find each mention of ONIXMessage/Product in the ONIX file.”
Define a new tag
The next bit defines a new XML tag, called
If you look ahead to line 24, you’ll see its sister, the closing tag. We know it’s a closing tag because of the backslash.
Lines 5 to 7 set up some variables. A variable is like having a shortcut. For example, I can define a variable called “address”:
address = “Chiltern House, Thame Road, Haddenham, Aylesbury, Buckinghamshire HP17 8BY, UK”
Now, next time I want to give my office location, I don’t have to spell out the whole address. The variable “address” is a shorthand way of saying the whole thing.
Back to our code. The next lines define three variables on the next lines: one called
form, one called
date and the other called
isbn, so we can use them later. The values of the variables come from the ONIX file. The data tagged up with
ProductFormDetail is assigned to the variable called “form”.
Similarly, the value in the ONIX tagged up as
PublicationDate is saved as the variable
A more complex variable
Lastly, the ONIX tagged
ProductIdentifier[ProductIDType = ’03’]/IDValue gets set as the variable called
<ProductIdentifier> <ProductIDType>02</ProductIDType> <IDValue>0954575989</IDValue> <ProductIDType>03</ProductIDType> <IDValue>9780954575984</IDValue> </ProductIdentifier>
There are two ProductIdentifier tags here and this code selects the one with
Line 8 defines another XML tag, called
<image>. Because it’s an image tag, it takes an
href attribute. It uses the
isbn variable, defined above.
<image href=\"file:///9780954575984.jpg\" />
Converting data into a new format
The next line defines a new XML tag,
<year>. It uses a new XSL command:
Line 9 says “Get the value of the
date variable”. It also amends the date format.
If we wrote:
… then the new
<year> XML tag would read
<year>20120228</year>. But ISO-format dates are not appropriate in a catalogue. Instead we want it to read
<year>28/02/2012</year>. So whilst this looks complicated at first glance:
concat(substring($dt,7,2), ‘/’,substring($dt,5,2), ‘/’,substring($dt,1,4))
What it’s doing is saying:
- Concatenate the following things in the brackets:
- First, get the value of the date variable, which is 20120228.
- Count to the 7th digit, which is 2.
- Then get the 2 following digits, which would be 28.
- Then put a backslash in.
- Next, use that same date variable and get the fifth number, which is 2, and then the next two digits, which gives you 02.
- Put another backslash in.
- Finally, get that same date variable, and get the first number, which is 2, and then the next four digits, which gives you 2012.
- All of that gives you 28/02/2012.
Getting a value
The next line, 10, is also an
<xsl:value-of>, and we use our
isbn variable again. This line produces another XML tag called
All these tags will be used in the InDesign document we’ll see in a bit.
Choosing an option
We’re going to look at the last XSL command for today, which is
<xsl: choose >
On line 11, we have another XML tag, called
<format>. But what to put in this tag? The syntax says “Choose from the following: when the ONIX form variable is B104, put in A Format Paperback. When the ONIX form variable is B105, put “B Format Paperback” in our new
<format> tag.” And so on.
Importing to InDesign
The next bit is best shown on video. Watch how to use this XSLT code to transform ONIX into a more concise XML file and automatically flow it into our InDesign template. (Watch it on HD to see the detail.)
Use the files you’ve downloaded to practice, and then use your own company’s ONIX file to have a go. Then, tweak the InDesign template so that the colours and fonts are to your taste, and produce your own catalogue. Raise a ticket for more guidance.
This demo is a deliberately pared-down example. You’ll likely want to include more information such as the title, the blurb and the price. I can recommend A Designer’s Guide to InDesign and XML which contains even more templates and excellent descriptions of how to start using InDesign programmatically.