从根标签中删除xmlns,同时保留其他标签,例如xmlns:xsd和xmlns:xsi

时间:2018-11-28 06:58:01

标签: xml xslt xml-namespaces

我对XSLT不太熟悉。我试图从根标签中删除xmlns命名空间,同时使用xslt保留其他标签,例如xmlns:xsd和xmlns:xsi。我从互联网上获得了一些帮助,以删除xmlns名称空间,但是该代码也正在删除xmlns:xsd。请帮忙。预先感谢。

这是我的xsl代码:

dist

这是我的输入xml:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
 xmlns:old="http://www.example.com"    exclude-result-prefixes="old">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>


<xsl:template match="old:*">
   <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet> 

在输入XML上运行XSL时,我得到以下XML

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.example.com" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xsi:schemaLocation="http://www.example.com/schemaLocation">

<name>abc</name>
<name>efg</name>

</Data>

所需的输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.com/schemaLocation">

<name>abc</name>
<name>efg</name>

</Data>

1 个答案:

答案 0 :(得分:0)

在XML文档中的任何地方都不会使用缺少的名称空间声明,因此您的处理器可以正确地丢弃它。

您可以尝试将其复制:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@* | namespace::*[name()]"/>
        <xsl:apply-templates select="node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

但并非所有处理器都会产生期望的结果(例如,Xalan不会)。