2011-01-07 13 views
3

Ich arbeite an einer Vorlage-Engine, die von regex-DOM zu DOM-getriebene migriert hat. Es scheint jedoch, dass jedes Mal, wenn ich eine DomDocumentFragment erstellen, um einen Teil eines Dokuments vorübergehend einzukapseln, das Namespace-Attribut jedem Knoten im Fragment hinzugefügt wird. Da mein Standard-Namespace für ein bestimmtes Dokument zu 99% XHTML ist, fügt es die XHTML-Namespace-Deklaration hinzu.Mit Dom Objects in PHP, der Standard-Namespace ist in einigen Knoten redeclariert

Da dies der Standard-Namespace ist, scheint dies fruchtlos zu sein, und letztendlich werden Knoten in einem anderen Namespace sowieso zur Renderzeit entfernt.

Abgesehen von der iterativen Entfernung von Namespace-Attributen gibt es eine Möglichkeit, wie ich verhindern kann, dass dies von vornherein geschieht? Es ist ziemlich problematisch, da dies die Dateigröße der Renderzeit beträchtlich erhöhen wird, da große Teile eines gegebenen Dokuments in einem Fragment gespeichert werden können.

Ich habe versucht $doc->normalizeDocument(), aber wie ich annahm, tat es nichts.

+1

ich dieses Verhalten auch gesehen habe, und andere daran erinnern, zu erklären, dass das Dokument Fragment ungültig ohne den Namensraum sein würde. Nie gehört, wie man es entfernt, nachdem ich das Fragment das größere "Eltern" Dokument hinzugefügt habe. Namespaces sind Overkill, ein großer Schmerz, und fügen keinen greifbaren geschäftlichen Wert hinzu. –

Antwort

2

Je nach Toleranz für zusätzliche Berechnung zu lösen, was meist ist ein ästhetisches Problem (ich sage meist, da ich es damit einverstanden ist, nehmen besonders viel Platz für nichts, aber anders als das ist OK), könnten Sie führen Sie Ihre gesamter XML-Code über eine XSL-Identitätsvorlage.

Ich hatte ein voll funktionsfähiges Beispiel zu schreiben, um sicherzustellen, dass die Technik funktioniert in der Tat Arbeit:

<?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()) . "</pre>"; 
echo "<h1>After:</h1>"; 
echo "<pre>" . htmlentities($resultDocument->saveXML()) . "</pre>";