Re: [xsl] String conversion problem when string is large

Subject: Re: [xsl] String conversion problem when string is large
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Tue, 20 Mar 2012 23:50:24 +0000
Try changing this:

            <xsl:with-param name="HexData">
              <xsl:value-of select="substring-after($HexData, ',')" />

to this:

<xsl:with-param name="HexData" select="substring-after($HexData, ',')" />

Passing the parameter as a string will be MUCH more efficient than passing it as a TinyTree.


That resulted in success.

I have much to learn.  Those two things look identical to me.

Sadly, it's a very common mistake. Any variable-like element with content (xsl:variable, xsl:param, xsl:with-param) creates a temporary tree; in this case a tree containing a document node and a single text node child. That's a much more heavyweight data structure than a simple string, as your memory problems demonstrate. It behaves like a string in most circumstances, but not all - for example, conversion to a boolean behaves differently. That makes it quite hard to optimize. Saxon does its best by using a special tree model that can only hold a document node with a single text node child. I happened to notice in your stack trace that this wasn't being used here, it was using a standard TinyTree - I'm not sure why the optimization isn't kicking in, there can be any number of reasons. But using a string is so much better, it reduces the size of your code and makes all this optimization effort (which is really just amelioration of bad code) completely unnecessary.

Even better, declare it as a string so the optimizer knows what to expect!

Current Thread