xsd – 我可以将属性限制为键或枚举吗?
xsd – can I restrict an attribute to a key OR enumeration?
我要允许example.xml
<defs>
<def n="a"/>
<def n="b"/>
</defs>
<refer-to-def n="a"/>
<refer-to-def n="b"/>
<refer-to-def n="predefined"/>
<refer-to-def n="also-predefined"/>
s.t。 //refer-to-def/@n
的唯一可能值是由 //def/@n
或 "predefined" 或“也预定义”给出的值。特别是,如果我添加 <refer-to-def n="never-defined"/>
它应该不再有效。
我可以用
做第一个限制
<xs:keyref name="defRef" refer="def">
<xs:selector xpath=".//refer-to-def" />
<xs:field xpath="@n" />
</xs:keyref>
<xs:key name="def">
<xs:selector xpath="./defs/def" />
<xs:field xpath="@n" />
</xs:key>
但是如果 .xml 有 <refer-to-def n="predefined"/>
.
这当然会失败
第二个限制我可以通过定义 <def>
的 n
属性来实现
<xs:attribute name="n" use="required">
<xs:simpleType>
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="predefined"/>
<xs:enumeration value="also-predefined"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
但这当然不包括 defs n 值的动态列表。
如何将两者结合起来,使 n 可以来自动态列表或来自预定义集,并且我的 example.xml 有效?
无法在 XSD 1.0 中完成。
在 XSD 1.1 中,您可以使用断言做任何事情。
我要允许example.xml
<defs>
<def n="a"/>
<def n="b"/>
</defs>
<refer-to-def n="a"/>
<refer-to-def n="b"/>
<refer-to-def n="predefined"/>
<refer-to-def n="also-predefined"/>
s.t。 //refer-to-def/@n
的唯一可能值是由 //def/@n
或 "predefined" 或“也预定义”给出的值。特别是,如果我添加 <refer-to-def n="never-defined"/>
它应该不再有效。
我可以用
做第一个限制<xs:keyref name="defRef" refer="def">
<xs:selector xpath=".//refer-to-def" />
<xs:field xpath="@n" />
</xs:keyref>
<xs:key name="def">
<xs:selector xpath="./defs/def" />
<xs:field xpath="@n" />
</xs:key>
但是如果 .xml 有 <refer-to-def n="predefined"/>
.
第二个限制我可以通过定义 <def>
的 n
属性来实现
<xs:attribute name="n" use="required">
<xs:simpleType>
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="predefined"/>
<xs:enumeration value="also-predefined"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
但这当然不包括 defs n 值的动态列表。
如何将两者结合起来,使 n 可以来自动态列表或来自预定义集,并且我的 example.xml 有效?
无法在 XSD 1.0 中完成。
在 XSD 1.1 中,您可以使用断言做任何事情。