xsl-list
[Top] [All Lists]

Re: Escaping quotes in XPath expressions

2003-11-15 06:53:06
Can anyone please tell me how I can escape a single-quote in an XPath
expression
such as the one below?

<xsl:value-of select="translate(normalize-space(.), 'x', 'y')"/>

If I use 'x' and 'y' as the search and replace arguments, everything works
well. But I
need to search for single-quotes and replace them with backslash +
single-quote. In
other words, my XPath expression would look something like this:

translate(normalize-space(.), ''', '\'')

translate() can only translate a character into another character or to
nothing. It is not possible using translate() to translate a character into
two or more characters.

For such tasks it is convenient to use the "str-map" template from FXSL.


This transformation:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:escape="my:escape"
exclude-result-prefixes="xsl escape"

   <xsl:import href="str-map.xsl"/>

   <xsl:output method="text"/>
   <xsl:variable name="vQ">'</xsl:variable>

 <xsl:template match="/">
     <xsl:variable name="vEscape" select="document('')/*/escape:*[1]"/>
     <xsl:call-template name="str-map">
       <xsl:with-param name="pFun" select="$vEscape"/>
       <xsl:with-param name="pStr">a'b'c'd</xsl:with-param>
     </xsl:call-template>
   </xsl:template>

   <escape:escape/>
    <xsl:template name="excape" match="escape:*">
      <xsl:param name="arg1"/>

      <xsl:if test="$arg1 = $vQ">\</xsl:if>
      <xsl:value-of select="$arg1"/>
    </xsl:template>

</xsl:stylesheet>

when performed (on any source.xml -- not used) produces the wanted result:

a\'b\'c\'d


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL





 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list