我正在定义一个复杂的元素sequence_T,我想将minOccurs / maxOccurs属性添加到具有与 https://www.w3.org/2001/XMLSchema.xsd中定义的出现组相同的语义,但我遇到的困难似乎超出了我当前的技能水平. ?x
<?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"/>`
关于你的解决方法,为了允许无限制作为maxOccurs的有效值,你必须定义一个灵感来自xsd:allNNI的本地类型,它不能原样使用(你会遇到与使用xsd相同的问题:在尝试时发生使用它而不使用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>