わかりましたので、基本的に私が現在持っているものは次のとおりです。
XSD:
<?xml version="1.0"?>
<xsd:schema xmlns="test"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="test"
elementFormDefault="qualified">
<xsd:complexType name="fields">
<xsd:choice minOccurs="1" maxOccurs="unbounded">
<xsd:element name="text">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="group">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="fields" type="fields"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="fields" type="fields" minOccurs="0" maxOccurs="unbounded">
<xsd:key name="fieldId">
<xsd:selector xpath=".//*"/>
<xsd:field xpath="@id"/>
</xsd:key>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">
<fields>
<text id="asd"/>
<text id="sdf"/>
<group id="dfg">
<fields>
<text id="asd"/>
<text id="sdf"/>
</fields>
</group>
</fields>
</root>
重複する ID があるため、明らかに XML は XSD に従って有効ではありませんが、問題は、ID を独自のスコープでのみ検証することです。つまり、これは失敗するはずです。
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">
<fields>
<text id="asd"/>
<text id="asd"/>
</fields>
</root>
これは合格するはずですが:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">
<fields>
<text id="asd"/>
<group id="sdf">
<fields>
<text id="asd"/>
</fields>
</group>
</fields>
</root>
明確にするために、XMLを解析するときに親IDを子IDに追加することを計画しているため、達成できるようにしたいので、ネストされたIDが同じスコープにないときに重複することは気にしません同様の結果:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">
<fields>
<group id="eventA_time">
<fields>
<text id="hour"/>
<text id="minute"/>
<text id="second"/>
</fields>
</group>
<group id="eventB_time">
<fields>
<text id="hour"/>
<text id="minute"/>
<text id="second"/>
</fields>
</group>
</fields>
</root>