2010-07-17 1 views
4

Как и в названии: возможно ли написать 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> 

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

Крис

+0

Если вы используете XSL для шаблона, я хотел бы предложить вам использовать Smarty вместо. Он имеет лучшую производительность, и вы можете выполнить PHP в шаблоне. http://www.smarty.net/ – HoLyVieR

+2

Это действительно не помогает нам обсуждать эту тему. Речь идет о XSLT. Я не знаю умного, но, как я вижу при первом впечатлении, это нечто совершенно другое. Благодарю вас. – ChrisBenyamin

+0

Хороший вопрос (+1). См. Мой ответ для объяснения и возможных альтернативных решений. –

ответ

-2

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

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

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

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

+0

@fritzfromlondon: Да, ваш комментарий подтверждает то, что вы находите столь странным в этом ответе - 'php: function()' является * расширением функции * и не написано в XSLT. –

+1

Я думаю, что этот ответ неверен - вы сами признаете, что можно использовать функции расширения. Это можно сделать и на PHP. Для справки я дал несколько указателей в отдельном ответе ниже. – gotofritz

+0

Ах, извините @ Dimitre Новаччи, не понимал, что вы переполировали, переписывал мой комментарий.Я думаю, что это излишне педантично - ChrisBenyamin просто хотел использовать некоторую функцию PHP в своем XSLT, я не думаю, что он заботится о том, являются ли они расширением или нет. – gotofritz

1

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

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

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

(Предполагаю, что вы знаете о способе экспорта PHP в XSLT: вы выполняете некоторые обычные функции PHP, вы экспортируете их в скрипт XSLT, используя registerPHPFunctions, и их просто называют их функциями внутри XSLT. -trodden path, проверьте документы.)

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

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

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

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

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

+0

Николас Уилсон, я вижу ваше замешательство. 1). В XSLT 1.0 нельзя писать * функции * (написанные в XSLT). В XSLT 2.0 и выше есть такая возможность, используя инструкцию 'xsl: function'; 2) FXSL имеет версии * оба * для XSLT 1.0 и XSLT 2.0. В своем ответе я упоминаю, что OP может использовать FXSL (как и любой другой, кто использует XSLT 1.0). –

4

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

Что касается PHP, если вы выполняете обработку XSLT в скрипт, (в отличие от, скажем, 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

+0

fritzfromlondon: вам нужно хорошо прочитать выбранный ответ - на самом деле он говорит, что такие функции можно писать, если это соответствует правилам написания функций расширения. Пожалуйста, отредактируйте свой ответ и удалите неверный оператор в первом предложении. –

 Смежные вопросы

  • Нет связанных вопросов^_^