XSLT menghapus ns dari XML
Berjuang menghasilkan XML yang diharapkan menggunakan XSLT di mana saya mencoba untuk mencapai versi XML dan ingin menghapus tag id dari XML. XSLT menghapus tag tetapi ditambahkan xmlns=""sebagai atribut dari setiap tag di keluaran.
XML terlihat seperti ini
<?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>
Output yang diharapkan
<?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 dihasilkan
<?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=""Saya ingin menghapus. Mohon sarankan di mana saya melakukan kesalahan.
Jawaban
Anda mencoba menghapus namespace dari anak-anak elemen root Anda. Itu berhasil, karenanya xmlns=''. Tapi xmlns=...menyetel namespace default untuk semua anaknya - yang Anda coba batalkan di dua template pertama Anda.
Untuk mendapatkan hasil yang Anda inginkan, Anda dapat membuang template ini dan hanya menggunakan template penghapusan dengan template yang mengubah namespace semua elemen menjadi yang baru:
<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>
Hasilnya seperti yang diinginkan (seharusnya):
<?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>
Ini bahkan bekerja di XSLT-1.0.