在 XSLTProcessor 中 registerPHPFunctions 后无法调用 php 函数解决办法

但是,在 XSLT 中使用 PHP 函数时,很多人会遇到如下两种错误:

(1) Warning: XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 1 objects left o
n the stack.
(2)PHP Warning: XSLTProcessor::transformToXml(): xmlXPathCompOpEval: function func
tion bound to undefined prefix php in ….

 代码如下 复制代码

<?php
$xml = <<<EOB
<allusers>
 <user>
  <uid>bob</uid>
 </user>
 <user>
  <uid>joe</uid>
 </user>
</allusers>
EOB;
$xsl = <<<EOB
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
 <xsl:template match="allusers">
  <html><body>
    <h2>Users</h2>
    <table>
    <xsl:for-each select="user">
      <tr><td>
        <xsl:value-of
             select="php:function('ucfirst',string(uid))"/>
      </td></tr>
    </xsl:for-each>
    </table>
  </body></html>
 </xsl:template>
</xsl:stylesheet>
EOB;
$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);
 
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);
?>

其实,出现这种错误,是因为我们没有定义 PHP namespace ,只需要在

 代码如下 复制代码
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

中增加 xmlns:php="http://php.net/xsl" 就能解决此问题, 即

 代码如下 复制代码

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:php="http://php.net/xsl">

时间: 2024-09-06 09:05:54

在 XSLTProcessor 中 registerPHPFunctions 后无法调用 php 函数解决办法的相关文章

getview()-android getView中 position=0多次出现的解决办法

问题描述 android getView中 position=0多次出现的解决办法 适配器中的getview @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(context,R.layout.home_item,null); TextView tv = (TextView) view.findViewById(R.id.homeIt

Winxp中无法安装新字体的终极解决办法

Winxp中无法安装新字体的终极解决办法 在windows 7越来越火的今天,相信还有很多朋友对XP系统情有独钟吧?北极鱼也算是一个了,主要是由于自己都很少使用安装版软件,电脑上基本上都是一些绿色软件.并且自己制作很多绿色软件都是在xp系统下测试绿化的,结果就导致部分绿色软件在windows 7下无法使用,再加上在运行速度已经习惯问题上感觉还是XP来的顺手,所以一直还在延续着XP的使用,(双系统,平时使用在XP下,玩玩就用windows 7), 一直来用的XP好好的,不过早些天,北极鱼也算是终于

Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法

原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据UI设计更改过一些功能的,当时在Windows7下测试没有任何问题,就直接上线给用户使用了. 这两天在禅道上发现指派了一个BUG过来,描述的内容是在Windows10下安装包会出现重启后再次自动运行的问题,见鬼了,没有写过自启动注册表啊,马上打开工程查看,发现了一个很奇怪的现象,下面来介绍. 1.当

win7更新kb3045645后无法安装语言包解决办法

  win7|win8.1更新kb3045645后无法安装语言包解决办法来啦!微软5月补丁日到来,包括安全更新在内的各种Win7/Win8.1/Win10等系统的补丁如约而至.本月的安全更新级别较高,而且各个系统均有涉及,用户应该抓紧时间安装. 提醒:不过有个非安全更新却不必急于安装,那就是KB3045645. 这项更新作用于UAC(用户账户控制),安装后会增加这一安全机制的敏感程度,表现在一旦发现有自定义的 .sdb空间数据库文件被创建,就会马上提示用户. 本来加强UAC的安全性不是坏事,但k

iOS9与XCode7中不能使用http连接的快速解决办法_IOS

在Xcode7.0及以上版本中编译iOS APP时,默认会使用iOS9的一项新特性,使得所有http连接被禁用,项目里使用的API没有https支持,就悲剧了.差了官方文档,有这么一段话 App Transport Security App Transport Security (ATS) enforces best practices in the secure connections between an app and its back end. ATS prevents accident

有关easyui-layout中的收缩层无法显示标题的解决办法_jquery

easyui-layout中的收缩层无法显示标题的问题原因分析: 在easyui-layout中设置面板初始化为可以折叠,然后就发现标题还有图标都木有了 嗯,就是结果列表上面.一片空白,出现了问题就要去解决它,在网上查了资料之后呢,决定修改jquery.easyui.min.js 版本为:jQuery EasyUI 1.4.1 在5105行有_39d方法,在其中设置两个变量_Cstitle,_CsIcon添加代码如下: var _Cstitle; var _closedTitle = p.pan

php中session引起错误问题集锦与解决办法

1>错误提示  代码如下 复制代码 Warning: Cannot send session cookie - headers already sent Warning: Cannot send session cache limiter - headers already sent 问题的原因是在程序中使用session_start()时,之前已经有实际的html内容输出了.即使是echo或print一条消息了,echo或print语句所产生的输出,就是实际的html内容输出.解决此类问题的办

Nginx中提示Too Many Open Files 错误解决办法

做了点实验看了些源码,印证了自己的猜想. 对于get方法,send header+output_filter 就可以结束一次请求,因为GET方法是同步的,nginx会在handler返回之后的步骤中关闭链接,但对于post方法,由于nginx是使用异步的方式处理post数据,因此必须显式的关闭链接.  nginx的content handler同步返回后会调用ngx_http_finalize_request,在这个函数里,如果handler返回值为ngx_done则会直接ngx_http_fi

360打补丁后系统无法启动的解决办法

今天用360按提示给win7打了下补丁,真的很伤:提示重启后安装补丁,再次进行系统时Windows Update开始配置,但是到32%时就卡哪不动了 按电源关机后,使用360提供的启动项进入时,仍旧卡在32%不动.吃饭时间打个补丁,上班时却进不去系统,真是伤啊 下面说说我解决办法: 开机先按Enter(thinkpad的interrupt normal 的键,本子不同,按键可能也会不同),然后按F8进行安全模式,这个可以进系统. 在系统中使用Services.msc禁用掉Windows upda