如何通过xs:unique使univoque成为我的枚举

时间:2009-09-15 18:26:26

标签: xsd attributes unique

有人能指出为什么我的XSD中的独特元素不会强制独特吗?这应该抛出错误,因为最后一个ScreenResult元素不包含Type属性的唯一值。我还应该注意到,我真正强迫Type ScreenResults ScreenResult中的一个<ScreenResults> <ScreenResult Type="Screen Type A">1</ScreenResult> <ScreenResult Type="Screen Type B">1</ScreenResult> <ScreenResult Type="Screen Type B">2</ScreenResult> </ScreenResults> 需要存在3次,有3种类型的屏幕,我需要独特的 - 因此,如果有更好的方法来实现这一点,我也是为了这一切。

谢谢。

这是我的XML片段:

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1">
    <xs:unique name="UniqueScreenResults">
        <xs:selector xpath="ScreenResult" />
        <xs:field xpath="@Type" />
    </xs:unique>
</xs:element>

<!--============  ScreenResults  =============-->
<xs:complexType name="ScreenResults">
    <xs:sequence minOccurs="1" maxOccurs="1">
        <xs:element name="ScreenResult" minOccurs="3" maxOccurs="3">
            <xs:complexType>
                <xs:simpleContent>
                    <xs:extension base="enum:ScreenResult">
                        <xs:attribute name="Type" type="enum:ScreenType" use="required" />
                    </xs:extension>
                </xs:simpleContent>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<!--=============  ScreenType  =============-->
<xs:simpleType name="ScreenType">
    <xs:restriction base='xs:token'>
        <xs:enumeration value='Screen Type A' >
            <xs:annotation>
                <xs:documentation>1</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='Screen Type B' >
            <xs:annotation>
                <xs:documentation>2</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='Screen Type C' >
            <xs:annotation>
                <xs:documentation>3</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>

<!--============  ScreenResult  ============-->
<xs:simpleType name="ScreenResult">
    <xs:restriction base='xs:token'>
        <xs:enumeration value='1' >
            <xs:annotation>
                <xs:documentation>Positive</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='2' >
            <xs:annotation>
                <xs:documentation>Negative</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='3' >
            <xs:annotation>
                <xs:documentation>Not administered</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>

这是我的XSD片段(另请注意我的原始XSD片段跨越多个文件,但我已经验证了我的所有命名空间都是正确的):

{{1}}

1 个答案:

答案 0 :(得分:10)

我正在为遇到此问题的其他人发布我的解决方案 虽然我断言我的所有命名空间都是正确的,但这当然是问题所在。除了唯一元素本身的之外,所有名称空间都是正确的 我错误地认为唯一元素不需要在命名空间中加上前缀,因为它在上下文中。但事实并非如此。因为我确实为文件声明了一个默认命名空间,所以我仍然需要前缀。

所以我唯一的改变和解决方案如下:

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1">
    <xs:unique name="UniqueScreenResults">
        <xs:selector xpath="import:ScreenResult" />
        <xs:field xpath="@Type" />
    </xs:unique>
</xs:element>