2011-06-08 73 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, ');')"/>