假设我有两个元素,其中第一个 ( register
) 可能包含多个第二个 ( scale
)。元素的@unit
属性scale
是 a xs:key
(因此在第一个元素中是唯一的)。它可以在元素xs:keyref
的“defaultScale”属性中命名为 a 。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>
如果至少存在一个孩子,我如何强制该@defaultScale
属性存在且有效?scale
我的第一次尝试是在xs:key
的基本元素中添加另一个register
,例如 intry1
和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
元素中使用子轴。所以我目前最好的猜测:这不可能吗?