从PHP函数发送节点集合到XSL


Sending node collection to XSL from PHP function

我使用PHP XML和XSL生成文档。如果您熟悉PHP实现,您可能知道XSL函数tokenize(string,pattern)不可用。我尝试在PHP中实现这个函数这样它就可以在XSL中调用,像这样

<xsl:value-of select="php:function('tokenize','aaa bbb ccc',' ')[last()]"/>

应该生成'ccc'

问题是我找不到一种方法将由简单字符串组成的节点集合返回到XSL中。当我尝试发送DOMNodeList时,我得到"PHP对象不能转换为xpath字符串"错误。在PHP中编写XSL扩展函数的技术在PHP手册中没有文档。有什么大师能解释一下吗?

这是我目前的工作。我可以在XSL

中执行以下操作
<xsl:value-of select="php:function('tokenizeIntoXML',$stop_at_class,' ')/node()[last()]"/>

使用PHP函数

   function tokenizeIntoXML($string, $delimiter)
   {
       $ret = null;
       $toks =  explode($delimiter, $string);
       if(!empty($toks))
       {
            $xml = new DomDocument();
            $xml -> loadXML("<result/>");
            foreach($toks as $t)
            {
                $xml -> documentElement -> appendChild(new DOMText($t));
            }
            return $xml -> documentElement;
       }
       return $ret;
   }

False,如果您为exslt包含相应的名称空间,您实际上可以使用这里描述的tokenize。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://exslt.org/strings"> <!-- here -->
    <xsl:output
        method="xml"
        omit-xml-declaration="yes"
        media-type="text/html"
        encoding="UTF-8"
        indent="yes"
    />

    <xsl:template match="/">
        <xsl:value-of select="fn:tokenize('a,b,c', ',')"/>
    </xsl:template>
</xsl:stylesheet>

在win764 XAMPP (apache2.2 php5.3)上测试