2017-02-15 6 views
0

in einer meiner xml Payload Ich muss einen Namespace nach der folgenden Zeile hinzufügen.Hinzufügen von Namespace mit XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""> 

danach ich nedd die Namespace xmlns hinzuzufügen: xsi = "http://www.w3.org/2001/XMLSchema-instance">

die erwartete Ausgabe sollte

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

könnten Sie bitte dabei helfen. Lassen Sie mich meine Anforderung ausarbeiten. In der eigentlichen Eingabenachricht bekomme ich Payload ohne Namespaces. Es sieht wie unten aus.

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
</document> 

in s/w das Dokument haben wir Rest der Nutzlast.

Danach habe ich XSLT-Code verwendet, um Namespaces und Präfixe in der Nutzlast hinzuzufügen. unten ist mein XSLT-Code.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ep="namespace here" 
xmlns:sh="namespace here" 
xmlns:gk="namespace here"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 


    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

    <xsl:template match="Document"> 
    <ep:Document> 
    <xsl:apply-templates select="node()|@*"/> 
    </ep:Document> 
    </xsl:template> 

<xsl:template match="Extension|Extension//*"> 
<xsl:element name="gk:{name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 

<xsl:template match="Header|Header//*"> 
<xsl:element name="sh:{name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 

</xsl:stylesheet> 

nach diesem Code der Ausgang I sieht aus wie unten bin immer.

<?xml version="1.0" encoding="UTF-8"?> 
<ep:Document xmlns:ep="namespace here" 
xmlns:gk="namespace here" 
xmlns:sh="namespace here" schemaVersion="" creationDate=""> 

und Rest payload.so brauche ich noch einen Namespace nach Schema-Version und creation in dem vorhandenen Code, wie im Beitrag erwähnt.

+0

Wir müssen Ihre vorhandene XSLT sehen - zumindest den Teil, der das 'ep: Document' Element behandelt. Beachten Sie, dass dies eine (andere?) Überflüssige Anforderung ist: Wenn Ihre Ausgabe eine Bindung des Präfixes "xsi" benötigt, würde Ihr Prozessor sie automatisch eingefügt haben (oder einen Fehler ausgelöst haben). –

+0

Lassen Sie mich meine Anforderung ausarbeiten. in der tatsächlichen Eingabe Payload bekomme ich die Nachricht ohne Namespaces .. –

+0

Ich habe meine Frage bearbeitet. bitte finden sie die details. –

Antwort

0

Wenn Sie die erforderlichen Namespace-Deklaration zu Ihrem xsl:stylesheet Element, d.h .: hinzufügen

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ep="namespace here" 
xmlns:sh="namespace here" 
xmlns:gk="namespace here" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

es wird wahrscheinlich im Starttag des Stamm ep:Document Elements Ausgang, erscheinen wie Sie es erwarten. Ich sage "wahrscheinlich", weil der XSLT-Prozessor keine redundante Namespace-Deklaration enthalten muss.

Sie haben keine Kontrolle über die Reihenfolge, in der Attribute und Namespace-Deklarationen in einem Start-Tag angezeigt werden. Die Reihenfolge ist definitionsgemäß unbedeutend.

+0

, so dass die Schemaversion und das Erstellungsdatum nur hinter dem xmlns: xsi-Namespace stehen? nicht davor? –

+0

Das hängt ganz von Ihrem XSLT-Prozessor ab. Die meisten Prozessoren werden zuerst alle Namespaces und dann die Attribute auflisten. Beachten Sie, dass der XSLT-Prozessor auf dem XML-Baum * und nicht auf der eigentlichen XML-Datei * arbeitet. Nur am Ende des Prozesses wird der Ergebnisbaum serialisiert, um die Ausgabedatei zu erstellen. –

Verwandte Themen