xsd:属性指向元素id

时间:2014-08-10 18:27:08

标签: xml xsd xsd-validation xml-validation

我有一个描述有向图上的顶点的xml:

<graph>
  <vertex id="a">
    <edge target="b"/>
  </vertex>
  <vertex id="b"/>
</graph>

鉴于架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="vertex">
    <xs:sequence>
      <xs:element type="edge" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" use="required" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="edge">
    <xs:attribute name="target" use="required"/>
  </xs:complexType>

  <xs:complexType name="graph">
    <xs:sequence>
      <xs:element name="vertex" type="vertex" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="graph" type="graph"/>
</xs:schema>

如何修改target属性,使其值只能是有效的顶点ID?

所以我的初始示例是有效的xml但是:

<graph>
  <vertex id="a">
    <edge target="c"/>
  </vertex>
  <vertex id="b"/>
</graph>

不是。

1 个答案:

答案 0 :(得分:3)

您可以使用key / keyref对执行此操作。在graph级别定义它们,以强制vertex ID是唯一的:

<xs:element name="graph" type="graph">
  <xs:key name="vertexKey">
    <xs:selector xpath="vertex" />
    <xs:field xpath="@id" />
  </xs:key>
  <xs:keyref name="edgeRef" refer="vertexKey">
    <xs:selector xpath="vertex/edge" />
    <xs:field xpath="@target" />
  </xs:keyref>    
</xs:element>

重要的是,您还需要在type的{​​{1}}属性中添加target,因为密钥和参考的类型必须兼容:

edge

(此外<xs:complexType name="edge"> <xs:attribute name="target" type="xs:string" use="required"/> </xs:complexType> 类型下的edge元素缺少vertex,但我认为这是一个复制/粘贴错误,因为如果您的真实,验证者会抱怨更大声架构就像那样)