XML-схема 1.1: проверка связи сложных циклов

Это будет сложный вопрос, поэтому, если вы не совсем знакомы с XML Schema 1.1, вы можете не ответить на этот вопрос.

Однако эта проверка правильности предназначена для Nerds XML Schema 1.1:)

У меня есть XML, как следующий:

<HTMLFile filename="N40139">
    <variant>2</variant>
    <overlayTitle>Job Cards</overlayTitle>
    <groups>
        <group>
            <groupTitleBtn>true</groupTitleBtn>
            <name>Removing thermostat</name>
            <src>03-8.2.12.15-10.13.35_MTU_20V8000M91</src>
            <steps>
                <step number="1">
                    <start>0</start>
                </step>
                <step number="2">
                    <start>03</start>
                </step>
                <step number="4">
                    <start>30</start>
                </step>
            </steps>
        </group>
        <group>
            <groupTitleBtn>true</groupTitleBtn>
            <name>Removing thermostat2</name>
            <src>03-8.2.12.15-10.13.35_MTU_20V8000M91</src>
            <steps>
                <step number="1">
                    <start>35</start>
                </step>
                <step number="2">
                    <start>45</start>
                </step>
                <step number="4">
                    <start>55</start>
                </step>
            </steps>
        </group>
    </groups>
</HTMLFile>

Это моя существующая схема XML для проверки этого XML:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">

<xs:element name="HTMLVideoMapper">
    <xs:complexType>
        <xs:sequence>

            <xs:element name="HTMLFile" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="variant" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:integer">
                                    <xs:minInclusive value="1"/>
                                    <xs:maxInclusive value="3"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>

                        <xs:element name="overlayTitle" type="xs:string" minOccurs="0" maxOccurs="1"/>

                        <xs:element name="groups" minOccurs="1" maxOccurs="1">
                            <xs:complexType>
                                <xs:sequence>

                                    <xs:element name="group" minOccurs="1" maxOccurs="unbounded">
                                        <xs:complexType>
                                            <xs:sequence>

                                                <xs:element name="groupTitleBtn" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
                                                <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
                                                <xs:element name="src" type="xs:string" minOccurs="1" maxOccurs="1"/>

                                                <xs:element name="steps" minOccurs="0" maxOccurs="1">
                                                    <xs:complexType>
                                                        <xs:sequence>
                                                            <xs:element name="step" minOccurs="1" maxOccurs="unbounded">
                                                                <xs:complexType>
                                                                    <xs:sequence>

                                                                        <xs:element name="start" minOccurs="1" maxOccurs="1">
                                                                            <xs:simpleType>
                                                                                <xs:restriction base="xs:integer">
                                                                                    <xs:minInclusive value="0"/>
                                                                                    <xs:maxInclusive value="999"/>
                                                                                </xs:restriction>
                                                                            </xs:simpleType>
                                                                        </xs:element>
                                                                        <xs:element name="src" type="xs:string" minOccurs="0" maxOccurs="1"/>
                                                                        <xs:element name="end" type="xs:string" minOccurs="0" maxOccurs="1"/>

                                                                    </xs:sequence>
                                                                    <xs:attribute name="number" type="xs:integer" use="required"/>
                                                                </xs:complexType>
                                                            </xs:element>
                                                        </xs:sequence>
                                                    </xs:complexType>
                                                </xs:element>

                                            </xs:sequence>

                                        </xs:complexType>
                                    </xs:element>

                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>

                    </xs:sequence>
                    <xs:attribute name="filename" type="xs:string" use="required" />

                    <!-- overlayTitle is not allowed in variant 3 -->
                    <xs:assert test="(variant = 3 or overlayTitle)" />

                    <!-- groups/group/name is not allowed in variant 3 -->
                    <xs:assert test="(variant = 3 or groups/group/name)" />

                    <!-- groups/group/groupTitleBtn is not allowed in variant 3 -->
                    <xs:assert test="(variant = 3 or groups/group/groupTitleBtn)" />

                    <!-- groups/group/steps is not allowed in variant 3 -->
                    <xs:assert test="(variant = 3 or groups/group/steps)" />

                    <!-- in variant 3 only one group is allowed -->

                    <!-- if the group src in two groups is the same,
                    than the nested step-elements of the second group can 
                    not have a smaller value than the last nested step-element 
                    in the first group -->
                </xs:complexType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>
</xs:element>

Однако есть три ограничения, которые мне нужно проверить. Я сам успешно построил эту XML-схему, но теперь я достиг предела своего опыта. Я не смог создать последние два комментария в XML-схеме как код.

Это задачи

  1. Если элемент variant имеет значение 3, тогда длина групп -> групповых элементов может быть только одна (один элемент / объект).
  2. Если variant имеет значение 1 или 2, чем необходимо перебрать все группы -> группа. Итерируя, мы сохраняем src ценность каждого group во временной переменной, чтобы мы могли проверить в следующем group если src такой же. Если это так, нам нужно выполнить итерации по всем шагам этой группы и шагам предыдущей группы. Является ли действительным только то, что первый stepstart элементы второй группы больше, чем stepstart точка первой группы.
  3. Если variant имеет значение 1 или 2, то снова необходимо перебрать все группы -> группа и вложенные step элементы. каждый start элемент step элемент должен быть больше предыдущего stepstart, Так что если есть step с атрибутом number="1" и start элемент имеет значение 3, чем следующий шаг с number="2" может иметь только start>3, Это необходимо проверить.

1 ответ

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

Похоже, ваша проблема в основном в том, что вы не знаете, как выразить свои ограничения в XPath.

Давайте начнем с простых, которые вы уже написали. Комментарий гласит "overlayTitle не допускается в варианте 3", что, как представляется, несовместимо с утверждением (variant = 3 or overlayTitle), что позволило бы

<HTMLFile filename="N40139">
  <variant>3</variant>
  <overlayTitle>Job Cards</overlayTitle>
  ...

потому что XPath или включительно, а не эксклюзивно. Я думаю, что вы имеете в виду любой из

if (variant eq 3) then not(overlayTitle) else true()
not(variant eq 3 and overlayTitle)
variant ne 3 or not(overlayTitle)

И аналогично для других ограничений варианта 3.

Для трех ограничений, которые вы еще не смогли сформулировать, я рекомендую вам взглянуть на

  • count() функция (которая может сказать вам, сколько случаев groups/group имеются)

  • количественные выражения (которые могут проверять условие на каждом экземпляре groups/groupв том числе сложные, которые вы описываете)

  • общие сравнения значений (которые могут сравнивать все шаги, происходящие от $group1 и $group2, чтобы увидеть, являются ли какие-либо потомки $group2 меньше или равны любым потомкам $group1: $group2//step/start &lt;= $group1//step/start - ты, конечно, захочешь это отрицать).

Конечно, проверка была бы намного проще, если бы в XML было меньше избыточности, и если вы дали варианты 1, 2 и 3 разных имен.

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