我有一个描述有向图上的顶点的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>
不是。
答案 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
,但我认为这是一个复制/粘贴错误,因为如果您的真实,验证者会抱怨更大声架构就像那样)