我尝试将以下前缀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模式中创建的所有元素都已删除。
我如何保留元素并将前缀添加到根目录?
答案 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>