在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>
答
最后我发现这个问题。我使用默认名称空间(不要与名称空间混淆),并且我忘记了xpath表达式(即在唯一元素中)忽略默认名称空间。换句话说,xpath表达式无法达到默认名称空间元素。
我在XML中添加了名称空间的前缀,并且还在xpath表达式中添加了独特元素,现在它工作正常!
确切地了解问题的原因有点难,您能告诉我们与您的想法相比有什么不对吗? – flexd
我认为验证器应该报告一个错误,因为* cisloStavu *属性在两个* stav *元素中都是零,但它应该是唯一的。但验证员说没关系。 – Fido