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