XSD - 将属性值限制为另一个元素属性值

时间:2010-03-03 15:41:34

标签: xsd

我有以下XML:

<Content name="contentName1">
    <!-- Some sub elements here -->
</Content>

<Sequence Name="sequenceName1">
    <Content name="contentName1" />
    <!-- Some sub elements here -->
</Sequence>

使用以下XSD

<xs:element maxOccurs="unbounded" name="Content">
    <xs:complexType>
        <xs:attribute name="Name" type="xs:string" use="required" />
        <!-- other definitions here -->
     </xs:complexType>
</xs:element>

<xs:element maxOccurs="unbounded" name="Sequence">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Content">
                <xs:complexType>
                    <xs:attribute name="ContentName" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="required" />
    </xs:complexType>
</xs:element>

在XSD中,如何告诉Sequence的Content元素的ContentName属性只接受在Content元素的ContentName中声明的值?

例如:使用上面提供的XML,在序列内容中只接受contentName1。

2 个答案:

答案 0 :(得分:2)

标识约束定义用于强制唯一,主键和外键关系。你需要先为内容元素定义一个关键元素,然后在内部元素元素中使用一个keyref来强制你提到的条件。
请参考下面的链接,它也有一些例子, xfront中的xfront教程涵盖了一些示例 -

http://www.w3.org/TR/xmlschema11-1/#Identity-constraint_Definition_details
http://www.xfront.com/files/xml-schema.html

答案 1 :(得分:-1)

我也不擅长xsd,但也许你会将<xs:attribute name="Name" type="xs:string" use="required" />更改为<xs:attribute name="Name" type="contentNames" use="required" />

并创建

 <xs:simpleType name="contentNames" >
    <xs:restriction base="xs:token">
      <xs:enumeration value="contentName1"/>
      <xs:enumeration value="contentName2"/>

      <xs:pattern value="contentName[1234567890][1234567890]"/> 
      <xs:enumeration value="contentName1"/>
    </xs:restriction>
  </xs:simpleType>

代表

<xs:pattern value="contentName[1234567890][1234567890]"/>

contentName1-99但不知道你是否也可以使用<xs:enumeration/>,你可以试试