使用xslt从XML删除xmlns =“”

时间:2018-07-13 09:38:46

标签: xml xslt

我有以下XML模式:

<?xml version="1.0" encoding="UTF-8"?>
<xrm:plugin source-default-namespace=""  cible-encodage="ISO-8859-1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.moss.fr/2011/connecteur_xrm testplugin.xsd" xmlns:tech="http://www.moss.fr/2011/moteur-xrm" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns:attribut="http://www.moss.fr/2012/attribut" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mcd="urn:SCCOA-schemaInfo" xmlns:xrm="http://www.moss.fr/2011/connecteur_xrm" xmlns:variable="http://www.moss.fr/2012/variable" xmlns:doc="http://www.moss.fr/2011/documentation" xmlns:mtf2xsd="http://www.moss.fr/2010/mtf2xsd" xmlns:conv="http://www.moss.fr2010/conversion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:SBEGestionZonesAeriennesSYSCA="urn:SBEGestionZonesAeriennesSYSCA-schema" xmlns:info="http://www.moss.fr/2011/information" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema">
<xrm:mapping occurs="xrm:mapping">
  <SBEGestionZonesAeriennesSYSCA xmlns=""
                                 info:obligatoire="true"
                                 occurs="/grappe"
                                 info:contexte="/grappe">
  </SBEGestionZonesAeriennesSYSCA>
 </xrm:mapping>
</xrm:plugin>

元素SBEGestionZonesAeriennesSYSCA在命名空间"urn:SBEGestionZonesAeriennesSYSCA-schema"中,那么我只需要删除xmlns=" "

我尝试了XSLT:

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

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

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

</xsl:stylesheet>

我认为XSLT将使用SBEGestionZonesAeriennesSYSCA中的namespace-uri,但是它什么也没有改变。我需要找到一种通常删除此xmlns = " "的方法(我有很多带有mapping的XML文档,其中包含此“属性”,这会导致需要使用xsd进行验证)。

在这里您可以找到其他具有相同问题但名称空间不同的XML:

<?xml version="1.0" encoding="UTF-8"?>
<xrm:plugin xmlns:doc="http://www.moss.fr/2011/documentation"
        xmlns:info="http://www.moss.fr/2011/information"
        xmlns:xrm="http://www.moss.fr/2011/connecteur_xrm"
        xmlns:attribut="http://www.moss.fr/2012/attribut"
        xmlns:variable="http://www.moss.fr/2012/variable"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tech="http://www.moss.fr/2011/moteur-xrm"
        xmlns:conv="http://www.moss.fr2010/conversion"
        xmlns:SCCOAMCD="urn:SCCOA-schemaInfo"
        xmlns:mcd="urn:SCCOA-schemaInfo"
        xmlns="urn:SBEPlanDeVolSYSCA-schema"
        xmlns:SBEPlanDeVolSYSCA="urn:SBEPlanDeVolSYSCA-schema"
        xmlns:mtf2xsd="http://www.moss.fr/2010/mtf2xsd"
        source-default-namespace=""
        cible-encodage="ISO-8859-1">
<xrm:mapping>
  <SBEPlanDeVolSYSCA xmlns=""
                     info:obligatoire="true"
                     info:est-codage="true"
                     occurs="/grappe[ LieuOaci/aCodeOaci = $Codes_OACI_A_Traiter ]"
                     doc:description="On filtre les PDV qui ne concernent pas des plateformes définies en fichier de configuration"
                     param="Codes_OACI_A_Traiter"
                     info:contexte="/grappe[ LieuOaci/aCodeOaci = $Codes_OACI_A_Traiter ]">
  </SBEPlanDeVolSYSCA>
 </xrm:mapping>
</xrm:plugin>

1 个答案:

答案 0 :(得分:1)

您的XML显示了此内容...

<SBEGestionZonesAeriennesSYSCA xmlns=""

这意味着SBEGestionZonesAeriennesSYSCA不在命名空间中。当前不在SBEGestionZonesAeriennesSYSCA中。 xmlns=""覆盖了父元素上的默认声明。

这不是删除xmlns=""的情况,因为xmlns不是普通属性,而是名称空间声明。您实际上想将SBEGestionZonesAeriennesSYSCA从无名称空间移至另一名称空间。

您可以通过执行以下操作简单地完成此操作...

<xsl:element name="{local-name(.)}" namespace="urn:SBEGestionZonesAeriennesSYSCA-schema">

编辑:如果默认名称空间未知,则可以尝试从父元素获取默认名称空间

<xsl:element name="{local-name(.)}" namespace="{parent::*/namespace::*[name() = '']}">

但是,例如,如果您在SBEGestionZonesAeriennesSYSCA下有子元素,则该结果将无法得到正确的结果,该子元素也需要移动。在这种情况下,请尝试以下方法查找具有默认名称空间不为空的第一个祖先:

<xsl:element name="{local-name(.)}" namespace="{ancestor::*[namespace::*[name() = '' and . != '']][1]/namespace::*[name() = '']}">