这是一个古老的线程,但没有令人满意的答案已经给出;最近我遇到了类似的情况,我相信这个解决方案已经足够普遍适用于像这样的问题了。从本质上讲:PHP和XSLT处理器通过DOMNode
对象(参数和返回值)进行通信。因此,可以使用PHP构造一个DOMNode
对象,并根据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
方法exporteded [see php manual])将是:
/**
* @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字符串将导致<
和>
标记插入每<
和>
。
您必须将两个“动态”XML文档作为参数传递给转换。阅读您的XSLT处理器文档,了解使用什么API将外部参数传递给转换。 – 2012-07-17 12:52:19