58

I want to output single quote around $ID variable in the below xsl:value-of xsl statment.

<xsl:value-of select="concat('process[@Ref=',$ID,']')"></xsl:value-of>

currently it prints

process@Ref=87799989

How can I achieve this?

starball
  • 20,030
  • 7
  • 43
  • 238
keshav84
  • 2,291
  • 5
  • 25
  • 34

6 Answers6

51

In XPath 1.0:

You can use the built-in entities &apos; and &quot;

In XSLT 1.0:

Alternatively, you can define your $Q and $APOS variables (put the content (the literal " or the literal ' character) in the body of the xsl:variable, not in the select attribute).

In XPath 2.x (this also means XSLT 2.x and XQuery 1.x)

Simply escape an apostrophe by entering two adjacent apostrophes, escape a quote by entering two adjacent quotes, as defined by the XPath 2.0 language

Dimitre Novatchev
  • 240,661
  • 26
  • 293
  • 431
  • 1
    Could you please provide examples? (one example tells more than 1000 words and pushes your answer to the top). Thanks – Richard Gomes Jul 27 '13 at 20:30
  • 1
    @RichardGomes, See this: http://stackoverflow.com/a/7617563/36305 ,or this: http://stackoverflow.com/a/3453956/36305 , or this: http://stackoverflow.com/a/8783655/36305 – Dimitre Novatchev Jul 27 '13 at 21:49
40

To expand on Dimitre's answer, you can use this solution in XSLT:

<xsl:variable name="apos">'</xsl:variable>
<xsl:value-of select="concat('process[@Ref=',$apos,$ID,$apos,']')"></xsl:value-of>
Veloz
  • 619
  • 6
  • 11
34

Use &apos;?

<xsl:value-of select="concat('process[@Ref=&apos;',$ID,'&apos;]')"></xsl:value-of>

Edit: See Dimitre's answer for a better solution.

Community
  • 1
  • 1
kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
5
<xsl:value-of
select="concat('process[@Ref=&apos;',$ID,'&apos;]')"></xsl:value-of>

this doesn't work for me. My solution is:

<xsl:value-of select="concat(&quot;process[@Ref='&quot;,$oidConstant,&quot;'&quot;)"></xsl:value-of>
Simon
  • 371
  • 2
  • 11
  • I was skeptical but this works - the plain text double quote contains the select statement and the encoded doubles are consumed by the parser - nice – Paxic Jan 26 '17 at 23:46
0

Easy Example would be

      <xsl:variable name="varTitle" select="title" />
<xsl:variable name="APOS">'</xsl:variable>
<xsl:value-of select="translate($varTitle, 'any text', $APOS)"/>

This will replace "any text" with ' in my title.

0

Instead of using concat(), you can do the string concatenation inside a variable assignment. That allows to write a simple, unescaped ' to mean ':

<xsl:variable name="process-selector">process[@Ref='<xsl:value-of select="$ID"/>']</xsl:variable>
<xsl:value-of select="$process-selector" />

With the recommended way to allow linebreaks without accidentally adding whitespace to the output, this becomes quite lengthy (but that's XSL, right?):

<xsl:variable name="process-selector">
    <xsl:text>process[@Ref='</xsl:text>
    <xsl:value-of select="$ID"/>
    <xsl:text>']</xsl:text>
</xsl:variable>
<xsl:value-of select="$process-selector" />

 


Full XSL file for this solution to test, for example with an online XSL-T service like xsltransform.net:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html"/>

    <xsl:template match="/" name="strip-space" >
        <xsl:variable name="ID" select="123"/>
        <xsl:variable name="process-selector">
            <xsl:text>process[@Ref='</xsl:text>
            <xsl:value-of select="$ID"/>
            <xsl:text>']</xsl:text>
        </xsl:variable>
        <xsl:value-of select="$process-selector" />
    </xsl:template>

</xsl:transform>
tanius
  • 14,003
  • 3
  • 51
  • 63