5

就像标题所说的那样:是否可以在 XSL 文档中编写 PHP 函数并在之后调用它?

我没有案例,我想在哪里做。这只是我在学习 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>

我期待您的解决方案/方法:)

克里斯

4

3 回答 3

4

我认为选定的答案指向错误的方向。无需使用 FXSL,您可以轻松地将用其他语言编写的扩展添加到 XSLT - 例如带有 Xalan 的 Jython 或 Javascript,带有大多数 Java 处理器的 Java 等。

至于 PHP,如果您在 PHP 脚本中进行 XSLT 处理(而不是从 Ant 或其他东西中运行 Xalan),那么使用 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

于 2012-03-25T20:34:03.610 回答
1

可以做到(请记住 Dimitre,如果他询问 PHP,他几乎可以肯定仅限于 XSLT 1.0,而 FXSL 并不是他所追求的)。

首先,如果您打算自己编写 PHP,并将其用作文档处理流程的一部分,那么这可能是一个糟糕的语言选择。如果您只想使用您自己的一些 PHP 函数或有用的库函数(如 preg_replace)稍微扩展 XSL 的功能,因此您可以从您的 XSLT 中调用它们,如果您知道那些是绝对没问题的是事先准备好的:您将 PHP 函数导出到 XSLT,然后从那里调用它们。

但是,如果您要执行的代码对于每个文档都不同,那么它会变得更加困难(即,对于您尝试处理的包含 PHP 的文档中的处理指令,并且您希望在评估文档时使用 XSLT 脚本来执行处理指令)。尝试将这些函数分解为一个已知集合,然后从 PHP 中调用它们,但如果你不能并且仍然想尝试,那就是hackery。

(我假设您知道 PHP 将函数导出到 XSLT 的方式:您制作了一些普通的 PHP 函数,使用 registerPHPFunctions 将它们导出到 XSLT 脚本,然后它们只是将它们作为 XSLT 中的函数调用。这是一条老路;检查文档。)

回到从 XSLT 脚本执行文档 PI 中的 PHP 代码。

(我自己没有做过,但实施起来应该不那么难。)我相信不可能一次性完成。您必须调用 XSLT 处理器,并且每当您点击要运行的 PHP 时,放入一个标记标签(例如<phpmarker md5ofcode="php:md5(...)">)并将代码传回给调用 PHP。哈克,但可能适合生活的方法是将它放在 xsl:message 中,并从 PHP 中的自定义处理程序中捕获它。

第一次运行结束后,对字符串进行一些操作,围绕您抓取的每个代码块创建一个包装函数,评估该字符串以创建函数,将它们导出到 XSLT 引擎,然后使用第二个 XSLT 脚本重新调用它将捕获标记节点,并在其内容上调用 PHP。

丑陋的?是的。你可能想解释为什么你会想要它,但它应该是可能的(通过两次)让它工作。

编辑:再读了几次你的问题,我越来越困惑。您确定要在您的 XSLT中添加 PI吗?PI 进入文档,解释如何处理它们。如果 PHP 打算放在 XSLT 文件中并且这不是拼写错误,我想你可能会有点困惑,它只是 PHP 的 registerPHPFunctions 的普通应用程序。您只需将 PHP 放在一个单独的文件中并从 XSLT 调用它,考虑到 XSLT 脚本在大到足以拆分为两个文件之前不必包含太多功能,这并不是一个巨大的负担。

于 2011-08-30T12:30:45.943 回答
-2

在 XSLT 1.0中,不可能调用用另一种语言编写的函数,除非这些函数是按照特定 XSLT 处理器对扩展函数的要求编写的,并且在启动转换时在可用扩展函数集中指定。

可以通过调用或应用模板来模拟功能。

在 XSLT 2.0中,可以使用指令在 XSLT中编写函数。<xsl:function>然后可以在select任何其他 XSLT 指令的属性中指定的任何 XPath 表达式中引用这些函数。

在 XSLT 1.0 和 XSLT 2.0中,甚至可以实现高阶函数(HOF)。这就是FXSL 库(完全用 XSLT 编写)所做的。

于 2010-07-17T16:07:11.263 回答