Three days ago, in the process of finishing up the transition to the new design(s), I discovered a new reason to dislike XSLT—and it’s not exactly like I was lacking for reasons to do so before that. So what aroused my ire this time around? Whitespace. Suppose you have the following XSLT template:
<xsl:template match="/archive">
<div id="thoughts">
<h3>
<span>Thoughts From Eric</span>
</h3>
<xsl:apply-templates select="//entry" />
</div>
</xsl:template>
Further suppose you want to preserve those whitespace returns in and around the elements, in order to keep the resulting HTML clean and readable without being forced to indent all the elements. You can very easily force source indentation with xsl:output
, but if you indent elements then you indent everything, including inline elements, and that drives me crazy. In addition, having the whitespace avoids strange layout bugs in certain Web browsers that shall remain nameless, but are not IE/Win, surprisingly enough.
There is, so far as I could discover, only one way to ensure that whitespace is preserved in the HTML output. It isn’t xsl:preserve-space
, which will only preserve the whitespace found in the source XML. No, apparently the answer is to use xsl:text
as follows:
<xsl:template match="/archive">
<div id="thoughts">
<xsl:text>
</xsl:text>
<h3>
<xsl:text>
</xsl:text>
<span>Thoughts From Eric</span>
<xsl:text>
</xsl:text>
</h3>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="//entry" />
<xsl:text>
</xsl:text>
</div>
</xsl:template>
God, that’s ugly. Really ugly. Much uglier than XSLT’s inherently verbose clumsiness in template handling, which is what made me dislike it in the first place. If there’s a better way to do what I did above, someone please let me know so I can share it with everyone else and feel a little less annoyed. Thanks.
Don’t misunderstand: I really like what XSLT can do. It’s just the syntax and what I find to be thoroughly weird limitations (such as the above) that I abhor.