Hi Mark,
That solution could work but the general case makes it a bit complicated.
A programlisting can have inlines, so the solution has to be able to process text
inside those inlines as well. I think a template that matches on text node
descendants of programlisting could work:
<xsl:template match="text()[ancestor::programlisting]">
Making the substitutions in the text in XSLT 1.0 requires using a recursive template
to step through each text node. The risk with recursive processing is getting too
deeply nested in the recursions so that the XSLT processor gives ups. I think Saxon 6
breaks at about 300 nested recusions. A long programlisting with many spaces and
newlines could easily exceed that. I've solved that problem in the past by doing two
levels of recursion, processing the content in, say, 50 line chunks.
I don't know that we would put this in the stylesheet distribution because it's so
complicated. It might be easier to just add a note (perhaps Javascript triggered by
the Firefox user agent string) that if the user wants to cut and paste that they
should use a browser other than Firefox. 8^)
Bob Stayton
Sagehill Enterprises
bobs@sagehill.net