Reliability of client-side XSLT transformations

I've received an interesting question on my “Search Engine Optimization in XML+XSLT designs” post:
Are there considerable browser-specific differences in xsl transformation, or am I being overly cautious?
I've been using browser-side XSLT processing for three years. Although I had initial share of problems with IE5 and some releases of IE6 (finally forcing me to perform server-side transformations for IE5), IE6/7 and Firefox behave almost identically as long as your XSLT is valid. Firefox is a bit more relaxed in error handling, so it might survive an invalid stylesheet and ignore the error. Handling XML/XSLT errors on IE is a nightmare: if the XSLT transformation fails, it's almost impossible to reload the document without closing the browser (obviously IE has some serious caching problems with XML documents). To test new XSLT transformations, I usually force server-side transformations and receive good error messages from server's MSXML.

Opera is a different story. It didn't support XSLT until pretty recently and even then the document() function was broken. I have simply decided not to offer XML data to Opera visitors (they are a minority anyway) and Safari is not widespread enough in my customer base to notice.

This post is part of You've asked for it series of articles.

Four very useful XSLT tricks

Attribute value template, Muenchian Grouping, Usage of XPath axes, handling input XML namespaces. Highly recommended reading :)

Web 2.0 is not necessarily a good thing

A sane voice in the Web-2.0-crazy world: Jacob Nielsen analyzes the impact of AJAX on web usability (beyond the cool factor) and its impact on the bottom line.

Set output attributes with XSLT

Setting attributes in output elements generated by XSLT transform is extremely easy: just enclose the XPath expression in curly brackets within the quotes surrounding the attribute value. You might even concatenate multiple XPath expressions or XPath expressions and string constants within the attribute value. For example, if you want to set CLASS attribute of the output DIV element to the value of the input @id attribute prefixed by "CSS-", use the following syntax:
<DIV class="CSS-{@id}">
However, if you want to eliminate the attributes that would have empty values (for example, the DIV element in the previous example should not have the class attribute if the @id input attribute does not exist), use xsl:attribute in combination with xsl:if or xsl:choose.

Microsoft's XMLHttpRequest Objects

If you don't want to use a wrapper library like Sarissa and plan to work out the differences between Microsoft's and other vendors' implementation of XMLHttpRequest, you'll find a lot of details in this post by Jonathan Snook.