推荐的方法是使用 unique/key/keyref 结构。考虑到这个修改过的 XML(添加一个文档元素):
<Document>
<state id="1" name="S1"/>
<state id="2" name="S2"/>
<state id="3" name="S3"/>
<transition fromState="1" toState="2"/>
</Document>
这个 XSD 完全符合您的要求:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Document">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="state">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:unsignedByte" use="required"/>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="transition">
<xsd:complexType>
<xsd:attribute name="fromState" type="xsd:unsignedByte" use="required"/>
<xsd:attribute name="toState" type="xsd:unsignedByte" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKStates">
<xsd:selector xpath="state"/>
<xsd:field xpath="@id"/>
</xsd:key>
<xsd:keyref name="FKTransitionToStatesFrom" refer="PKStates">
<xsd:selector xpath="transition"/>
<xsd:field xpath="@fromState"/>
</xsd:keyref>
<xsd:keyref name="FKTransitionToStatesTo" refer="PKStates">
<xsd:selector xpath="transition"/>
<xsd:field xpath="@toState"/>
</xsd:keyref>
</xsd:element>
</xsd:schema>
如果你看一下这些图表,你可以更容易地想象选择器是如何工作的。如果您决定使用它并且您的 XSD 有一个目标命名空间,并且如果您限定了您的元素和/或属性,请确保为 targetNamespace 声明一个前缀并在您的 XPath 中使用该前缀。
通常,虽然知道如何使用此信息(key/keyref)来构建内容辅助列表以促进基于相关 XSD 的 XML 编辑的工具不多。通常具有专业性质的编辑器会根据硬连线实现而不是仅从 XSD 推断来执行此操作。