XSLT ลบ ns จาก XML

Aug 29 2020

กำลังดิ้นรนในการสร้าง XML ที่คาดไว้โดยใช้ XSLT ซึ่งฉันกำลังพยายามสร้างเวอร์ชันของ XML และต้องการลบแท็ก id ออกจาก XML XSLT ลบแท็ก แต่เพิ่มxmlns=""เป็นแอตทริบิวต์ของแต่ละแท็กในเอาต์พุต

XML มีลักษณะดังนี้

<?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>

ผลลัพธ์ที่คาดหวัง

<?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 แล้ว

<?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=""ฉันต้องการลบ กรุณาแนะนำว่าฉันทำผิดพลาดตรงไหน

คำตอบ

2 zx485 Aug 29 2020 at 08:38

คุณกำลังพยายามลบเนมสเปซของลูก ๆ ขององค์ประกอบรากของคุณ ที่ได้ผลดังนั้นxmlns=''. แต่การxmlns=...ตั้งค่าเนมสเปซเริ่มต้นสำหรับลูก ๆ ทั้งหมดซึ่งคุณพยายามยกเลิกในสองเทมเพลตแรกของคุณ

เพื่อให้ได้ผลลัพธ์ที่คุณต้องการคุณสามารถกำจัดเทมเพลตเหล่านี้และใช้เทมเพลตการลบกับเทมเพลตที่เปลี่ยนเนมสเปซขององค์ประกอบทั้งหมดเป็นเทมเพลตใหม่:

<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>

ผลลัพธ์เป็นไปตามที่ต้องการ (คาดคะเน):

<?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>

สิ่งนี้ใช้ได้แม้ใน XSLT-1.0