如何将XSD 1.1模式自动转换为XSD 1.0模式,方法是剥离所有1.1功能并仅保留与XSD 1.0兼容的子集?以编程方式将XSD 1.1模式转换为XSD 1.0?
我意识到这会限制您可以利用的XSD 1.1功能的数量,但我想象的用例是一种架构,您可以在其中发布XSD 1.1版本和更兼容的XSD 1.0版本,两者都描述相同的数据结构,但1.1版本还有一些附加的<assert>
数据完整性检查。
如何将XSD 1.1模式自动转换为XSD 1.0模式,方法是剥离所有1.1功能并仅保留与XSD 1.0兼容的子集?以编程方式将XSD 1.1模式转换为XSD 1.0?
我意识到这会限制您可以利用的XSD 1.1功能的数量,但我想象的用例是一种架构,您可以在其中发布XSD 1.1版本和更兼容的XSD 1.0版本,两者都描述相同的数据结构,但1.1版本还有一些附加的<assert>
数据完整性检查。
如果您想要发布1.1架构和相关的1.0架构,那么可能最简单也是最好的方法是使用XSD 1.1规范中描述的vc:namespace。您可以使用vc:namespace来标记1.1功能,例如您提到的断言(或包含它们的声明),并提供1.0当量或接近当量的值。
我们所用的一个例子使用此来标记xs:assert
从XSD 1.1规范为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:命名空间和过滤器模式相应的文件(接受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可能仍然有用。
正如您所预料的那样,没有一般情况下的转换是可能的。然而,鉴于你在控制v1.1 XSD,这是有希望的。 XSD v1.1 Recommendation的Appendix G.1总结了与XSD v1.0相比的变化。简而言之,不要依赖附录G.1中描述的任何新的构造或行为。
如果你留下清晰的比使用xsd:assert
你提到,你可以使用一个简单的XSLT转换来维持从1.0 XSD映射到你的V1.1 XSD其他所有的变化:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xsd:assert"/>
</xsl:stylesheet>