OPの要求を達成するために、パターンベースの制限( foo [0-9] +など)を使用した回答をほぼ投稿しました。しかし、投稿する前に、私はキーとkeyrefについて知りました。これが解決策のようです。そこで、次のスキーマを思いつきました。しかし、最初は、ばかげた名前空間宣言の問題のために機能しませんでした。私は主にそれを投稿しています。なぜなら、私は以前にもこれを行う方法を知らなかったので、私はほとんどそこにいることを知っていたので、夢中になりました。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns="http://stackoverflow.com"
xmlns:so="http://stackoverflow.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://stackoverflow.com"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xs:element name="root" type="rootType">
<xs:key name="fooKey">
<xs:selector xpath="so:hierarchy1/so:foo"/>
<xs:field xpath="@so:key"/>
</xs:key>
<xs:key name="barKey">
<xs:selector xpath="so:hierarchy1/so:bar"/>
<xs:field xpath="@so:key"/>
</xs:key>
<xs:keyref name="fooKeyref" refer="fooKey">
<xs:selector xpath="so:hierarchy2/so:foohandler"/>
<xs:field xpath="@so:keyref"/>
</xs:keyref>
<xs:keyref name="barKeyref" refer="barKey">
<xs:selector xpath="so:hierarchy2/so:barhandler"/>
<xs:field xpath="@so:keyref"/>
</xs:keyref>
</xs:element>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="hierarchy1" type="hierarchy1Type"/>
<xs:element name="hierarchy2" type="hierarchy2Type"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="hierarchy1Type">
<xs:sequence>
<xs:element name="foo" type="fooType"/>
<xs:element name="bar" type="barType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="hierarchy2Type">
<xs:sequence>
<xs:element name="foohandler" type="foohandlerType"/>
<xs:element name="barhandler" type="barhandlerType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fooType">
<xs:attribute name="key" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="barType">
<xs:attribute name="key" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="foohandlerType">
<xs:attribute name="keyref" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="barhandlerType">
<xs:attribute name="keyref" type="xs:integer"/>
</xs:complexType>
</xs:schema>
上記のスキーマは、以下のXMLドキュメントを検証します。
<?xml version="1.0" encoding="UTF-8"?>
<so:root xmlns:so="http://stackoverflow.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://stackoverflow.com a.xsd">
<so:hierarchy1>
<so:foo so:key="1"/>
<so:bar so:key="2"/>
</so:hierarchy1>
<so:hierarchy2>
<so:foohandler so:keyref="1"/>
<so:barhandler so:keyref="2"/>
</so:hierarchy2>
</so:root>
<so:barhandler so:keyref="2"/>
に変更された場合、<so:barhandler so:keyref="1"/>
または<so:barhandler so:keyref="3"/>
ドキュメントが無効になった場合。
ここでの落とし穴は、名前空間を指定せず、の属性でxmlns:so="http://stackoverflow.com"
これと同じ名前空間を使用しないと、一部のパーサーはドキュメントの整合性を気にしないということです。xpath
xs:selector
xs:field
EclipseのXMLパーサー/バリデーターとこのオンラインツールは、XPath式が参照する名前空間を指定するまで、私のキー、keyref宣言についてのくだらないことをしませんでした。
一番下の石灰は、すべての名前空間を使用することである可能性がありますか?
この答えは私を私の関連性に導きます。