XSLT xóa ns khỏi XML
Gặp khó khăn trong việc tạo ra XML mong đợi bằng XSLT, trong đó tôi đang cố gắng đạt được phiên bản của XML và muốn xóa thẻ id khỏi XML. XSLT loại bỏ thẻ nhưng nó được thêm vào xmlns=""dưới dạng một thuộc tính của mỗi thẻ trong đầu ra.
XML trông như thế này
<?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>
Sản lượng mong đợi
<?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 được tạo
<?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=""Tôi muốn loại bỏ. Vui lòng đề xuất nơi tôi đang phạm lỗi.
Trả lời
Bạn đang cố gắng xóa không gian tên của các phần tử con của phần tử gốc của bạn. Điều đó đã hoạt động, do đó xmlns=''. Tuy nhiên, vùng xmlns=...đặt tên mặc định cho tất cả các vùng con của nó - vùng mà bạn đang cố gắng hủy bỏ trong hai mẫu đầu tiên của mình.
Để có được đầu ra bạn muốn, bạn có thể loại bỏ các mẫu này và chỉ sử dụng mẫu loại bỏ với một mẫu thay đổi không gian tên của tất cả các phần tử thành không gian mới:
<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>
Kết quả của nó là như mong muốn (được cho là):
<?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>
Điều này thậm chí hoạt động trong XSLT-1.0.