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

时间:2011-09-19 19:55:49

标签: php xml xslt

我使用PHP XML和XSL生成文档。如果您熟悉PHP实现,您可能知道XSL函数 tokenize(字符串,模式)不可用。我试图在PHP中实现该功能,以便可以在XSL中调用它,如此

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

应生成'ccc'

问题是我找不到将简单字符串组成的节点集合返回到XSL的方法。当我尝试发送DOMNodeList时,我得到“一个PHP对象无法转换为XPath-string”错误。 PHP手册中没有记录在PHP中编写XSL扩展函数的技术。有些大师可以对此有所了解吗?

这是我目前的工作。我能够在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;
   }

1 个答案:

答案 0 :(得分:0)

错误,如果你为exslt包含相应的命名空间,你实际上可以使用here描述的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)上测试