2011-06-08 43 views
7

我需要这样做:XSLT需要选择一个单引号

<xsl:with-param name="callme" select="'validateInput(this,'an');'"/> 

我读过Escape single quote in xslt concat function,它告诉我更换'&apos;我已经做了但其仍然没有工作..

有谁知道我们如何解决这个问题?:

<xsl:with-param name="callme" select="'validateInput(this,&apos;an&apos;);'"/> 
+0

问得好,+1。看到我的答案是一个有用的技术,可以很容易地将任何特殊字符混合成一个字符串。 – 2011-06-08 13:42:47

回答

9

一些简单的可被用任何版本的XSLT

<xsl:variable name="vApos">'</xsl:variable> 

我经常使用相同的技术用于指定报价

concat('This movie is named ', $vQ, 'Father', $vApos, 's secrets', $vQ) 

所以:

<xsl:variable name="vQ">"</xsl:variable> 

然后你可以使用标准的XPath函数concat()散布这些变量到任何文本 ,这种转化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:variable name="vApos">'</xsl:variable> 
    <xsl:variable name="vQ">"</xsl:variable> 

    <xsl:template match="/"> 
     <xsl:value-of select= 
     "concat('This movie is named ', $vQ, 'Father', $vApos, 's secrets', $vQ) 
    "/> 
    </xsl:template> 
</xsl:stylesheet> 

产生

This movie is named "Father's secrets" 
1

使用& QUOT;而不是&; (通过使用&;您实际上在单引号内嵌套单引号;在嵌套时需要替换单引号和双引号,必要时转义)。

+0

'"'''',而不是'''。 – Flynn1179 2011-06-08 08:37:17

+0

是的 - 这就是要求在这一点上(它通常与XPath表达式没有什么区别)。如果由于某些特殊原因,确实需要在字符串中使用单引号,则需要以不同的方式交替单/双,如下所示: alexbrn 2011-06-08 08:41:06

+0

但我的观点是,'是提供的价值的一部分;将其更改为"会更改传递的值;这是非常不同的。这显然是程序代码,并且在某些语言中,字符串被包含在''''而不是''',如德尔福。 – Flynn1179 2011-06-08 08:43:30

3

这是一个有点棘手,但你需要反转撇号和引号,像这样:

<xsl:with-param name="callme" select='"validateInput(this,&apos;an&apos;);"' /> 

你内附一组引号内的字符串,包含它的属性值另一个。在XSLT中,只要不使用相同的引号,在两种情况下使用的引号都是可以互换的。

此前,您的&apos;正在被解析,因为正在读取match属性的值,并且它试图将select的值设置为'validateInput(this,'an');'。虽然这在技术上是一个有效的字符串值,但是当XSLT处理它时,它不能解析它,因为它试图将它作为字符串文字来读取,该字符串在an之前过早终止,因为在那里使用了与用于包含字符串。

+0

这是相当迟钝的xslt队大声笑 – Pacerier 2011-06-08 16:18:36

4

在XSLT 2.0可以将字符通过加倍它用作字符串分隔符,所以

<xsl:with-param name="callme" select="'validateInput(this,''an'');'"/> 

另一种解决方案是使用变量:

<xsl:variable name="apos">'</xsl:variable> 
<xsl:variable name="quot">"</xsl:variable> 

<xsl:with-param name="callme" select="concat('validateInput(this,', $apos, 'an', $apos, ');')"/>