2016-05-25 11 views
0

Ich verarbeite diese XML-Datei:XSLT fügt unnötige Namespaces hinzu, wie man sie los wird?

<z/> 

dieses XSLT 2.0 Stylesheet:

<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
    xmlns = "http://www.w3.org/1999/xhtml" 
    xmlns:html = "http://www.w3.org/1999/xhtml" 
    xmlns:data = "http://portonvictor.org/ns/misc" 
    version = "2.0" 
    exclude-result-prefixes = "data html"> 

    <xsl:template match="/"> 
    <xsl:variable name="x"> 
     <data:doc> 
     <xsl:copy-of select="*"/> 
     </data:doc> 
    </xsl:variable> 
    <xsl:copy-of select="$x/*/*"/> 
    </xsl:template> 

</xsl:stylesheet> 

Befehlszeile:

saxonb-xslt -xsl:error.xslt -s:error.xml 

Die resultierende Ausgabe ist:

<?xml version="1.0" encoding="UTF-8"?><z xmlns:data="http://portonvictor.org/ns/misc"/> 

Es enthält unnötig xmlns:data Namensraum (auch wenn ich exclude-result-prefixes habe). Was ist der einfache Weg, um solche unnötigen Namespaces loszuwerden?

Das obige Spielzeugbeispiel ist eine vereinfachte real code of my free program, wo ich eine Eingabe XHTML-Datei in mehreren Stufen verarbeiten, zuerst <data:doc> Elemente erstellen und dann verarbeiten.

Antwort

1

Nun, Ihre $x Variable enthält ein Element im xmlns:data="http://portonvictor.org/ns/misc" Namespace - und das Element, das Sie kopieren, ist ein Nachkomme dieses Elements.

Wenn Sie ein Element kopieren, kopieren Sie auch alle Namespaces, die für dieses Element gelten.

Sie werden ein anderes Ergebnis sehen, wenn Sie ändern:

<xsl:copy-of select="$x/*/*"/> 

zu:

<xsl:copy-of select="$x/*/*" copy-namespaces="no"/> 

nicht sicher, wie gut diese auf Ihr eigentliches Problem gilt.

+0

Ich habe versucht, mein XSLT-Skript mit 'copy-namespaces =" no "umzuschreiben, wo immer es sinnvoll erscheint. Das hat nicht geholfen. Bitte nehmen Sie an der Entwicklung dieses kostenlosen Dienstprogramms teil, das für die Community nützlich ist. – porton

+0

Mein "realer Code" generiert überflüssige Namespaces, selbst wenn ich 'copy-namespaces =" no "' zu ** jedem * 'xsl: copy' und' xsl: copy-of' Element hinzufüge. – porton

+0

Oh, es funktioniert, nur ich Idiotisch schrieb 'copy-namespaces =" yes "' anstelle von 'copy-namespaces =" no "' – porton

Verwandte Themen