Как передать строку, содержащую одинарные и двойные кавычки в качестве параметра в XSLT в PHP? - PullRequest
4 голосов
/ 29 апреля 2010

У меня есть простой код XSLT на основе PHP, который выглядит следующим образом:

$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.

Спасибо, Боаз

Ответы [ 5 ]

1 голос
/ 29 мая 2013

Это было зарегистрировано как ошибка:

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

Комментарий:

Этот недостаток связан с тем, что XPath 1.0 не предоставляет механизм экранирования символов, поэтому у PHP нет простого способа выразить строку, содержащую оба типа кавычек. XPath 1.0, тем не менее, предоставляет функцию для объединения строк. Используя concat (), строка, состоящая из двух символов "", может быть выражена как concat ('","' "). concat () принимает 2 или более аргумента.

Включает следующие обходные пути:

Таким образом, пока вы чередуете стиль цитирования, вы можете выражать строку, содержащую любое количество кавычек обоих типов.

Другое решение - заменить все прямые кавычки одинарными:

$t = str_replace( "\"", "''", $t );
$xsltEngine->setParameter( "some-text", $t );
0 голосов
/ 22 февраля 2018

Как указано в одном из ответов, это ошибка. Следовательно, вы не можете пропустить обе кавычки.

Но вы можете заменить двойную кавычку другим символом, а затем использовать 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> 
0 голосов
/ 16 декабря 2015

Это работает для меня, чтобы заменить одинарные кавычки на специальные символы HTML, используя str_replace

$t = str_replace("'", "&#39;", $t);  
$xsltEngine->setParameter( "some-text", $t );
0 голосов
/ 11 мая 2010

Вы можете использовать &apos; для экранирования одинарных кавычек:

$searchterms = '"some" text&apos;s quotes are mixed.'
0 голосов
/ 29 апреля 2010

если ваш окончательный вывод - HTML, вы можете попробовать htmlencoding. Пока объекты заданы в таблице стилей, все должно быть в порядке

...