2016-04-21 76 views
3

如何将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架构和相关的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可能仍然有用。

1

正如您所预料的那样,没有一般情况下的转换是可能的。然而,鉴于你在控制v1.1 XSD,这是有希望的。 XSD v1.1 RecommendationAppendix 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>