在XML方案中使用唯一元素

问题描述:

我正在尝试使用唯一元素来确保其中一个属性的唯一性。属性 cisloStavu元素stav我想要是唯一的具有相同的值为它的两个实例,但validator说的没关系。我已经阅读了很多关于这方面的指导,现在我很困惑,因为它看起来像我做的那样正确。在XML方案中使用唯一元素

这里是我的XML文件(重要行被注释掉):

<?xml version="1.0" encoding="UTF-8"?> 
<Automat nazevKrizovatky="" xmlns="urn:x-fido:schemata:automat-severka" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:x-fido:schemata:automat-severka automat.xsd "> 
    <stav cisloStavu="0" interval="0">     <-- first occurence of cisloStavu="0" --> 
    <nasledujiciStav>0</nasledujiciStav> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    </stav> 
    <stav cisloStavu="0" interval="0">    <-- second occurence of cisloStavu="0" --> 
    <nasledujiciStav>0</nasledujiciStav> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semafor cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    <semaforProChodce cisloSemaforu="0" stavSemaforu="zelena"/> 
    </stav> 
</Automat> 

,这里是方案:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="urn:x-fido:schemata:automat-severka" 
      elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="urn:x-fido:schemata:automat-severka"> 



    <xs:simpleType name="intervalType"> 
     <xs:restriction base="xs:nonNegativeInteger"></xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="cisloStavuType"> 
     <xs:restriction base="xs:nonNegativeInteger"></xs:restriction></xs:simpleType> 

    <xs:simpleType name="nasledujiciStavType"> 
     <xs:restriction base="xs:nonNegativeInteger"></xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="StavType"> 
     <xs:sequence> 
      <xs:element name="nasledujiciStav" type="nasledujiciStavType" minOccurs="1" maxOccurs="unbounded"> 
      </xs:element> 
      <xs:element name="semafor" type="semaforType" minOccurs="8" maxOccurs="8"> 
      </xs:element> 
      <xs:element name="semaforProChodce" type="semaforProChodceType" minOccurs="8" maxOccurs="8"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="cisloStavu" type="cisloStavuType" use="required"></xs:attribute> 
     <xs:attribute name="interval" type="intervalType" use="required"></xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="AutomatType"> 
     <xs:sequence> 
      <xs:element name="stav" type="StavType" maxOccurs="unbounded"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="nazevKrizovatky" type="nazevKrizovatkyType" use="required"></xs:attribute> 
    </xs:complexType> 

    <xs:element name="Automat" type="AutomatType"> 
     <xs:unique name="unikatni_stav">   <-- unique element --> 
      <xs:selector xpath="stav" /> 
      <xs:field xpath="@cisloStavu" /> 
     </xs:unique> 
    </xs:element> 

    <xs:simpleType name="nazevKrizovatkyType"> 
     <xs:restriction base="xs:string"></xs:restriction> 
    </xs:simpleType> 


    <xs:simpleType name="cisloSemaforuType"> 
     <xs:restriction base="xs:nonNegativeInteger"></xs:restriction></xs:simpleType> 

    <xs:simpleType name="stavSemaforuType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="zelena"></xs:enumeration> 
      <xs:enumeration value="červena"></xs:enumeration> 
      <xs:enumeration value="pozorZelena"></xs:enumeration> 
      <xs:enumeration value="pozorČervena"></xs:enumeration> 
      <xs:enumeration value="zelenaVprvavo"></xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="semaforType"> 
     <xs:attribute name="cisloSemaforu" type="cisloSemaforuType" use="required"></xs:attribute> 
     <xs:attribute name="stavSemaforu" type="stavSemaforuType" use="required"></xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="semaforProChodceType"> 
     <xs:attribute name="cisloSemaforu" type="cisloSemaforuType" use="required"></xs:attribute> 
     <xs:attribute name="stavSemaforu" type="stavSemaforuProChodceType" use="required"></xs:attribute> 
    </xs:complexType> 

    <xs:simpleType name="stavSemaforuProChodceType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="zelena"></xs:enumeration> 
      <xs:enumeration value="červena"></xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 
+0

确切地了解问题的原因有点难,您能告诉我们与您的想法相比有什么不对吗? – flexd

+0

我认为验证器应该报告一个错误,因为* cisloStavu *属性在两个* stav *元素中都是零,但它应该是唯一的。但验证员说没关系。 – Fido

最后我发现这个问题。我使用默认名称空间(不要与名称空间混淆),并且我忘记了xpath表达式(即在唯一元素中)忽略默认名称空间。换句话说,xpath表达式无法达到默认名称空间元素。

我在XML中添加了名称空间的前缀,并且还在xpath表达式中添加了独特元素,现在它工作正常!