最初の要素 ( register
) に 2 番目の要素 ( ) がいくつか含まれている可能性がある 2 つの要素があるとしscale
ます。要素の@unit
属性scale
は a ですxs:key
(したがって、最初の要素内で一意です)。要素の「defaultScale」属性で名前を付けることができます。このような:xs:keyref
register
<xs:element name="register">
<xs:key name="scaleKey">
<xs:selector xpath="scale" />
<xs:field xpath="@unit" />
</xs:key>
<xs:keyref name="chooseDefaultScale" refer="scaleKey">
<xs:selector xpath="."/>
<xs:field xpath="@defaultScale"/>
</xs:keyref>
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="scale"/>
</xs:choice>
<xs:attribute name="defaultScale" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="scale">
<xs:complexType>
<xs:attribute name="scale" type="xs:float" use="required"/>
<xs:attribute name="unit" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
少なくとも 1つの子@defaultScale
が存在する場合、属性を強制的に存在させて有効にするにはどうすればよいですか?scale
私の最初の試みは、やのようにxs:key
の基本要素に別のものを追加することでした。どちらもコンパイルされません...register
try1
try2
<xs:element name="body">
<xs:key name="try1">
<xs:selector xpath=".//register/defaultScale" />
<xs:field xpath="../@defaultScale" /> <!-- not allowed -->
</xs:key>
<xs:key name="try2">
<xs:selector xpath=".//register[defaultScale]" /> <!-- not allowed -->
<xs:field xpath="@defaultScale" />
</xs:key>
<xs:sequence>
<xs:element ref="register"/>
<xs:sequence>
</xs:element>
子軸はxs:selector
andxs:field
要素でのみ使用できます。現時点での私の最善の推測:それは不可能ですか?