Working for Opera Software's QA department gives you in-depth perspectives on the web's wild and varied coding practises. I still wasn't prepared for the curious solutions that power the menu on the new Israeli rail website.
The XSLT markup/programming language is widely used to transform one sort of DOM into another – for example turning the DOM of a generic XML file into valid XHTML. Much of the benefit is that you're working on DOM trees – making it hard or impossible to create syntactically invalid pages.
<xsl:value-of select="$attribute-name"/>="<xsl:call-template name="inner-attribute-text-value"><xsl:with-param name="attribute-value" select="$attribute-value"/></xsl:call-template>"
<xsl:template name="inner-text-tag-open"><xsl:text disable-output-escaping="yes"><</xsl:text></xsl:template> <xsl:template name="inner-text-element-close"> <xsl:param name="element-name"/><xsl:call-template name="inner-text-tag-open"/>/<xsl:value-of select="$element-name"/><xsl:call-template name="inner-text-tag-close"/></xsl:template> <xsl:template name="inner-text-tag-close"><xsl:text disable-output-escaping="yes">></xsl:text></xsl:template>
Yes, all that to create a text node containing e.g.
in a DOM they will serialize only to parse it again by setting innerHTML on some poor element..
When they in their wisdom chose to generate markup inside text nodes with their XSLT they run into the familiar problem: when is < going to start a tag and when is it going to live in a text node? Hence, < is sometimes escaped as an 'lt' entity to create proper text nodes with HTML source-as-text in them (see for example the instance of
in the code above). Now, of course when they set innerHTML they do not want this entity to appear as a literal < so they do some pre-processing: all entities they want to change into proper < and > before setting innerHTML have a comment node next to them:
<TR class="nw-2r"><TD class="nw-2c">
and their pre-processing is a simple string replace:
sHtml = sHtml.replace(/<!--nwlt--></g,"<").replace(/><!--nwgt-->/g,">").replace(/<[/]?tbody>/gi,"");
(Why they hate the poor TBODY so much they must strip it from the markup even though the browser will re-generate them in the DOM as soon as innerHTML is parsed I can't even begin to imagine.)
If you thought XML-based toolchains and processes were going to make the Web a saner place, think again. We have now seen that in the right hands, XSLT is just another recipe for tag soup.