在XSL中定义PHP函数并调用它。可能?怎么样?

时间:2010-07-17 12:58:16

标签: php xml xslt transformation

与标题一样告诉:是否可以在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>

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

克里斯

3 个答案:

答案 0 :(得分:4)

我认为所选择的答案指向错误的方向。无需使用FXSL,您可以轻松地将用其他语言编写的扩展添加到XSLT - 例如Jython或带有Xalan的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

答案 1 :(得分: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。 Hacky,但可能适合居住 - 将它放在xsl:消息中并从PHP中的自定义处理程序中捕获它。

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

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

编辑:重新阅读您的问题几次,我越来越困惑。您确定要在XSLT 中使用PI 吗? PI进入文档,解释如何处理它们。如果PHP意味着要进入XSLT文件并且这不是一个错字,我想你可能会有点困惑,它只是PHP的registerPHPFunctions的普通应用程序。您只需将PHP放在一个单独的文件中并从XSLT调用它,这不是一个巨大的负担,因为XSLT脚本在大到足以分成两个文件之前不必包含很多功能。

答案 2 :(得分:-2)

在XSLT 1.0 中,无法调用以其他语言编写的函数,除非这些函数是根据扩展函数的特定XSLT处理器的要求编写的,并且在在启动转换时的可用扩展功能集。

可以通过调用或应用模板来模拟函数。

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

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