Используя Dom Objects в PHP, пространство имен по умолчанию переименовано в некоторых узлах - PullRequest
3 голосов
/ 07 января 2011

Я работаю над механизмом шаблонов, мигрировав с регулярных выражений на DOM.Тем не менее, кажется, что всякий раз, когда я создаю DomDocumentFragment для временной инкапсуляции некоторой части документа, атрибут пространства имен добавляется к каждому узлу во фрагменте.Поскольку мое пространство имен по умолчанию для данного документа в 99% случаев будет XHTML, оно добавляет объявление пространства имен XHTML.

Будучи пространством имен по умолчанию, это кажется бесплодным, и в конечном итоге узлы в любом другом пространстве имен будут удаленыв любом случае во время рендеринга.

Помимо итеративного удаления атрибутов пространства имен, есть ли способ предотвратить возникновение этого с самого начала?Это довольно проблематично, так как это, вероятно, значительно увеличит размер файла рендеринга, так как большие части данного документа могут храниться во фрагменте.

Я пробовал $doc->normalizeDocument(), но, как я предполагал, он ничего не сделал.

1 Ответ

2 голосов
/ 08 июня 2012

В зависимости от вашего допуска к дополнительным вычислениям для решения, в основном, эстетической проблемы (я говорю в основном , поскольку я согласен, что это занимает дополнительное место ни для чего, но кроме этого все в порядке), вы может выполнить весь ваш XML через шаблон идентификации XSL.

Мне пришлось написать полностью функциональный пример, чтобы убедиться, что техника действительно работает:

<code><?php

$xmlIdentityTemplate = '<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>';

$xmlExample = '<?xml version="1.0"?>
<ns1:root xmlns:ns1="urn:ns1" xmlns:ns2="urn:ns2">
    <ns1:node1>
        <ns2:subnode1 xmlns:ns2="urn:ns2">node1 subnode1</ns2:subnode1>
        <ns2:subnode2 xmlns:ns2="urn:ns2">node1 subnode2</ns2:subnode2>
        <ns2:subnode3 xmlns:ns2="urn:ns2">node1 subnode3</ns2:subnode3>
        <ns2:subnode4 xmlns:ns2="urn:ns2">node1 subnode4</ns2:subnode4>
    </ns1:node1>
    <ns1:node2>
        <ns2:subnode1 xmlns:ns2="urn:ns2">node2 subnode1</ns2:subnode1>
        <ns2:subnode2 xmlns:ns2="urn:ns2">node2 subnode2</ns2:subnode2>
        <ns2:subnode3 xmlns:ns2="urn:ns2">node2 subnode3</ns2:subnode3>
        <ns2:subnode4 xmlns:ns2="urn:ns2">node2 subnode4</ns2:subnode4>
    </ns1:node2>
</ns1:root>';

$originalDocument = new DOMDocument();
$originalDocument->loadXML($xmlExample);

$xslDocument = new DOMDocument();
$xslDocument->loadXML($xmlIdentityTemplate);

$processor = new XSLTProcessor();
$processor->importStyleSheet($xslDocument);
$resultDocument = $processor->transformToDoc($originalDocument);

echo "<h1>Before:</h1>";
echo "<pre>" . htmlentities($originalDocument->saveXML()) . "
"; echo "

После:

"; echo "
" . htmlentities($resultDocument->saveXML()) . "
";
...