使用 XSLT 从根目录中删除 XML 默认命名空间



>我有这个XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NAXML-MaintenanceRequest version="3.4" xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16">
<TransmissionHeader>
<StoreLocationID>AB123</StoreLocationID>
<VendorName>VeriFone</VendorName>
<VendorModelVersion>Commander Site Controller</VendorModelVersion>
</TransmissionHeader>
<ComboMaintenance>
<TableAction type="initialize"/>
<RecordAction type="addchange"/>
</ComboMaintenance>
</NAXML-MaintenanceRequest>

我想到达这里,只需删除NAXML-MaintenanceRequest节点上的xmlns=""

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NAXML-MaintenanceRequest version="3.4">
<TransmissionHeader>
<StoreLocationID>AB123</StoreLocationID>
<VendorName>VeriFone</VendorName>
<VendorModelVersion>Commander Site Controller</VendorModelVersion>
</TransmissionHeader>
<ComboMaintenance>
<TableAction type="initialize"/>
<RecordAction type="addchange"/>
</ComboMaintenance>
</NAXML-MaintenanceRequest>

我已经看到了删除其他元素上的默认命名空间的方法,但从未删除过根节点。有人可以指出我一个资源/提供一个片段,只是删除根节点上的默认命名空间吗?

首先,停下来考虑一下从 XML 中删除命名空间是否真的是你应该做的。 XML 命名空间在词汇管理中起着重要作用。 尽管它们引入了一些复杂性,但能够管理 XML 词汇表是一个很大的优势,不应该在没有正当理由的情况下被击败。

从机械上讲,是的,XSLT 是从 XML 文档映射到另一个 XML 文档的理想工具,并且可以轻松地从命名空间中删除元素...

只需调整标识转换以按原样复制所有节点,但特殊处理元素除外,从任何命名空间中删除它们:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|processing-instruction()|comment()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="@*|processing-instruction()|comment()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:if test="@version">
<xsl:attribute name="version">
<xsl:value-of select="@version"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="m:TableAction">
<xsl:element name="{ local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="m:RecordAction">
<xsl:element name="{ local-name()}">
<xsl:apply-templates select="@*"/>
</xsl:element>
</xsl:template>
check it

最新更新