Определите PHP-функцию в XSL и вызовите ее. Возможное? Как?

Как и в заголовке: возможно ли написать PHP-функцию в XSL-документе и вызвать ее потом?

У меня нет дела, где я хочу это сделать. Это просто то, что мне пришло в голову, изучая XSL.

В XSL вы можете составить что-то вроде:

<xsl:processing-instruction name="php"> ...some php... </xsl> 

Код PHP будет запущен на вашей отображаемой странице. Можно ли создать, например, PHP-функцию в инструкции по обработке и вызвать ее позже (в том же шаблоне)?

Псевдо-Sample:

 <xsl:template> <xsl:processing-instruction name="php"> ...some php processing $foo... </xsl> <xsl:variable name="foo" select="xpath/node"> <xsl:value-of select="call-php-function-with-$foo"/> </xsl> 

Я с нетерпением жду ваших решений / подходов 🙂

Крис

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

Функции можно моделировать путем вызова или применения шаблонов.

В XSLT 2.0 можно писать функции в XSLT с помощью команды <xsl:function> . Затем эти функции можно ссылаться в любом выражении XPath, которое указывается в атрибуте select любых других инструкций XSLT.

Как в XSLT 1.0, так и в XSLT 2.0 даже возможно реализовать функции более высокого порядка (HOF). Это то, что делает библиотека FXSL (полностью написанная в XSLT).

Я думаю, что выбранный ответ указывает на неправильное направление. Нет необходимости использовать FXSL, вы можете легко добавлять расширения, написанные на других языках, к XSLT – например, Jython или Javascript с Xalan, Java с большинством процессоров Java и т. Д.

Что касается PHP, если вы выполняете обработку XSLT в PHP-скрипте (в отличие от, скажем, Xalan, запускаемого из Ant или чего-то еще), то очень просто использовать XSLTProcessor :: registerPHPFunctions, который позволяет писать такие вещи, как

 $xsl = <<<EOF ... <xsl:value-of select="php:function('myFunc', . )"/> ... EOF; function myFunc( $node ) { //etc 

Конечно, только PHP-скрипт сможет обрабатывать XSL правильно.

Все это достаточно четко описано в http://www.php.net/manual/en/xsltprocessor.registerphpfunctions.php

Это можно сделать (имейте в виду Dimitre, что если он спрашивает о PHP, он почти наверняка ограничен XSLT 1.0, а FXSL не совсем то, что ему нужно).

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

Если код, который вы хотите выполнить, отличается для каждого документа, однако, он становится сложнее (т. Е. Для обработки инструкций в документах, которые вы пытаетесь обработать, которые содержат PHP, и вы хотите, чтобы сценарий XSLT при оценке вашего документа выполнял инструкции по обработке ). Попробуйте и отбросьте функции в известный набор и просто вызовите их из PHP, но если вы не можете и хотите попробовать, это до хакера.

(Я предполагаю, что вы знаете о способе экспорта PHP в XSLT: вы делаете некоторые обычные функции PHP, вы экспортируете их в скрипт XSLT, используя registerPHPFunctions, и их просто называют их функциями внутри XSLT. Это хорошо проторенный путь; проверьте документы.)

Вернемся к выполнению PHP-кода в PI вашего документа из сценария XSLT.

(Не сделал сам, но не должен быть таким трудным для реализации.) Я считаю, что это невозможно сделать за один проход. Вы должны вызывать XSLT-процессор, и всякий раз, когда вы нажимаете на PHP, который хотите запустить, <phpmarker md5ofcode="php:md5(...)"> маркерный тег (например, <phpmarker md5ofcode="php:md5(...)"> ) и передайте код обратно вызов PHP. Хакки, но потенциально пригодные для жизни, заключались бы в том, чтобы поместить его в сообщение xsl: и поймать его из пользовательского обработчика в PHP.

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

Гадкий? Да. Возможно, вы захотите объяснить, зачем вам это нужно, но должно быть возможно (через два прохода) заставить его работать.

Изменить : перечитав свой вопрос еще несколько раз, я сбиваю с толку. Вы уверены, что хотите использовать PI в своем XSLT ? PI идут в документах, объясняя, как их обрабатывать. Если PHP предназначен для использования в XSLT-файле, и это не опечатка, я думаю, что вы можете быть немного смущены, и это просто обычное приложение для регистрации php PHPPHPFunctions. Вам просто нужно поместить PHP в отдельный файл и вызвать его из XSLT, что не является огромным бременем, поскольку сценарии XSLT не должны содержать много функций, прежде чем они будут достаточно большими, чтобы разделить на два файла.