如何使用 xslt 从 xsd 中删除未使用的命名空间.保持架构引用命名空间的持久性



>我有一个xsd文件,例如:-

<?xml version="1.0" encoding="UTF-8"?>
<xsd:element xmlns:ns2="http://www.tibco.com/ns/no_namespace_schema_location/UnitTest/TestProcess-End.xsd" 
xmlns:ns="http://www.tibco.com/ns/no_namespace_schema_location/UnitTest/TestProcess-Map Data.xsd" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:pd="http://xmlns.tibco.com/bw/process/2003"
xmlns:ns="http://www.tibco.com/namespaces/tnt/plugins/jms"
name="group">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="a" type="xsd:string" minOccurs="0"/>
<xsd:element name="b" type="xsd:string" minOccurs="0"/>
<xsd:element name="c" type="xsd:string" minOccurs="0"/>
<xsd:element name="d" type="xsd:string" minOccurs="0"/>
<xsd:element name="e" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element ref="ns:root"/>
<xsd:element ref="ns2:root"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

这包含一些未使用的命名空间,任何人都可以解释如何使用 xslt 实现它:- 所需的输出是:- 请注意,用于架构引用的命名空间应该是 entact。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:element xmlns:ns2="http://www.tibco.com/ns/no_namespace_schema_location/UnitTest/TestProcess-End.xsd" 
xmlns:ns="http://www.tibco.com/ns/no_namespace_schema_location/UnitTest/TestProcess-Map Data.xsd" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="group">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="a" type="xsd:string" minOccurs="0"/>
<xsd:element name="b" type="xsd:string" minOccurs="0"/>
<xsd:element name="c" type="xsd:string" minOccurs="0"/>
<xsd:element name="d" type="xsd:string" minOccurs="0"/>
<xsd:element name="e" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element ref="ns:root"/>
<xsd:element ref="ns2:root"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

在 xslt 声明中使用exclude-result-prefixes

在 XSLT 2.0 中,您可以执行<xsl:copy-of select="/" copy-namespaces="no"/>复制整个文档,不包括元素或属性名称中未使用的任何命名空间。但是,它可能会删除仅在属性内容中使用的命名空间,例如ref="ns2:root"。可靠地检测这些情况非常棘手,特别是如果它们在 XPath 表达式中使用(例如,在xs:keyxs:keyref约束中)。

如果要删除除$retain列表中的命名空间之外的所有"未使用"命名空间,可以执行以下操作(再次是 XSLT 2.0):

<xsl:template match="*">
<xsl:copy copy-namespaces="no">
<xsl:copy-of select="@*"/>
<xsl:copy-of select="namespace::*[not(name()=$retain)]"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

您也许可以初始化$retain以包含样式表中与[A-Za-z0-9]:、 减去冒号匹配的所有字符串。

最新更新