使用 xslt 仅在 xsd:schema 中添加前缀命名空间
add prefix namespace only in xsd:schema with xslt
我正在尝试将以下前缀 xmlns:nr0="http://NamespaceTest.com/balisesXrm"
添加到我的 xsd:schema
中,而不更改我的 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 模式中创建的所有元素都已删除。
我怎样才能保留我的元素并只将前缀添加到我的根?
对于您的第一个问题,您的代码当前正在创建一个元素,而您确实想要创建一个名称空间声明。
您可以做的是简单地创建一个具有所需命名空间声明的新 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>
我正在尝试将以下前缀 xmlns:nr0="http://NamespaceTest.com/balisesXrm"
添加到我的 xsd:schema
中,而不更改我的 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 模式中创建的所有元素都已删除。
我怎样才能保留我的元素并只将前缀添加到我的根?
对于您的第一个问题,您的代码当前正在创建一个元素,而您确实想要创建一个名称空间声明。
您可以做的是简单地创建一个具有所需命名空间声明的新 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>