Определите PHP-функцию в XSL и вызовите ее.Возможный?Как? - PullRequest
4 голосов
/ 17 июля 2010

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

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

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

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

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

Псевдо-образец:

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

Я с нетерпением ждуваши решения / подходы:)

Крис

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Я думаю, что выбранный ответ указывает в неправильном направлении. Нет необходимости использовать 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

1 голос
/ 30 августа 2011

Это можно сделать (имейте в виду, что, если Димитр спрашивает о 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(...)">) и передайте код обратно вызывающему PHP.Хаки, но потенциально пригодный для использования - это поместить его в сообщение xsl: и перехватить его из пользовательского обработчика в PHP.

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

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

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

0 голосов
/ 17 июля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...