仅在xsd:schema中使用xslt添加前缀名称空间

时间:2018-07-06 15:11:39

标签: xml xslt xsd xsd-validation

我尝试将以下前缀xsd:schema添加到我的xmlns:nr0="http://NamespaceTest.com/balisesXrm"中,而无需更改XSD文档的内容。 我试过了:

<xsl:template match="xsd:schema">
 <xsl:element name="nr0:{local-name()}" namespace="http://NamespaceTest.com/balisesXrm">
   <xsl:copy-of select="namespace::*"/>
   <xsl:apply-templates select="node() | @*"/>
 </xsl:element>    
</xsl:template>

但这会带来两个问题: 1-我的架构由于名称更改为:<nr0:schema xmlns:nr0="http://NamespaceTest.com/balisesXrm" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SCCOAMCD="urn:SCCOA-schemaInfo" xmlns="urn:SBEGestionZonesAeriennesSYSCA-schema">

而变得无效

2-我在XML模式中创建的所有元素都已删除。

我如何保留元素并将前缀添加到根目录?

1 个答案:

答案 0 :(得分:2)

对于第一个问题,当您确实要创建名称空间声明时,您的代码当前正在创建一个元素。

您可以做的就是简单地使用所需的名称空间声明创建一个新的xsd:schema元素,并复制所有现有的元素。

<xsl:template match="xsd:schema">
  <xsd:schema xmlns:nr0="http://NamespaceTest.com/balisesXrm">
    <xsl:copy-of select="namespace::*"/>
    <xsl:apply-templates select="@*|node()"/>
  </xsd:schema>   
</xsl:template>

或者,如果您可以使用XSLT 2.0,则可以使用xsl:namespace并执行此操作...

<xsl:template match="xsd:schema">
  <xsl:copy>
    <xsl:namespace name="nr0" select="'http://NamespaceTest.com/balisesXrm'" />
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>   
</xsl:template>

(在这种情况下,{xsl:copy复制现有的名称空间)

对于第二个问题,如果尚未将身份模板添加到样式表中,则需要

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

尝试使用此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    version="2.0">

    <xsl:output method="xml" indent="yes" />

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

    <xsl:template match="xsd:schema">
      <xsd:schema xmlns:nr0="http://NamespaceTest.com/balisesXrm">
        <xsl:copy-of select="namespace::*"/>
        <xsl:apply-templates select="@*|node()"/>
      </xsd:schema>   
    </xsl:template>

    <!-- Alternative code for XSLT 2.0 -->
    <xsl:template match="xsd:schema">
      <xsl:copy>
        <xsl:namespace name="nr0" select="'http://NamespaceTest.com/balisesXrm'" />
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>   
    </xsl:template>
</xsl:stylesheet>