Intereting Posts
mysqli :: query (): Не удалось получить mysqli Есть ли способ отключить покрытие кода в PHPUnit для одного теста? Doctrine 2: невозможно обновить DateTime coloumn на SQL Server 2008apm mongo Ошибка PHP-приложения: Неустранимая ошибка: исключить исключение «MongoException» с сообщением «». не разрешено в ключе symfony2 + doctrine2 @ postgresql, устанавливающий схему Можно ли написать парсер электронной почты в PHP? как вернуть регулярное выражение в php вместо замены Предоставление родительской переменной PHP include () 'd Подготовленные утверждения с динамическим предложением WHERE Аутентификация, если существует учетная запись Facebook, – не хотите проходить через вход в FB PHP – получить количество страниц в документе Word Как обновить изображение на сервере через форму и отобразить его после отправки? Извлечение определенных значений из строки в виде отдельных переменных Как запустить из PHP скрипт bash под пользователем root Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым результатом MySQL

Как передать выражение XPath как параметр XSL с помощью PHP?

У меня очень большой XML-файл, из которого я извлекаю информацию и преобразую ее в другой формат XML. У меня очень хорошо работает преобразование, поэтому теперь я хотел бы сделать его более гибким, используя PHP для перехода в критерии select="" .

Ниже приведен рабочий XSLT-код, который я использую (усеченный для простоты):

 <xsl:param name="criteria" select="//Product[PublicationDate &gt; 20141231]" /> <xsl:template match="ONIXMessage"> <xsl:for-each select="$criteria"> <xsl:apply-templates select="Title"/> </xsl:for-each> </xsl:template> 

Значение $ критериев – выражение XPath, и выше это работает без проблем. Проблема в том, что когда я пытаюсь использовать PHP для передачи другого значения в критерии $:

 $proc = new XSLTProcessor; $proc->importStyleSheet( $icml ); $proc->setParameter( "", "criteria", "//Product[Imprint = 'Nightwood']"); 

Преобразование завершается неудачно, когда я использую setParameter . Я знаю, что сами выражения точны, потому что transfrom отлично работает, когда я ввожу их непосредственно в XSLT (без PHP).

Насколько я понимаю, проблема в том, что параметр передается как строка, а не как соответствующее выражение XPath, и поэтому XSLT не может разрешить select="" для набора узлов. Итак, как я могу это предотвратить? Важно передать полное выражение XPath, чтобы я мог изменить критерии для каждого из них, что бы я ни захотел.

Насколько я понимаю, проблема заключается в том, что параметр передается как строка, а не как собственное выражение XPath

Это правильная оценка. Вам нужен процессор, который может оценить строку как выражение XPath. К счастью для вас, процессор libxslt, используемый PHP, поддерживает функцию EXSLT dyn: evaluation () extension .

Без этого вам придется передать параметр в другую таблицу стилей XSLT, функцией которой было бы генерировать XSLT-стилешет, необходимый для фактического преобразования.