2017-11-10 6 views
1

Ich habe die folgende XML (Datei: emcsh.xml):gesamte Knoten eines XML ohne 'xmlns = ""'

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<?xml-stylesheet type="text/xsl" href="tohtml.xsl"?> 
... 
<root> 
    <el> 
    <d>Some text with <kbd>code</kbd> and <em>prose</em>.</d> 
    </el> 
</root> 

mit der folgenden Transformation (file: tohtml.xsl):

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml"> 
... 
<xsl:template match="d"> 
    <xsl:copy-of select="node() | @*"/> 
</xsl:template> 
... 
<xsl:if test="d"> 
    <div class="tipper"> 
    <xsl:apply-templates select="d"/> 
    </div> 
</xsl:if> 

Nach Dateien mit der folgenden Rohrverarbeitung:

$ xsltproc tohtml.xsl emcsh.xml > emcsh.html && xmllint --format emcsh.html -o emcsh.html 

der resultierende String ist:

... 
<div class="tipper"> 
    Some text with <kbd xmlns="">code</kbd> and <em xmlns="">prose</em>. 
</div> 
... 

Fast perfekt, aber wie kann ich tun, um die Transformation ohne das leere Attribut xmlns=""?

Danke.

+1

Bitte zeigen Sie uns minimal, aber vollständige Proben uns zu erlauben, das Problem zu reproduzieren, müssen wir alle Namespace-Deklarationen in dem Eingang und dem Stylesheet sehen. –

+0

Im Allgemeinen diese Deklarationen 'xmlns =" ​​"passieren, wenn Sie ein Element in keinen Namespace (wie Ihr' d' Element aus der Eingabe) in ein Element in einem bestimmten Namespace (ich denke, Ihr 'div' Element wird in einige eingefügt) Namespace durch eine Namespace-Deklaration im Stylesheet, die Sie nicht angezeigt haben). Um zu beheben, dass Sie entscheiden müssen, ob Sie alle Elemente in keinem Namespace oder in einem bestimmten Namespace haben möchten, müssen Sie Ihren Namespace hinzufügen, wenn Sie möchten, dass ein Namespace und Ihr Eingabeelement keinen Namespace haben. –

+0

@MartinHonnen Verbesserte Beispiele. –

Antwort

1

Dies geschieht, weil der Standard-Namespace Ihrer XSLT http://www.w3.org/1999/xhtml ist und das bedeutet, dass literale Elemente (wie die <div> dort) in diesem Namespace sein werden.

Wenn es die <kbd> kopiert, die sich in einem Null-Namespace befindet, fügt es xmlns="" ein, um die Änderung in Namespace anzugeben.

Der einzige Weg, um den http://www.w3.org/1999/xhtml Standard-Namespace und nicht hat xmlns="" in der Ausgabe zu halten, ist die XSLT der Eingabeelemente zum http://www.w3.org/1999/xhtml Namespace konvertieren zu lassen.

Sie können wie folgt so tun:

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml"> 
... 
<xsl:template match="d"> 
    <xsl:apply-templates select="node() | @*"/> 
</xsl:template> 

<xsl:template match="d//*"> 
    <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> 
    <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
</xsl:template> 
... 
<xsl:if test="d"> 
    <div class="tipper"> 
    <xsl:apply-templates select="d"/> 
    </div> 
</xsl:if> 
+0

Danke für die gute Antwort, aber ... warum hast du runtergestimmt? –

+0

@ReverendoAsperso Ich dachte, du hättest keine ausreichenden Informationen zur Verfügung gestellt und vergessen, den Downvote rückgängig zu machen, wenn ich ihn genauer lese. Das tut mir leid. Ich habe jetzt aufgewertet. Als Nachschlagewerk empfiehlt es sich, eine vollständige XML- und XSLT-Datei bereitzustellen, die das Problem anstelle von abgekürzten Beispielen veranschaulicht. Weitere Informationen finden Sie auf der Seite [mvce] (https://stackoverflow.com/help/mcve). – JLRishe