這是一個古老的線程,但沒有令人滿意的答案已經給出;最近我遇到了類似的情況,我相信這個解決方案已經足夠普遍適用於像這樣的問題了。從本質上講: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