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

时间:2018-06-26 16:41:44

标签: xml xslt

我有这个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>

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

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

我已经看到了删除其他元素(而不是根节点)上默认名称空间的方法。有人可以指出我的资源/提供一个可以摘除根节点上默认名称空间的代码段吗?

2 个答案:

答案 0 :(得分:3)

首先,停止并考虑是否确实应该从XML中删除名称空间。 XML名称空间在词汇管理中起着重要的作用。尽管它们带来了一些麻烦,但是能够管理XML词汇表是一个巨大的优势,因此不应无缘无故地克服它。

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

只需修改identity转换即可按原样复制所有节点上的内容,除了专门处理元素之外,将其从任何名称空间中删除:

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

答案 1 :(得分:1)

<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