[xslt] str:replace conformance
- From: Ron Burk <ronburk hightechinfo com>
- To: The Gnome XSLT library mailing-list <xslt gnome org>
- Subject: [xslt] str:replace conformance
- Date: Tue, 27 Jan 2009 08:35:50 -0800
I wonder if str:replace conforms to its specification.
The style sheet fragment below is intended to replace a set of
characters in the current text node with a set of longer
strings representing the escaped TeX version of those
characters. Consider the text:
(#) ($) (%) ({) (}) (_) (\)
The intended transformation is to produce this:
(\#) (\$) (\%) (\{) (\}) (\_) ($\backslash$)
when the Jeni Tennison XSLT version of str:replace is used
(see stylesheet fragment at end), the result is this:
(<to>\#</to>) (<to>\$</to>) [... etc.]
which, when the output mode is "text", produces the desired
result. I would have thought the *contents" of the corresponding
replacement nodes would be inserted, but in fact the spec
does seem to say "the equivalently positioned node", for
better or worse.
However, the libexslt version of str:replace produces this:
($\backslash$#) ($\backslash$$) ($\backslash$%) [... etc.]
So, maybe there are two problems. First, if the entire corresponding
replacement node is supposed to be inserted, then I think libexslt
is not doing it. Second, it seems like libexslt's str:replace is
willing to alter text it has already altered (first, "#" was replaced
with "\#", then further replacements applied to that). One
could argue that the spec is not 100% unambiguous on this
point (though it was explicitly forbidden in discussion
behind the spec, AFAICT). However, if this point is
ambiguous, that would render str:replace useless for a large
class of its applications, given that one could't really guess
what result would appear from one implementation to another.
The stylesheet fragment in question is this:
<xsl:output method="text" />
...
<xsl:template match="text()">
<xsl:variable name="Replace">
<FromXml>
<from>#</from>
<from>$</from>
<from>%</from>
<from>_</from>
<from>{</from>
<from>}</from>
<from>~</from>
<from>^</from>
<from>\</from>
</FromXml>
<ToTex>
<to>\#</to>
<to>\$</to>
<to>\%</to>
<to>\_</to>
<to>\{</to>
<to>\}</to>
<to>\~{}</to>
<to>\^{}</to>
<to>$\backslash$</to>
</ToTex>
</xsl:variable>
<!-- to call the Jeni Tennison version
<xsl:call-template name="str:replace">
<xsl:with-param name="string" select="."/>
<xsl:with-param name="search"
select="exsl:node-set($Replace)/FromXml/from"/>
<xsl:with-param name="replace"
select="exsl:node-set($Replace)/ToTex/to"/>
</xsl:call-template>
-->
<xsl:value-of
select="str:replace(.,exsl:node-set($Replace)/FromXml/from,exsl:node-set($Replace)/ToTex/to)"
</xsl:template>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]