【问题标题】:Remove XML default namespace from root using XSLT使用 XSLT 从根目录中删除 XML 默认命名空间
【发布时间】:2018-06-27 13:26:24
【问题描述】:

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

我已经看到了删除其他元素上的默认命名空间的方法,但从来没有删除根节点。有人可以向我指出一个资源/提供一个简单地取消根节点上的默认命名空间的 sn-p 吗?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    首先,停下来考虑一下从 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>
    

    【讨论】:

      【解决方案2】:
      <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
      

      【讨论】:

      • 您是否在我的 exiting, simpler answer 中发现了某种缺陷,而您正在通过增加答案的复杂性来解决这些缺陷?
      猜你喜欢
      • 2012-09-20
      • 2011-07-13
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2015-12-14
      • 2017-07-19
      • 1970-01-01
      • 2010-11-17
      相关资源
      最近更新 更多