问题 如何指示需要模式1.1功能的xml架构?


如果我创建一个需要模式1.1特性的XML模式(特别是微妙的模式,比如删除基类型限制中的可选元素),那么表明该模式不应该与仅理解版本的处理器一起使用的最佳方法是什么1.0?

在XSLT样式表文件中,可以指示使用a使用的XSLT规范的版本 version 属性。

但在XSD文件中, version 属性没有这个含义 - 它是一个自由格式的属性,它说明了模式的版本,而不是正在使用的规范的版本。

是吗 需要 标记使用1.1功能的架构?

我有一组使用FPML 5.5规范和一些自定义模式的复杂模式,并且无法使用某些模式验证器进行验证,但我不确定这是因为验证器有错误还是因为模式巧妙地使用了xml模式1.1功能。


3616
2018-02-04 14:44


起源



答案:


在这个时间点,这个问题并不容易解决;这是因为大多数XSD处理器都是1.0,并且XSD 1.1规范中引入的架构版本控制无法向后应用。要了解更多相关信息(一般情况下),请查看 Schema Versioning Namepsace,以及部分中包含的示例 4.2.2条件包含

您可以实现自己的预处理解决方案,这至少有助于选择适当的XSD处理器,例如:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning">

    <xsd:element name="e" vc:minVersion="1.1">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" maxOccurs="unbounded"/>       
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="e" vc:minVersion="1.0" vc:maxVersion="1.1">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" />            
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>      
</xsd:schema>

这样至少你会使用XSD 1.1认可的版本化方法;它还附带一个处理模型。对于某些任务,构建预处理器相对容易,至少将处理适当选择的XSD处理器(1.0或1.1)。为了在封闭环境中更简单,您还可以选择一个可以标记整体的约定 xsd:schema 与vc:minVersion =“1.1” - 基本上你似乎想要开始。

关于你的最后一段,必须断言XSD处理器的选择而不是暗示。这是因为XSD 1.1允许在XSD 1.0中不可能构造(例如 all 包含最大出现大于1的粒子的合成器... ...除非事先做出决定:使用的处理器,否则XSD可能无效也可能无效。而无论使用何种处理器,其他事情都将无效。


7
2018-02-04 17:06



将vc:minVersion =“1.1”放在上面也是合法的 <schema> 元素本身?即使仅XSD 1.0处理器不理解,这至少也是视觉检查的明确指标 - Erwin Bolwidt
据我所知,这是合法的,因此我的建议。 - Petru Gardea


答案:


在这个时间点,这个问题并不容易解决;这是因为大多数XSD处理器都是1.0,并且XSD 1.1规范中引入的架构版本控制无法向后应用。要了解更多相关信息(一般情况下),请查看 Schema Versioning Namepsace,以及部分中包含的示例 4.2.2条件包含

您可以实现自己的预处理解决方案,这至少有助于选择适当的XSD处理器,例如:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning">

    <xsd:element name="e" vc:minVersion="1.1">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" maxOccurs="unbounded"/>       
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="e" vc:minVersion="1.0" vc:maxVersion="1.1">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="a" minOccurs="0"/>
                <xsd:element name="b" />            
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>      
</xsd:schema>

这样至少你会使用XSD 1.1认可的版本化方法;它还附带一个处理模型。对于某些任务,构建预处理器相对容易,至少将处理适当选择的XSD处理器(1.0或1.1)。为了在封闭环境中更简单,您还可以选择一个可以标记整体的约定 xsd:schema 与vc:minVersion =“1.1” - 基本上你似乎想要开始。

关于你的最后一段,必须断言XSD处理器的选择而不是暗示。这是因为XSD 1.1允许在XSD 1.0中不可能构造(例如 all 包含最大出现大于1的粒子的合成器... ...除非事先做出决定:使用的处理器,否则XSD可能无效也可能无效。而无论使用何种处理器,其他事情都将无效。


7
2018-02-04 17:06



将vc:minVersion =“1.1”放在上面也是合法的 <schema> 元素本身?即使仅XSD 1.0处理器不理解,这至少也是视觉检查的明确指标 - Erwin Bolwidt
据我所知,这是合法的,因此我的建议。 - Petru Gardea


在XML Schema开发列表上有与此相关的讨论: http://lists.w3.org/Archives/Public/xmlschema-dev/2013Sep/0000.html

结论是,如果我们要指定XML Schema的版本,我们应该在xsd:schema元素上使用vc:minVersion和vc:maxVersion属性。 属性不在架构名称空间中,它们位于“http://www.w3.org/2007/XMLSchema-versioning“namespace。因此,您也可以在XML Schema版本1.0上设置它们,并且此架构将是有效的。

因此,如果要指定模式是否为1.0版,则可以在xsd:schema元素上设置版本属性,如下所示:vc:minVersion =“1.0”vc:maxVersion =“1.1”(minVersion包含,maxVersion为独家)。

如果要将架构版本设置为1.1,可以在xsd:schema元素上设置版本属性,如下所示:vc:minVersion =“1.1”。在这种情况下不需要设置maxVersion属性,因为我们还没有格式化1.1的XML Schema版本。


8
2018-02-05 15:30