| 
       XSLT 是一个非常方便的转换 XML 的工具,PHP 里面是通过 XSLTProcessor 来实现;XSLT 中内置了许多有用的函数,同时,只需要调用 XSLTProcessor 实例的 registerPHPFunctions 方法,我们就可以在 XSLT 中直接使用 PHP 的函数,这大大增强了 XSLT 的处理能力。 
但是,在 XSLT 中使用 PHP 函数时,很多人会遇到如下两种错误: 
(1)、Warning: XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 1 objects left on the stack. 
(2)、PHP Warning: XSLTProcessor::transformToXml(): xmlXPathCompOpEval: function function 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"> 
 
	 
 
      
      (责任编辑:admin) |