2012-07-17 69 views
1

我需要通過集成一些XML文件來生成主XML文件。如果我們在磁盤上某處存儲了不同的子XML文件,就可以實現這一點。但在我的情況下,子XML文件是動態的XML數據。它們不是存儲在任何地方,而是動態生成的。那麼我如何插入這些子XML數據來生成一個主XML文件。如何使用XSLT從PHP插入xml數據(作爲變量)

我的輸入是:

<root> 
    <element id="1"> 
    </element> 
    <element id="2"> 
    </element> 
</root> 

我的輸出將是:

<root> 
    <element id="1"> 
     <section> 
     <record>12</record> 
     </section> 
    </element> 
    <element id="2"> 
     <section> 
      <input>menu</input> 
     </section> 
    </element> 
</root> 

在這裏,在上述輸出的XML數據(<section><record>12</record></section>)應來自PHP變量。

+0

您必須將兩個「動態」XML文檔作爲參數傳遞給轉換。閱讀您的XSLT處理器文檔,瞭解使用什麼API將外部參數傳遞給轉換。 – 2012-07-17 12:52:19

回答

0

您必須將兩個「動態」XML文檔作爲參數傳遞給轉換。

每個「動態文檔」應該已經被解析爲一個XML文檔(在其他XSLT處理器API中有一種方法 - 例如XmlDocument.LoadXml()),它接受一個字符串並將其解析爲XML並創建一個(已解析)XML文件)。

閱讀您的XSLT處理器文檔,瞭解使用什麼API傳遞外部參數轉換

+0

感謝您的快速回復。你能解釋一下上面情況的例子嗎? – user806444 2012-07-17 13:24:57

+0

@ user806444:我不知道PHP。您是否對使用C#和.NET XslCompiledTransform XSLT處理器的示例感興趣? – 2012-07-17 13:27:59

+0

是的,我有興趣在C#中看到代碼。我已經在php中完成了。但在輸出中,我在輸出中獲得了帶有xml標籤的數據。我怎樣才能顯示XML文件與XML標籤?請幫助我。 – user806444 2012-07-17 14:31:55

0

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