2012-07-17 71 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;标记插入每<>