Xml xsd:属性指向元素id

Xml xsd:属性指向元素id,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我有一个xml描述有向图上的顶点: <graph> <vertex id="a"> <edge target="b"/> </vertex> <vertex id="b"/> </graph> 不是。您可以使用key/keyref对执行此操作。在图形级别定义它们,以强制执行顶点ID是唯一的: <xs:element name="graph" type="graph"> <xs:ke

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

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

不是。

您可以使用key/keyref对执行此操作。在
图形
级别定义它们,以强制执行
顶点
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>

(另外,
顶点
类型下的
边缘
元素缺少一个
名称
,但我认为这是一个复制/粘贴错误,因为如果您的真实模式是这样,验证器会更大声地抱怨)

对我不起作用。如果顶点ID不唯一,但问题中提供的两个xml实例都根据此模式进行了验证,则解决方案会产生错误。如果这是一个可以编辑的快速修复,那么我将撤销我的downvote和upvote youI,尽管这可能是一个范围问题,并将keyref定义移动到图形元素(并相应地更改了选择器)。现在,两个XML都未通过验证,出现以下错误:对于元素“graph”的标识约束,找不到值为“b”的键“edgeRef”。@Eladian得到了它-引用属性(
target
)需要类型声明,以允许它匹配顶点
id
(声明为
xs:string
).这超出了我最初问题的范围,但在我的实际用例中,有许多类型的边,都来自抽象的
类型。如何将此解决方案应用于模式,而不必在选择器中显式指定每个派生边类型(即,不使用类似于:
xs:selector xpath=“vertex/edgeA | vertex/edgeB | vertex/edgeC |……”
)@eladian对
选择器
字段
支持的xpath子集非常有限。你可以做
vertex/*
,但我看不出你怎么能做比这更细粒度的事情,因为你不允许做谓词(对于完整的XPath,我建议像
vertex/*[以(local-name(),'edge')开头]
,但这里不允许这样做)。
<graph>
  <vertex id="a">
    <edge target="c"/>
  </vertex>
  <vertex id="b"/>
</graph>
<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>
<xs:complexType name="edge">
  <xs:attribute name="target" type="xs:string" use="required"/>
</xs:complexType>