XSLT entfernt ns aus XML
Probleme beim Generieren von erwartetem XML mithilfe von XSLT, bei dem ich versuche, eine Versionierung von XML zu erreichen und das ID-Tag aus dem XML entfernen möchte. XSLT-Tag entfernen, aber xmlns=""als Attribut für jedes Tag in der Ausgabe hinzugefügt .
XML sieht so aus
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Customer xmlns="urn:com:xmlschema:service:v1.1:Address.xsd">
<ID>123</ID>
<Status>PRESENT</Status>
<InternetAddress>00:00:00:00:00</InternetAddress>
<PhysicalAddress>SOME ADDRESS</PhysicalAddress>
<FamilyMember>8</FamilyMember>
</Customer>
XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="urn:com:xmlschema:service:v1.1:Address.xsd"
exclude-result-prefixes="#all" >
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="ns:Customer">
<Customer xmlns="urn:com:xmlschema:service:v2.1:Address.xsd">
<xsl:apply-templates select="@*|node()"/>
</Customer>
</xsl:template>
<xsl:template match="ns:ID"/>
</xsl:stylesheet>
Erwartete Ausgabe
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Customer xmlns="urn:com:xmlschema:service:v2.1:Address.xsd">
<Status>PRESENT</Status>
<InternetAddress>00:00:00:00:00</InternetAddress>
<PhysicalAddress>SOME ADDRESS</PhysicalAddress>
<FamilyMember>8</FamilyMember>
</Customer>
XSLT generiert
<?xml version="1.0" encoding="UTF-8"?>
<Customer xmlns="urn:com:xmlschema:service:v2.1:Address.xsd">
<Status xmlns="">PRESENT</Status>
<InternetAddress xmlns="">00:00:00:00:00</InternetAddress>
<PhysicalAddress xmlns="">SOME ADDRESS</PhysicalAddress>
<FamilyMember xmlns="">8</FamilyMember>
</Customer>
xmlns=""Ich möchte entfernen. Bitte schlagen Sie vor, wo ich einen Fehler begebe.
Antworten
Sie haben versucht, die Namespaces der untergeordneten Elemente Ihres Stammelements zu entfernen. Das hat funktioniert, daher die xmlns=''. Das xmlns=...legt jedoch einen Standard-Namespace für alle untergeordneten Elemente fest, den Sie in Ihren ersten beiden Vorlagen abbrechen wollten.
Um die gewünschte Ausgabe zu erhalten, können Sie diese Vorlagen entfernen und einfach die Entfernungsvorlage mit einer Vorlage verwenden, die den Namespace aller Elemente in den neuen ändert:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="urn:com:xmlschema:service:v1.1:Address.xsd" exclude-result-prefixes="#all" >
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ns:*">
<xsl:element name="{local-name()}" namespace="urn:com:xmlschema:service:v2.1:Address.xsd">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="ns:ID"/>
</xsl:stylesheet>
Das Ergebnis ist wie gewünscht (angeblich):
<?xml version="1.0" encoding="UTF-8"?>
<Customer xmlns="urn:com:xmlschema:service:v2.1:Address.xsd">
<Status>PRESENT</Status>
<InternetAddress>00:00:00:00:00</InternetAddress>
<PhysicalAddress>SOME ADDRESS</PhysicalAddress>
<FamilyMember>8</FamilyMember>
</Customer>
Dies funktioniert sogar in XSLT-1.0.