如果我创建一个需要模式1.1特性的XML模式(特别是微妙的模式,比如删除基类型限制中的可选元素),那么表明该模式不应该与仅理解版本的处理器一起使用的最佳方法是什么1.0?
在XSLT样式表文件中,可以指示使用version
属性使用的XSLT规范的版本。
但是在XSD文件中,version
属性没有这个含义 - 它是一个自由格式的属性,它说明了模式的版本,而不是正在使用的规范的版本。
是否需要标记使用1.1功能的架构?
我使用FPML 5.5规范和一些自定义模式有一组复杂的模式,并且无法使用某些模式验证器进行验证,但我不确定这是因为验证器有错误还是因为模式巧妙地使用了xml模式1.1功能。
在这个时间点,这个问题并不容易解决;这是因为大多数XSD处理器都是1.0,并且XSD 1.1规范中引入的架构版本控制无法向后应用。要了解更多信息(一般情况下),请查看The Schema Versioning Namepsace,以及4.2.2 Conditional inclusion部分中包含的示例。
您可以实现自己的预处理解决方案,这至少有助于选择适当的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)。为了在封闭环境中更简单,您还可以选择一个约定,您可以使用vc标记整个xsd:schema
:minVersion =“1.1” - 基本上您似乎想要开始。
关于你的最后一段,必须断言XSD处理器的选择而不是暗示。这是因为XSD 1.1允许在XSD 1.0中不可能的构造(例如,包含最大出现大于1的粒子的all
合成器)......所以除非事先做出决定:使用的处理器,XSD可能或可能不是无效的。而无论使用何种处理器,其他事情都将无效。
在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”命名空间中。因此,您也可以在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版本。