以编程方式将XSD 1.1架构转换为XSD 1.0?

时间:2016-04-21 01:53:33

标签: xml xsd xsd-1.1

如何通过剥离所有1.1功能并仅保留与XSD 1.0兼容的子集,自动将XSD 1.1架构转换为XSD 1.0架构?

我意识到这会限制你可以利用多少XSD 1.1功能,但我想象的用例是你发布XSD 1.1版本和更兼容的XSD 1.0版本的架构,两者都描述了相同的数据结构,但1.1版本还有一些额外的<assert>数据完整性检查。

2 个答案:

答案 0 :(得分:1)

正如您所预料的那样,无法进行一般情况转换。但是,鉴于你掌控了v1.1 XSD,我们有希望。 Appendix G.1XSD v1.1 Recommendation总结了与XSD v1.0相比的变化。简而言之,不要依赖附录G.1中描述的任何新构造或行为。

如果您不清楚除了使用{1}}之外的所有更改,您可以使用简单的XSLT转换来维护从v1.0 XSD到v1.1 XSD的映射:

xsd:assert

答案 1 :(得分:1)

如果您想要发布1.1模式和相关的1.0模式,那么最简单和最好的方法可能是使用XSD 1.1规范中描述的vc:namespace。您可以使用vc:namespace来标记1.1功能,例如您提到的断言(或包含它们的声明),并提供1.0等效或近似等效。

我们可以使用此标记将XSD 1.1规范中的xs:assert标记为仅限1.1的功能:

<xs:complexType name="arrayType">
 <xs:sequence>
  <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"/>
 </xs:sequence>
 <xs:attribute name="length" type="xs:int"/>
 <xs:assert test="@length eq fn:count(./entry)"
   xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
   vc:minVersion="1.1"/>
</xs:complexType>

需要任何XSD 1.1处理器来理解vc:namespace并相应地过滤模式文档(接受vc:minVersion小于或等于1.1,或vc:maxVersion大于1.1,依此类推)。因此,具有vc:*属性的模式文档可以作为1.1模式提供。

符合1.0的处理器可以更新以了解vc:名称空间,但我不知道任何已经存在的。因此,对于1.0处理器的使用,架构文档需要在它们看到之前进行过滤。

与kjhughes一样,我认为XSLT样式表可能是您过滤的最佳选择。但是使用vc:*命名空间可以很容易地可靠地执行,并且不要求模式作者最小化1.1功能的使用以简化转换。

编写样式表以执行必要的过滤非常容易,但实际上您并不需要:有XSLT 1.0 stylesheet完成工作(完全披露;我写的)它)。曾经有一个工作online demo,但我看到有点腐烂已经开始,它似乎不适用于当前的浏览器;我有空的时候会解决它。 documentation可能仍然有用。