如果我创建一个需要模式1.1功能的XML模式(特别是微妙的模式,比如删除限制基类型的可选元素),那么表明此模式不应与处理器一起使用的最佳方法是什么?只了解版本1.0?
在XSLT样式表文件中,可以指示使用version
属性使用的XSLT规范的版本。
但是在XSD文件中,version
属性没有这个含义 - 它是一个自由格式的属性,它说明了模式的版本,而不是正在使用的规范的版本
是否需要 来标记使用1.1功能的架构?
我有一组使用FPML 5.5规范和一些自定义模式的复杂模式,并且无法使用某些模式验证器进行验证,但我不确定这是因为验证器有错误还是因为模式是巧妙的使用xml架构1.1功能。
答案 0 :(得分:8)
在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属性,因为我们还没有将XML Schema版本更改为1.1。
答案 1 :(得分:7)
目前,这个问题并不容易解决;这是因为大多数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可能无效也可能无效。而无论使用何种处理器,其他事情都将无效。