2017-05-31 4 views
1

Es gibt viele Referenzen im Internet, die das gleiche Problem mit mir haben. Es ist das Hinzufügen von Namespace, ich habe das gleiche wie dieses, das ich sah: Adding namespace in inner parent group in xslt v2.0. Aber in meinem Fall habe ich keinen Namespace im Eltern-Tag und füge den Namespace in die innere Level-Gruppe ein. Ich habe versucht, die Lösungen zu kopieren, aber ich kann nicht die erwartete Ausgabe erhalten. Zum Beispiel habe ich diese Beispieldatei,Namespace mit xslt2.0 hinzufügen

INPUT:

<Record> 
<Data> 
    <Section> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

ERWARTET:

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="Section"> 
    <Section xmlns="www.hdgd.co"> 
     <xsl:copy-of select="*"/> 
    </Section> 
</xsl:template> 

Die generierte Ausgabe hat einen leeren Namespace im ID-Element gefüllt. Und ich muss diese leeren xmlns entfernen. Sehen wie folgt aus:

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID xmlns="">111222</ID> 
    </Section> 
</Data> 
</Record> 
+0

Denke nicht daran, "einen Namespace hinzuzufügen". Stellen Sie sich vor, Sie ändern den Namen des Elements. Wenn Sie die Namen der Elemente richtig angeben, werden die Namespace-Deklarationen für sich selbst sorgen. Der Name eines Elements ist ein Paar (Namespace-URI, lokaler Name). –

Antwort

1

Sie können nicht verwenden:

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

weil die Kopien die untergeordneten Knoten in ihrer ursprünglichen Namensraum - das ist kein-Namespace. Um das Ergebnis zu erhalten, die Sie wollen, müssen Sie nicht nur Section auf den neuen Namensraum bewegen, sondern auch alle seine Nachkommen (und lassen Sie alle anderen Knoten, wie sie sind) - zum Beispiel:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*[ancestor-or-self::Section]"> 
    <xsl:element name="{name()}" namespace="www.hdgd.co"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Danke @ michael.hor257k für die Rückmeldung. –