如何将xs:occurs属性组添加到元素声明中?

时间:2018-08-22 14:50:22

标签: xml xsd

我正在定义一个复杂元素sequence_T,我想为其添加minOccurs / maxOccurs属性,这些属性的语义与https://www.w3.org/2001/XMLSchema.xsd中定义的identities组的语义相同,但是我遇到了以下困难:似乎超出了我目前的技能水平。

<?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:occurs'解析为一个(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"

1 个答案:

答案 0 :(得分:1)

关于最初的问题,我认为您需要xsd:importhttp://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>