Выполнение преобразования XSLT для части XML-документа, выбранного с помощью DOMXPath


Ладно это сводит меня с ума. Я пытаюсь сделать простую CMS, используя XML-файл и немного PHP. У меня есть такой 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-файл преобразуется, а не только раздел, который я выбрал с запросом. Что я здесь делаю не так?!

1 2

1 ответ:

transformToXML требуется DOMDocument, а не просто любой узел. Я предполагаю, что он делает в вашем текущем коде преобразование "документа владельца" узла, который вы передаете ему.

Попробуйте создать новый документ, затем используйте $newDoc->appendChild($newDoc->importNode($sectionXML, true)), чтобы присоединить существующий элемент к новому документу, а затем преобразовать этот документ вместо исходного.