XML模式1.1:复杂循环关系检查

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

这将是一个复杂的问题,因此如果您不完全熟悉XMLSchema1.1,您可能无法回答这个问题

但是,此验证检查是针对XML模式1.1 Nerds:)

我有一个如下所示的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>

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)