【发布时间】:2014-12-31 22:13:30
【问题描述】:
我收到了一组包含“多余”复杂类型的 XML 模式,我正在寻找一种使用 XSLT 删除它们的方法。
模式(见下文)有许多 <xsd:element name="ElementX" type="ComplexTypeX"> 标记,每个标记都引用一个复杂类型。每个复杂类型都继承自另一个模式 (Datatypes.xsd) 中的基类型,但是没有扩展或限制类型 - 因此毫无意义!
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="..." xmlns:xsd="..." xmlns="...">
<xsd:include schemaLocation="Datatypes.xsd" />
<xsd:complexType name="ComplexType1">
<xsd:simpleContent>
<xsd:extension base="ActualType1" />
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="ElementName1" type="ComplexType1" />
<xsd:complexType name="ComplexType2">
<xsd:simpleContent>
<xsd:extension base="ActualType2" />
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="ElementName2" type="ComplexType2" />
...
</xsd:schema>
我正在尝试(但不是很远......)将 XSLT 转换写入:
将每个元素的类型替换为对应的复杂类型的基类型。例如。上面 ElementName1 的类型将变为 ActualType1。
从输出中删除整个 complexType。
生产输出:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="..." xmlns:xsd="..." xmlns="...">
<xsd:include schemaLocation="Datatypes.xsd" />
<xsd:element name="ElementName1" type="ActualType1" />
<xsd:element name="ElementName2" type="ActualType2" />
.
.
.
</xsd:schema>
目前,所有 complexType 元素都不会以任何方式更改基本类型,因此执行替换是安全的。但是,如果将来某些 complexType 元素被更改以限制或扩展它们的基本类型(并且具有有意义的用途),我只想执行剩余多余类型的替换/删除。虽然我意识到这会在一定程度上增加 XSLT 的复杂性。
背景:这些模式来自第三方,不幸的是我无法控制它们的生产。我怀疑由于用于生成模式的工具而存在额外的复杂类型层。
谢谢!
【问题讨论】: