2010-04-29 97 views
4

我有一個簡單的基於PHP的XSLT trasform代碼看起來像這樣:如何將包含單引號和雙引號的字符串作爲參數傳遞給PHP中的XSLT?

$xsl = new XSLTProcessor(); 
$xsl->registerPHPFunctions(); 
$xsl->setParameter("","searchterms", $searchterms); 
$xsl->importStylesheet($xslDoc); 
echo $xsl->transformToXML($doc); 

的代碼將變量$ searchterms,其中包含一個字符串,作爲參數傳遞給它輪流使用它的XSLT樣式表爲文本:

<title>search feed for <xsl:value-of select="$searchterms"/></title> 

,直到你試圖傳遞一個字符串與它混合這工作得很好,說:

$searchterms = '"some"'." text's quotes are mixed." 

在這一點上XSLT處理器的尖叫聲:

無法創建XPath表達式(字符串 同時包含引號和雙引號)

什麼是安全通過任意的字符串輸入到XSLT正確的方法是什麼?請注意,這些字符串將在結果XML中用作文本值,而不是XPATH參數。

感謝, 波阿斯

+0

addslashes可能會工作的u ..在添加它之前.. – 2010-04-29 12:35:45

回答

0

如果你的最終輸出是HTML,你可以嘗試htmlencoding它。只要實體在樣式表設置應該確定

0

你可以使用&apos;逃脫單引號:

$searchterms = '"some" text&apos;s quotes are mixed.' 
1

這已被記錄爲一個錯誤:

https://bugs.php.net/bug.php?id=64137

這評論:

這個缺點來自XPa的事實th 1.0沒有提供轉義字符的機制,所以PHP沒有直接的方式來表達一個包含兩種引號的字符串。不過,XPath 1.0提供了一個連接字符串的函數。使用concat(),由兩個字符「''組成的字符串可以表示爲concat('」',「'」)。 concat()需要2個或更多參數。

包括以下解決方法:所以只要你交替引用風格

,你可以表達包含任意數量的兩種類型的引號的字符串。

另一種方案是用單引號替換所有直引號:

$t = str_replace("\"", "''", $t); 
$xsltEngine->setParameter("some-text", $t); 
0

這工作對我來說,使用替換HTML特殊字符單引號str_replace

$t = str_replace("'", "&#39;", $t); 
$xsltEngine->setParameter("some-text", $t); 
0

正如其中一個答案所示,這是一個錯誤。因此,您無法傳遞兩個引號。

但是,您可以用另一個字符替換雙引號,然後使用translate恢復原始。

要選擇的主要內容是不會出現在您的文字上的字符。例如\x7F

$xsl = new XSLTProcessor(); 
$xsl->registerPHPFunctions(); 
$xsl->setParameter("","searchterms", strtr($searchterms, '"', "\x7F")); 
$xsl->importStylesheet($xslDoc); 
echo $xsl->transformToXML($doc); 

<title>search feed for <xsl:value-of select="translate($searchterms, '&#x7F;', '&quot;')"/></title> 

此外,您不能使用HTML實體,因爲他們正在逃跑。

或者使用disable-output-escaping="yes"

<title>search feed for <xsl:value-of select="$searchterms" disable-output-escaping="yes"/></title> 

$xsl->setParameter("","searchterms", htmlspecialchars($searchterms)); 

您可以使用內置的表達式第一種方法。例如:

<title attr="foo {translate($searchterms, '&#x7F;', '&quot;')} bar">bazz</title> 
相關問題