Whitespace in SDL Tridion SP1 XML

Before reading this, and getting too alarmed, this blog of caution really only applies to those who use XSLT templates (either using the XSLT Mediator or traditional XSLT Component Templates). Although it may have a wider impact that I am not aware of.

I just upgraded a client implementation to 2011 SP1, and mysteriously some of my components were failing to publish. At first this seemed to be a template issue, but on further inspection it became apparent that components that had been made before the SP1 upgrade were fine, and those create or edited after the upgrade were failing.

In one of our XSLT Template Building Blocks, we essentially copy the XML of the Component in order to make all the data available to the presentation code. In addition to copying the nodes, we also add some additional attributes.

<image>
    <image xlink:type="simple" xlink:href="tcm:0-114344" xlink:title="ross" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</image>

Gets transformed by our template to

<image Orientation="portrait" Photographer="- Not applicable" Illustrator="">
    <caption>Some Caption</caption>
    <image type="pub148w" height="148" width="60" src="tcm:417-117248" uri="tcm:417-117248" /
    <image type="pubArticleFull" height="480" width="640" src="tcm:417-117248" uri="tcm:417-117248"/>
</image>

This was working perfectly from version 5.3 up until 2011 GA. However we discover that the XML of components saved using SDL Tridion 2011 had changed

GA XML

<image><image xlink:type="simple" xlink:href="tcm:0-114344" xlink:title="ross" xmlns:xlink="http://www.w3.org/1999/xlink" /></image>

SP1 XML
<image>       <image xlink:type="simple" xlink:href="tcm:0-114344" xlink:title="ross" xmlns:xlink="http://www.w3.org/1999/xlink" />       </image>

The additional whitespace was being added to the image node by my XSLT template, and it was preventing me from adding the Orientation, Photographer and Illustrator attributes to the element (you can not add attributes with XSLT to a node after adding text, whitespace or nodes)

To get around this I have added <xsl:strip-space elements=”*”/> to the top of my XSLT which fixes our problem, but it does mean we now need to validate the output of all our templates to make sure we are not stripping out any whitespace that we actually need.

Lesson of the day: Never write an XSLT thinking whitespace is irrelevant.

You decide whether you think this is a bug or not, but in the meantime, I hope this post might help you debug any XML related woes you stumble upon after upgrading to SP1.

This entry was posted in Bugs, Helpful Tridion tips, Tridion 2011, Tridion news by Chris Summers. Bookmark the permalink.

About Chris Summers

Chris has spent his career creating and developing technology for website operation and management. With a background in engineering and design, for the past 12 years, Chris has focused on implementing SDL Tridion products, working with companies and their technical staff to ensure an in-depth understanding of the software and complete successful, on-going implementations. Chris has worked with more than 60 of the largest and most expansive SDL Tridion implementations in the world, from launching custom integrations, offering technical training and mentoring consultants through to certification. When he’s not talking or thinking about websites, Chris is an avid chef, an amateur carpenter and a flying trapeze enthusiast. A fan of travel and adventure, he’s a citizen of the world who currently makes his home in Boston, USA.

2 thoughts on “Whitespace in SDL Tridion SP1 XML

  1. So it turns out that I had run across this issue before when using c#, and not XSLT. This extra whitespace seems to get saved in Structure Group and Page metadata as well as Components.
    I have a loop a bit like this:

    if (sg.Metadata != null)
    {
    foreach (XmlNode metaNode in sg.Metadata.ChildNodes)
    {
    newElement.AppendChild(metaNode);
    }
    }

    This started failing inSP1, as every other child node was a whitespace element, so I had to change it to this:

    if (sg.Metadata != null)
    {
    foreach (XmlNode metaNode in sg.Metadata. SelectNodes(“*[name()!=”]”))
    {
    newElement.AppendChild(metaNode);
    }
    }

    This change is having a bigger impact that I thought

  2. Thanks, for finding out all these upgrade issues!
    We use a lot of XSLT templating, so I will send this around.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>