对使用DOMXPath选择的XML文档的一部分执行XSLT转换



好吧,这让我抓狂。我正在尝试使用XML文件和一些PHP制作一个简单的CMS。我有一个像这样的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<sections>
<section name="about">
<maintext>
<p>Here is some maintext. </p>
</maintext>
</section>
<section name="james">
<maintext>
<p>Zippidy do.</p>
</maintext>
</section>
</sections>

然后是XSL文件:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="section">
<div class="section">
<xsl:apply-templates />
</div>  
</xsl:template>
<xsl:template match="maintext">
<xsl:copy-of select="child::node()" />
</xsl:template>
</xsl:stylesheet>

这种转换效果很好——我得到了几个简单的段落:

<p>Here is some maintext. </p>      
<p>Zippidy do.</p>

然而,我现在有一个PHP文件,它应该查询XML,根据它的GET参数取一个特定的"节"。然后只对XML的这一部分运行转换,并返回结果。

<?php
$sectionName = $_GET["section"];
$content = new DOMDocument();
$content->load("content.xml");
$transformation = new DOMDocument();
$transformation->load("transform-content.xsl");
$processor = new XSLTProcessor();
$processor->importStyleSheet($transformation);
$xpath = new DOMXPath($content);
$sectionXML = $xpath->query("section[@name='".$sectionName."']")->item(0);
echo $processor->transformToXML($sectionXML);
?>

问题是,无论我做什么,整个XML文件都会被转换,而不仅仅是我用查询选择的部分。我在这里做错了什么?!

transformToXML需要一个DOMDocument,而不仅仅是任何节点。我想它在您当前代码中所做的是转换您传递它的节点的"所有者文档">

尝试创建一个新文档,然后使用$newDoc->appendChild($newDoc->importNode($sectionXML, true))将现有元素附加到新文档中,然后转换此文档而不是原始文档。

最新更新