Указанная схема XSD для вложенных узлов XML

Я пытаюсь создать схему для XML-файла, но получаю ошибки проверки. У меня был большой опыт работы с XML, XSLT и DTD, но когда меня попросили создать файл XSD, я подумал, что смогу решить эту задачу. Меня попросили создать схему со следующими спецификациями:

    <payroll>
      <employee>+
        <name>
          <first>: string of upper/lowercase letters, spaces, or hyphens (-).
                   string must start with an uppercase letter
          <middle>?: upper case letter
          <last>: string of upper/lowercase letters, spaces, or hyphens (-).
                   string must start with an uppercase letter
        <spouse>? –- first, middle, last are the same type as for employee
          <first>
          <middle>?
          <last>
        <child>* -- first, middle, last are the same type as for employee
          <first>
          <middle>?
          <last>
        <tax-status> married | single | headOfHousehold | separated
        <ssn>: A nine digit number of the form ddd-dd-dddd (e.g, 865-57-2934)
            ssn attribute: name=type; values=(assigned | original); default="original"
        <salary>: A 9 digit number of the form ddddddd.dd with a minimum value of
                  0 and a maximum value of 2000000, inclusive.
        <date-of-birth>: A date type
        <manager> | <staff>
          <manager>
            attribute for manager: name=title; type=string; use=required
            <department>: string
            <yrsAtRank>: an inclusive integer between 0 and 50
          <staff>
            <skill>+: up to 5 skills, each being a string

Вот файл XML:

    <?xml version = "1.0"?>

    <employeelist:payroll xmlns:employeelist = "urn:myURN:employeelist">
    <employee>
      <name>
        <first>Brad</first>
        <middle>T</middle>
        <last>Vander Zanden</last>
      </name>
      <spouse>
          <first>Yifan</first>
          <last>Tang</last>
      </spouse>
      <tax-status>married</tax-status>
      <ssn type="assigned">186-39-3069</ssn>
      <salary>110000.00</salary>
      <date-of-birth>1964-02-03</date-of-birth>
      <manager title="professor">
        <department>Computer Science</department>
        <yrsAtRank>8</yrsAtRank>
      </manager>
    </employee>

    <employee>
      <name>
        <first>Don</first>
        <last>Juan</last>
      </name>
      <child>
        <first>Mary</first>
        <middle>H</middle>
        <last>Lamb</last>
      </child>
      <child>
        <first>Fred</first>
        <last>Flintstone</last>
      </child>
      <tax-status>headOfHousehold</tax-status>
      <ssn>586-38-3969</ssn>
      <salary>1553.83</salary>
      <date-of-birth>1980-07-07</date-of-birth>
      <staff>
        <skill>Carpentry</skill>
        <skill>Welding</skill>
        <skill>Plumbing</skill>
      </staff>
    </employee>
    </employeelist:payroll>

И.. вот XSD (ниже). Я не могу найти проблему. Валидатор W3C просто говорит: "Разметка плохо отформатирована". Любые подсказки или мысли? Заранее спасибо!

<?xml version = "1.0"?>

<schema xmlns = "http://www.w3.org/2001/XMLSchema"
    xmlns:employeelist = "urn:csc420:employeelist"
    targetNamespace = "urn:csc420:employeelist">

    <complexType name="employeeType">
        <sequence>
            <element name="employee" type="employeelist:singleEmployeeType"
                minOccurs="1" maxOccurs="unbounded"/>
        </sequence>
    </complexType>

    <complexType name="nameType">
        <sequence>
            <element name="first" type="string"/>
            <element name="middle" type="string"/>
            <element name="last" type="string"/>
        </sequence>
    </complexType>

    <complexType name="spouseType">
        <sequence>
            <element name="first" type="string"/>
            <element name="middle" type="string"/>
            <element name="last" type="string"/>
        </sequence>
    </complexType>

    <simpleType name="tax-statusType">
            <restriction base = "string">
                <enumeration value = "married"/>
                <enumeration value = "single"/>
                <enumeration value = "headOfHousehold"/>
                <enumeration value = "separated"/>
            </restriction>
    </simpleType>

    <simpleType name="ssnType">
        <restriction base = "int">
            <pattern value = "[0-9]{3}\-[0-9]{2}\-[0-9]{4}"/>
        </restriction>
    </simpleType>

    <simpleType name="salaryType">
        <restriction base="decimal">
            <minInclusive value="0.00"/>
            <maxInclusive value="200000000.00"/>
        </restriction>
    </simpleType>

    <simpleType name="date-of-birthType">
        <restriction base="decimal">
            <minInclusive value = "0"/>
            <maxInclusive value = "10"/>
        </restriction>
    </simpleType>

    <simpleType name="skillType">
        <restriction base="decimal">
            <minInclusive value = "1"/>
            <maxInclusive value="5"/>
        </restriction>
    </simpleType>

    <complexType name="managerType">
        <sequence>
            <element name="department" type="string"/>
            <element name="yrsAtRank" type="int"/>
        </sequence>
        <attribute name="title" type="string"/>
    </complexType>

    <complexType name="staffType">
        <sequence>
            <element name="skill" type="employeelist:skillType"/>
        </sequence>
    </complexType>

    <complexType name="singleEmployeeType">
        <sequence>
            <element name="name" type="employeelist:nameType"/>
            <element name="spouse" type="employeelist:spouseType"/>
            <element name="tax-status" type="employeelist:tax-statusType"/>
            <element name="ssn" type="employeelist:ssnType"/>
            <element name="salary" type="employeelist:salaryType"/>
            <element name="date-of-birth" type="date"/>
            <element name="manager" type="employeelist:managerType"/>
            <element name="staff" type="employeelist:staffType"/>
        </sequence>
    </complexType>

    <element name="payroll" type="employeelist:singleEmployeeType"/>

</schema>

1 ответ

Решение

Вы определили тип "payroll" как "singleEmployeeType", поэтому он ожидает элементы одного сотрудника (name, spouse и т. д.) прямо внутри <payroll> элемент. Это не соответствует вашему входному XML и не похоже, что вы это хотели.

Просто измените определение payroll элемент в вашем XSD для:

<element name="payroll" type="employeelist:employeeType"/>

В вашем XSD вы определили employeeType быть 1 или больше <employee> элементы. Я предлагаю вам исправить наименование типов в вашем XSD, чтобы оно соответствовало тому, принимает ли оно только один или несколько элементов. Любое соглашение, которое вы любите, хорошо, если оно последовательное. Вы могли бы переименовать employeeType в employeesType или же employeeListType до тех пор, пока вы будете последовательно использовать соглашение "множественное число" или "добавить список".

Другие вопросы по тегам