引用XML Schema中的动态选择键

时间:2016-01-22 08:36:01

标签: xml xsd

如果我有一个类似这样的XML文档:

<Choices name="Numbers">
    <Choice>1</Choice>
    <Choice>2</Choice>
    <Choice>3</Choice>
</Choices>
<Choices name="Letters">
    <Choice>A</Choice>
    <Choice>B</Choice>
    <Choice>C</Choice>
</Choices>
<Selected>
    <Selection category="Letters">B</Selection>
</Selected>

我想在XSD中描述一个约束,它确保选择标签数据仅引用类别中的选择&#34; Letters&#34;。这是可行的吗?只要您可以在任何类别中选择任何类型的数据,但使用密钥相当容易,但是我很难理解如何限制它可以引用的类别选择。

1 个答案:

答案 0 :(得分:2)

如果您使用的是XSD 1.1,则可以使用断言对其进行测试。例如:

<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Choices" maxOccurs="unbounded"/>
            <xs:element ref="Selected"/>
        </xs:sequence>
        <xs:assert test="every $selection in Selected/Selection satisfies
               exists(Choices[@name=$selection/@category and exists(Choice[text()=$selection])])"/>
    </xs:complexType>
</xs:element>

我的示例假设您可以在选择中包含多个不相关的选择节点。您可以使用 xs:unique 和/或其他断言来测试其他内容(例如: Choices 名称是唯一的, Selection 类别是唯一的,每个选择选择等)