2016-06-10 85 views
2

我與XSD工作,如:使用XSD中的屬性限制complexType?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 
    <xs:element name="algo"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="nota" type="t_algo" minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="t_algo"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[1][0]|[0-9]" /> 
    </xs:restriction> 
    <xs:attribute name="modul" type="t_modul"/> 
    </xs:complexType> 

    <xs:simpleType name="t_modul"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[m][0][0-9]"/> 
    </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

,並使用測試這樣的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<algo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="file:///D:/DAM/RECUF1/Mispruebas/telf.xsd"> 
    <nota modul="m01">0</nota> 
    <nota modul="m01">7</nota> 
    <nota modul="m01">3</nota> 
    <nota modul="m01">1</nota> 
</algo> 

我想要孩子nota與值0-10之間以及與屬性(0-9)之間的值modul,其值爲m0X,其中x。我認爲以前的XSD可以工作,但事實並非如此。有人可以解釋我做錯了什麼嗎?

+0

您爲't_modul'簡單類型指定的模式適用於標籤內包含的值,而不是該屬性的名稱。我相信該屬性的名稱是固定的,您可能必須爲您所期望的各種類型的屬性名稱定義標籤。 –

+0

不要告訴我們有什麼不行的。告訴我們它是如何失敗的。 –

回答

2

爲了與受限制內容的元素的屬性,定義新的xs:simpleType,然後用xs:extension將其與屬性擴展:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 

    <xs:element name="algo"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="nota" type="t_algo" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="t_algo"> 
    <xs:simpleContent> 
     <xs:extension base="t_algo_content"> 
     <xs:attribute name="modul" type="t_modul"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 

    <xs:simpleType name="t_modul"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="m0[0-9]"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="t_algo_content"> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="10"/> 
    </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

還請注意,我已經簡化你的正則表達式模式中第一種情況,並使用minInclusive/maxInclusive更自然地表達你的整數範圍在第二種情況下。