我正在定义一个复杂元素sequence_T
,我想将minOccurs / maxOccurs属性添加到与https://www.w3.org/2001/XMLSchema.xsd中定义的出现组相同的语义,但我遇到的困难似乎超出了我目前的技能水平。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://versionschema.org/xmlns"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsv="http://www.w3.org/2007/XMLSchema-versioning" xsv:minVersion="1.1"
xmlns:vs="http://versionschema.org/xmlns" elementFormDefault="qualified"
attributeFormDefault="unqualified" xml:lang="en" version="Experimental.0 {VSchemaInDev.0}"
>
<xsd:complexType name="sequence_T" final="#all">
<xsd:annotation>
<xsd:documentation xml:lang="en">
Declares an ordered list of elements.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:group ref="vs:baseelementsGroup"/>
<xsd:group ref="vs:controlGroup"/>
<xsd:group ref="vs:ruleelementsGroup"/>
</xsd:choice>
</xsd:sequence>
<xsd:attributeGroup ref="vs:annotationsAttributeGroup"/>
<xsd:attributeGroup ref="xsd:occurs"/>
</xsd:complexType>
</xsd:schema>
我得到“无法解析名称'xsd:发生'到(n)'属性组'组件”。有什么线索如何添加这些属性?
我确实有这个解决方法:
<xsd:attributeGroup name="minmaxAttributesGroup">
<xsd:attribute name="minOccurs" type="xsd:nonNegativeInteger" default="1"/>
<xsd:attribute name="maxOccurs" type="xsd:nonNegativeInteger" default="1"/>
<xsd:attribute name="maxOccursUnbounded" type="xsd:boolean" default="false"/>
</xsd:attributeGroup>
但maxOccursUnbounded="true"
并不像maxOccurs="unbounded"
那样语义清洁。
关于你的初始问题,我认为你需要xsd:import
“http://www.w3.org/2001/XMLSchema”,只要你引用它定义的构造,它们在每个模式定义中都不是隐式可用的(参见https://www.w3.org/TR/xmlschema-1/#simple-ur-type-itself)。
我发现如果xmllint
包含以下附加行,则可以使用您的初始模式高兴地验证XML文档:
<xsd:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd"/>`
关于你的解决方法,为了允许unbounded
作为maxOccurs
的有效值,你必须定义一个灵感来自xsd:allNNI
的本地类型,它不能原样使用(你会遇到与使用xsd:occurs
时相同的问题) xs:import
)和(你自己的)maxOccurs
使用的类型:
<xsd:simpleType name="allNNI">
<xsd:annotation>
<xsd:documentation>for maxOccurs</xsd:documentation>
</xsd:annotation>
<xsd:union memberTypes="xsd:nonNegativeInteger">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="unbounded"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
<xsd:attributeGroup name="minmaxAttributesGroup">
<xsd:attribute name="minOccurs" type="xsd:nonNegativeInteger" default="1"/>
<xsd:attribute name="maxOccurs" type="vs:allNNI" default="1"/>
</xsd:attributeGroup>