XInclude не вычисляется при преобразовании XSLT с использованием PHP
Вопрос
Я пытаюсь включить разные исходные файлы (например,file1.xml и file2.xml) и разрешите ли эти включения для преобразования XSLT с использованием PHPs XSLTProcessor
.Это мой вклад:
source.xml
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file1.xml" />
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file2.xml" />
</root>
преобразование.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:transform>
transform.php
<?php
function transform($xml, $xsl) {
global $debug;
// XSLT Stylesheet laden
$xslDom = new DOMDocument("1.0", "utf-8");
$xslDom->load($xsl, LIBXML_XINCLUDE);
// XML laden
$xmlDom = new DOMDocument("1.0", "utf-8");
$xmlDom->loadHTML($xml); // loadHTML to handle possibly defective markup
$xsl = new XsltProcessor(); // create XSLT processor
$xsl->importStylesheet($xslDom); // load stylesheet
return $xsl->transformToXML($xmlDom); // transformation returns XML
}
exit(transform("source.xml", "transform.xsl"));
?>
Мой желаемый результат таков
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- transformed contents of file1.xml -->
<!-- transformed contents of file2.xml -->
</root>
Мой текущий результат является точной копией моего исходного файла:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file1.xml" />
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file2.xml" />
</root>
Решение
Оказалось, я просто забыл одну простую, но важную строку в своем PHP-коде.Я должен был позвонить DOMDocument::xinclude
чтобы разрешить includes до завершения преобразования.
Полный пример:
<?php
function transform($xml, $xsl) {
global $debug;
// XSLT Stylesheet laden
$xslDom = new DOMDocument("1.0", "utf-8");
$xslDom->load($xsl, LIBXML_XINCLUDE);
// XML laden
$xmlDom = new DOMDocument("1.0", "utf-8");
$xmlDom->load($xml);
$xmlDom->xinclude(); // IMPORTANT!
$xsl = new XsltProcessor();
$xsl->importStylesheet($xslDom);
return $xsl->transformToXML($xmlDom);
}
exit(transform("source.xml", "transform.xsl"));
?>
Не связан с StackOverflow