将xml节点复制到另一个节点

时间:2016-08-04 09:49:43

标签: php xslt xpath

我是XML PHP和XPATH的新手。

我有一个XML文件如下

<?xml version="1.0" encoding="UTF-8"?>
<sections>
	<section name="Windows 7" id="7">
			<section name="Registry" id="29">
				<section name="hkcu" id="30">
					<section name="software" id="31">
					</section>
				</section>
			</section>
	</section>
	<section name="Server 2012" id="33">
	</section>
</sections>

我可以删除一个节点即。 <section>或添加<section>。 我正在努力的是有一种方法将节点及其子节点移动到另一个节点IE部分。 例如,移动ID =“30”的部分,并将其子节点改为ID =“33”的部分。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

XSLT旨在转换XML文档。它使用样式表描述从输入XML文档到输出文档的转换。

E.g。以下转型

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" encoding="UTF-8" method="xml" indent="yes" />
<xsl:strip-space elements="*"/>

  <!-- identity transformation -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
  <!-- remove section with id 30 -->
  <xsl:template match="section[@id='30']"/>
  <!-- copy section with id 33 and add (as a child) section with id 30 -->
  <xsl:template match="section[@id='33']">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
      <xsl:copy-of select="//section[@id='30']"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

会将您的输入文件转换为:

<?xml version="1.0"?>
<sections>
  <section name="Windows 7" id="7">
    <section name="Registry" id="29">
    </section>
  </section>
  <section name="Server 2012" id="33">
    <section name="hkcu" id="30">
      <section name="software" id="31">
        </section>
    </section>
  </section>
</sections>

XPath和XSLT需要一些学习才能开始,但是一旦你掌握了它,就会有一个通用的工具来随时转换XML文档。

另外,在PHP中运行XSLT(确保在.ini文件中启用 extension = php_xsl.dll extension = php_xsl.so )将输出一个字符串XML值,该值可以转储到文件中或回显到屏幕:

// LOAD XML AND XSL FILES
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');

$xslfile = new DOMDocument('1.0', 'UTF-8');
$xslfile->load('XSLTSCript.xsl');

// TRANSFORM XML with XSLT
$proc = new XSLTProcessor;
$proc->importStyleSheet($xslfile); 
$newXML = $proc->transformToXML($xml);

# ECHO OUTPUT STRING
echo $newXML;