XML模式1.1:复杂循环关系检查
这将是一个复杂的问题,因此如果您不完全熟悉XMLSchema1.1,您可能无法回答这个问题 但是,此验证检查是针对XML模式1.1 Nerds:) 我有一个如下所示的XML:XML模式1.1:复杂循环关系检查,xml,xslt,xsd,xpath-2.0,xsd-1.1,Xml,Xslt,Xsd,Xpath 2.0,Xsd 1.1,这将是一个复杂的问题,因此如果您不完全熟悉XMLSchema1.1,您可能无法回答这个问题 但是,此验证检查是针对XML模式1.1 Nerds:) 我有一个如下所示的XML: <HTMLFile filename="N40139"> <variant>2</variant> <overlayTitle>Job Cards</overlayTitle> <groups> <grou
<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>
2.
工作卡
真的
拆卸恒温器
03-8.2.12.15-10.13.35_MTU_20V8000M91
0
03
30
真的
拆卸恒温器2
03-8.2.12.15-10.13.35_MTU_20V8000M91
35
45
55
这是用于验证此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模式中的最后两个注释作为代码创建
这就是任务
变量
的值为3,则组->组元素的长度只能是一个(一个元素/对象)的值为1或2,则需要在所有组->组上循环。在迭代过程中,我们将每个组的src
值保存在一个临时变量中,以便我们可以检查下一个组的src是否相同。如果是这样,我们需要迭代该组的所有步骤和前一组的步骤。仅当第二组的第一个步骤
开始
元素大于第一组的步骤
开始
点时,才有效
变量
的值为1或2,则再次需要循环所有组->组和嵌套的步骤
元素。步骤
元素的每个开始
元素必须大于上一个步骤
开始
。因此,如果有一个属性为number=“1”
的步骤
,并且它的start
元素的值为3,那么带有number=“2”
的下一步只能有一个start
<3
。这是必须检查的
因为你没有解释你发现的困难是什么,所以除了一般性的建议之外,你不可能提供任何东西(或者仅仅为你解决你的问题,这真的没有抓住要点) 您的问题似乎主要是不确定如何用XPath表示约束 让我们从你已经写过的简单内容开始。注释说“
overlaytle
在变量3中是不允许的”,这似乎与断言(variant=3或overlaytle)
不兼容,该断言将允许
<HTMLFile filename="N40139">
<variant>3</variant>
<overlayTitle>Job Cards</overlayTitle>
...
变量3上的其他约束条件也是如此
对于您尚未考虑的三个约束条件
if (variant eq 3) then not(overlayTitle) else true()
not(variant eq 3 and overlayTitle)
variant ne 3 or not(overlayTitle)