我有以下XML:
<enumTypes xmlns="tempURI">
<enumType id="1">
<enumValue id="1" value="Item1"/>
<enumValue id="2" value="Item2"/>
<enumValue id="3" value="Item3"/>
</enumType>
<enumType id="2">
<enumValue id="1" value="Item1"/>
<enumValue id="2" value="Item2"/>
</enumType>
</enumTypes>
我也有以下架构:
<xs:element name="enumTypes">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumType">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumValue">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:key name="enumTypeKey">
<xs:selector xpath="enumTypes/enumType"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="enumValueKey">
<xs:selector xpath="enumTypes/enumType/enumValue"/>
<xs:field xpath="@id"/>
</xs:key>
我正在尝试强制enumValue ID在enumType中是唯一的,但到目前为止我只能强制它在所有enumTypes中强制它们是唯一的。
我猜我的选择器XPath存在问题,但我似乎无法解决它。
任何帮助将不胜感激!
答案 0 :(得分:3)
我认为你只提供了xsd的片段?如果您可以提供工作代码段,则更容易调试。我添加了一个周围的<element name="root">
以使其验证。
问题似乎是enumValueKey
选择器对所有enumValues
中的所有enumType
进行了分组;但您只想将这些内容归为一个enumType
。
我能看到解决问题的唯一方法是将<key>
的{{1}}移到enumValues
元素中(并调整enumType
选择器),这样整个事情变成了:
xpath
这是有效的,因为它允许你的XML示例,并且它禁止使用以下片段(有两个<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="enumTypes">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumType">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="enumValue">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
<xs:key name="enumValueKey">
<xs:selector xpath="enumValue"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="enumTypeKey">
<xs:selector xpath="enumTypes/enumType"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
):
1
如果这对您有用,请告诉我。如果还有其他方法可以表达这一点,我也很感兴趣。
答案 1 :(得分:0)
我认为你的xs:key语句将在<xs:element name="enumTypes">
元素内写入。所以:
<xs:element name="enumTypes">
... what you want ...
<xs:key ... and so on
</xs:element>