XSD中的Id和idref属性

时间:2013-11-27 12:59:20

标签: xml xsd schema idref

我正在为一个事件日历组合XML文档,该事件日历包含具有名称,日期,地点等子元素的事件元素。几个事件具有相同的地点但每个事件的联系信息场地仅在XML数据中列出一次。那么,我在XML文档中有什么:

<venueinfo>
    <venue id="p1">
        <name>...</name>
        <address>...</address>
        ...
    </venue>
    <venue id="p2">
        ...
    </venue>
    ...
</venueinfo>

在事件元素中:

<event>
    <name>...</name>
    ...
    <location idref="p1"/>
    ...
</event>

在XSD中,我需要将元素的元素链接到相应的元素中,但到目前为止我还没有正确链接。以下是相关的属性和元素声明:

<-- root element -->
<xs:element name="eventcalendar">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="tapahtuma" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="idref" type="xs:IDREF"/>

<xs:element name="venueinfo">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="venue" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="venue">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="name"/>
            <xs:element ref="address"/>
            ...
        </xs:sequence>
        <xs:attribute ref="id" use="required"/>
    </xs:complexType>
</xs:element>

<xs:element name="location">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute ref="idref" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

<xs:element name="event">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="category"/>
            ...
            <xs:element ref="location"/>
            ...
        </xs:sequence>
    </xs:complexType>
</xs:element>

对XML的验证为我提供了“元素'venueinfo'不允许用于内容模型'(event +)'”。有人可以告诉我应该做些什么来正确地做到这一点?非常感谢。

1 个答案:

答案 0 :(得分:1)

event定义使用type属性,将其移到文件顶部,然后将其作为venueinfo结构的容器引用:

<xs:element name="event" type="tEvent">
...
</xs:element>

<xs:complexType name="tEvent">
 <xs:element name="venueinfo">
 ...
 </xs:element>
</xs:complexType>