Использование xsd 1.1 assert для проверки диапазона - PullRequest
0 голосов
/ 13 июня 2018

Мне дали задание создать файл XSD, который проверяет данные о промысле, поступающие в файлы XML.Используемые данные перечисляют всю рыбу, которая была поймана во время поездки на рыбалку (со всеми подробностями) во время поездки на рыбалку, такой как код вида, длина, пол и т. Д. Первая часть проверки состоит в том, чтобы проверить, что код вида является действительными я сделал эту проверку, перечислив весь действительный sp_code в перечислении и проверив sp_code по этому списку.Ниже приведен улов из файла xml

  <CATCH>
    <CATCH_ID>1</CATCH_ID>
    <CATCH_DATE>2017-06-02T05:27:49Z</CATCH_DATE>
    <SP_CODE>ALB</SP_CODE>
    <LEN>103</LEN>
    <SEX_CODE>U</SEX_CODE>
    <LAT>-2033.126</LAT>
    <LON>+17602.598</LON>
  <CATCH>

Первая часть, которую мне удалось сделать, это проверить, является ли введенный SP_CODE действительным:

        <xs:element name="CATCH" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="SP_CODE" minOccurs="0">
                        <xs:simpleType>
                            <xs:restriction base="SP_ENUM">
                                <xs:assertion/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="LEN" type="xs:integer" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

    <xs:simpleType name="SP_ENUM">
    <xs:restriction base="xs:string">
        <xs:enumeration value="ALB"/>
        <xs:enumeration value="ALO"/>
        <xs:enumeration value="ALX"/>
        <xs:enumeration value="BAR"/>
        <xs:enumeration value="BET"/>
    </xs:restriction>
    </xs:simpleType>

Однако есть вторая частьэто немного испортило мою голову (новичок в этой проверке xsd. Проблема в том, что в зависимости от разновидности_кода есть диапазон длины, например, если sp_code - BET - для большого глаза у тунца длина LENGTH должна быть в диапазоне 50-200 см,иначе, если SP_CODE - ALB - для albacore, тогда длина должна быть в диапазоне 50-140 см и т. д. Это простое бизнес-правило, которое я хотел бы проверить в своем xsd. Я выполняю поиск и показываю, что xsd 1.1Утверждения - один из способов, но просто неясно, как их можно использовать для решения этой проблемы. Любой совет?

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете написать одно сложное утверждение или множество маленьких утверждений (каждое из которых должно быть правдой).Я бы использовал последний подход, потому что легче понять, что не так, если утверждение не выполнено.Типичные утверждения могут быть

<xs:assert test="if (SP_CODE eq 'ALB') then (LEN ge 50) else true()"/>
<xs:assert test="if (SP_CODE eq 'ALB') then (LEN le 250) else true()"/>

Эти элементы должны отображаться как дочерние элементы <xs:element name="CATCH"> после <xs:complexType>.Они не относятся к SP_CODE, как в вашем примере, потому что они не влияют на то, что является действительным SP_CODE, а только на то, что является действительным CATCH.

else true() - утомительный шаблон, необходимый для удовлетворенияПравила синтаксиса XPath.В основном это говорит о том, что если условие «если» не применяется, то утверждение не накладывает ограничений.

...