我使用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)上测试