恵比寿神のアレのXMLスキーマ。
fsm@initial と transit@state が state@name と一致しなければならないという制約を組み込んだりしてみたが、それナシでもDTDよりずいぶん膨れるんだなぁ。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://episteme.wankuma.com/namespaces/smc"
xmlns:smc="http://episteme.wankuma.com/namespaces/smc"
elementFormDefault="qualified">
<xsd:element name="fsm" type="smc:fsm">
<xsd:key name="stateName">
<xsd:selector xpath="smc:state"/>
<xsd:field xpath="@name"/>
</xsd:key>
<xsd:keyref name="initialStateRef" refer="smc:stateName">
<xsd:selector xpath="."/>
<xsd:field xpath="@initial"/>
</xsd:keyref>
<xsd:keyref name="transitStateRef" refer="smc:stateName">
<xsd:selector xpath="smc:state/smc:event/smc:transit"/>
<xsd:field xpath="@state"/>
</xsd:keyref>
</xsd:element>
<xsd:complexType name="fsm">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="state" type="smc:state"/>
</xsd:choice>
<xsd:attribute name="name" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="initial" type="xsd:NMTOKEN" use="required"/>
</xsd:complexType>
<xsd:complexType name="state">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="event" type="smc:event"/>
</xsd:choice>
<xsd:attribute name="name" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="entry" type="xsd:NMTOKEN"/>
<xsd:attribute name="exit" type="xsd:NMTOKEN"/>
</xsd:complexType>
<xsd:complexType name="event">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="execute" type="smc:execute"/>
<xsd:element name="transit" type="smc:transit"/>
</xsd:choice>
<xsd:attribute name="name" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="guard" type="xsd:NMTOKEN"/>
</xsd:complexType>
<xsd:complexType name="execute">
<xsd:attribute name="action" type="xsd:NMTOKEN" use="required"/>
</xsd:complexType>
<xsd:complexType name="transit">
<xsd:attribute name="state" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="if" type="xsd:NMTOKEN"/>
</xsd:complexType>
</xsd:schema>