2

我需要通过集成一些 XML 文件来生成主 XML 文件。如果我们将不同的子 XML 文件存储在磁盘上的某个位置,则可以实现此目的。但在我的例子中,子 XML 文件是动态 XML 数据。它们不存储在任何地方,而是动态生成。那么如何插入这些子 XML 数据以生成主 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 data( <section><record>12</record></section>) 应该来自 PHP 变量。

4

3 回答 3

0

这是一个旧线程,但没有给出令人满意的答案;最近我遇到了类似的情况,我相信该解决方案足以适用于此类问题。

本质上: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插入&lt;和标签。&gt;<>

于 2013-05-02T22:12:49.000 回答
0

您必须将两个“动态”XML 文档作为参数传递给转换

每个“动态文档”都应该已经被解析为 XML 文档(在其他 XSLT 处理器 API 中,有一个方法——例如XmlDocument.LoadXml()——接受一个字符串并将其解析为 XML 并创建一个(解析的)XML 文档)。

阅读您的 XSLT 处理器文档以了解用于将外部参数传递给转换的 API

于 2012-07-17T12:55:29.937 回答
0

我仍然想知道你想从 php 中得到什么我认为你可以重新打印并在循环中抛出类似下面的内容,但我很高兴进一步挖掘到使用动态 xml 生成来制作网站前端的点。在此页面中通过切换值更改 scalors 选项的作用在 php 中是不同的,有很多可以做的,请进一步告诉我你想要什么

<?php
$i=1;
$option = "default";
$elemental = 1;
$StrRecord = "12";
$StrInput = "menu";
$domdoc = new DOMDocument();
$domdoc->preserveWhiteSpaces = false;
$domdoc->load(realpath('xmlfile.xml'));
$root = new DOMElement('root');
$element = new DOMElement('element');
$section = new DOMElement('section');
$record = new DOMElement('record', $StrRecord);
$elementi = new DOMElement('element');
$sectioni = new DOMElement('section');
$inputi = new DOMElement('input', $StrInput);
$elementid= new DOMAttr('id', $elemental+1);
$elementidi= new DOMAttr('id', $elemental+1);

$domdoc->appendChild($root);
$root->appendChild($element);
$element->appendChild($section);
$section->appendChild($record);
$root->appendChild($elementi);
$elementi->appendChild($sectioni);
$sectioni->appendChild($inputi);
$sectioni->appendChild($inputi);
$element->appendChild($elementid);
$elementi->appendChild($elementidi);
$domdoc->formatOutput = true;
$domdoc->save('xmlfile.xml');

$xmldoc= new DOMDocument();
$xmldoc->load(realpath('xmlfile.xml'));
$xpath = new DOMXpath($xmldoc);

switch($option){
case "record":
$query = ('/root/element/section/record');
break;
case "input":
$query = ('/root/element/section/input');
break;
case "default":
$query = ('/root/element[@id="'. $i.'"]/');
break;
}
$nodeList = $xpath->query($query);
foreach($nodeList as $node){
echo($node->nodeValue);
}
?>
于 2020-01-17T16:30:49.353 回答