如何在带有registerPHPFunctions的XSLT中使用DOMDocumentFragment?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了如何在带有registerPHPFunctions的XSLT中使用DOMDocumentFragment?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
请参阅“它工作”和“它不起作用”部分:是我的代码错误还是DOMDocument- PHP实现的错误

如果您不熟悉xslt和registerPHPFunctions,请参阅this link for context and preparations.假设按字符串输入,

function XSL_transf($XMl,$xsl) {
         $xMLdoc = DOMDocument::loadXML($xml);
         $xsldoc = DOMDocument::loadXML($xsl);
         $PRoc = new XSLTProcessor();
         $proc->registerPHPFunctions();  // here
         $proc->importStyleSheet($xsldoc);
         echo $proc->transformToXML($xmldoc);
 }
 $xml='<root/>'; //simplest
 $xsl = <<<'EOB'
 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:PHP="http://PHP.net/xsl">
       ... HERE COPY/PASTE YOUR XSLT template ...
 </xsl:stylesheet>
 EOB;

有用

条款< xsl:copy-of ... />收到DOMElement,DOMDocument和(为什么不呢?)DOMDocumentFragment.
所以,如果我们有一个返回DOMDocument的PHP函数,我们就可以使用它.

function foo1() {
    $dom = DOMDocument::loadXML('<t> foo <tt val="123"/> bar </t>');
    return $dom; 
}

将foo1调用到模板中,

<xsl:template match="/">
   PHP foo1()=<xsl:copy-of select="PHP:function('foo1')" />
</xsl:template>

结果(您可以使用XSL_transf($xml,$xsl)来查看):

<t> foo <tt val="123"/> bar </t>

它不起作用

改变上面的功能

function foo1() {
    $dom = new DOMDocument;
    $tmp = $dom->createDocumentFragment();
    $tmp->apPEndXML('<t> foo <tt val="123"/> bar </t> test'); 
    return $tmp;
}

结果为空.没有错误消息,但没有结果.

解决方法

您可以使用以下xpath表达式解决

PHP:function('foo1')/node()

现在,这是一个PHP错误吗?还是一个libxml2错误?很难说,因为如果你看一下specifications of XPath 1.0,就找不到任何对文档片段的引用.最相似的是root node,它也是用于表示文档的节点.

我认为问题来自PHP,when it constructs the node set to be returned.它不应该返回整个文档片段节点,而是返回由其内容形成的节点集.

但是,我可能完全错了,因为我从未使用过libxml2而且我不知道它是如何工作的.

脚本宝典总结

以上是脚本宝典为你收集整理的如何在带有registerPHPFunctions的XSLT中使用DOMDocumentFragment?全部内容,希望文章能够帮你解决如何在带有registerPHPFunctions的XSLT中使用DOMDocumentFragment?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。