这是一个旧线程,但没有给出令人满意的答案;最近我遇到了类似的情况,我相信该解决方案足以适用于此类问题。
本质上:PHP 和 XSLT 处理器通过DOMNode
对象(参数和返回值)进行通信。因此,可以DOMNode
使用 PHP 构造一个对象,并根据 XSLT 处理器的请求将其返回。
鉴于上述示例,我们将拥有以下 XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:template match="/root">
<root>
<xsl:apply-templates select="element" />
</root>
</xsl:template>
<xsl:template match="element">
<element>
<!-- Pass the selected id attributes to a PHP callback,
then literally include the XML as returned from PHP.
Alternatively, one could use xsl:apply-templates
to further transform the result. -->
<xsl:copy-of select="php:function('xslt_callback', @id)" />
</element>
</xsl:template>
</xsl:stylesheet>
并且 PHP 函数(这个函数应该使用registerPHPFunctions
方法 [参见 php 手册] 导出)将是:
/**
* @param DOMAttr[] $attr_set An array of DOMAttr objects,
* passed by the XSLT processor.
* @return DOMElement The XML to be inserted.
*/
function xslt_callback ($attr_set) {
$id = $attr_set[0]->value;
return new DOMElement('section', $id); //whatever operation you fancy
}
生成以下 XML:
<root>
<element>
<section>1</section>
</element>
<element>
<section>2</section>
</element>
</root>
php 函数xslt_callback
可以对选定的 id 做任何事情。我们假设在此示例中$attr_set
始终只包含一个选定的属性。根据具体情况,建议执行一些范围或类型检查;然而,在这里,这只会使示例骨架不必要地复杂化。
注意:简单地从 PHP 返回一个 XML 字符串将导致为每个and插入<
和标签。>
<
>