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