Xsd 如何将这种不确定的XML模式重写为确定性模式?

Xsd 如何将这种不确定的XML模式重写为确定性模式?,xsd,ambiguity,deterministic,Xsd,Ambiguity,Deterministic,为什么这是不确定的,如何解决 <xs:element name="activeyears"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="1"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:elemen

为什么这是不确定的,如何解决

 <xs:element name="activeyears">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="1">
                <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="from" minOccurs="1" maxOccurs="1"/>
                    <xs:element ref="till" minOccurs="1" maxOccurs="1"/>
                </xs:sequence>
                <xs:element ref="from" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


这意味着
要么是空的,要么包含
序列,该序列以
开头,但可以以任何一个结尾。

这是对代码的简单编辑;我没有试过:

 <xs:element name="activeyears">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="1">
                <xs:element ref="from" minOccurs="1" maxOccurs="1"/>
                <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="till" minOccurs="1" maxOccurs="1"/>
                    <xs:element ref="from" minOccurs="0" maxOccurs="1"/>
                </xs:sequence>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

一些背景知识:XMLSchema是一种非常简单的语法,schema处理器是一种解析器,它试图将该语法的规则应用于输入文件。然而,与传统编译器使用的解析器不同,XML模式没有前瞻性。因此,不能有两个规则共享相同的初始标记集(元素名称)

因此,我所做的具体更改:

  • 我没有改变你的外部
    序列
    ;它控制“空或有特定内容”要求
  • 如果有内容,必须以“from”开头;所以我在序列中创建了第一个
    元素
    ,带有显式的出现计数
  • 因为我使用“from”作为显式元素,所以必须颠倒子序列的顺序
  • 除非您想指定每个“直到”后面必须跟一个“从”,否则您需要放松子序列中的
    minOccurs
  • 子序列还处理单个from/till的情况——正如一位评论员所指出的,我用
    minOccurs='0'
    进行的第二次编辑允许两个“till”的终止序列

    • 这是对代码的简单编辑;我没有试过:

       <xs:element name="activeyears">
              <xs:complexType>
                  <xs:sequence minOccurs="0" maxOccurs="1">
                      <xs:element ref="from" minOccurs="1" maxOccurs="1"/>
                      <xs:sequence minOccurs="0" maxOccurs="unbounded">
                          <xs:element ref="till" minOccurs="1" maxOccurs="1"/>
                          <xs:element ref="from" minOccurs="0" maxOccurs="1"/>
                      </xs:sequence>
                  </xs:sequence>
              </xs:complexType>
          </xs:element>
      
      
      
      一些背景知识:XMLSchema是一种非常简单的语法,schema处理器是一种解析器,它试图将该语法的规则应用于输入文件。然而,与传统编译器使用的解析器不同,XML模式没有前瞻性。因此,不能有两个规则共享相同的初始标记集(元素名称)

      因此,我所做的具体更改:

      • 我没有改变你的外部
        序列
        ;它控制“空或有特定内容”要求
      • 如果有内容,必须以“from”开头;所以我在序列中创建了第一个
        元素
        ,带有显式的出现计数
      • 因为我使用“from”作为显式元素,所以必须颠倒子序列的顺序
      • 除非您想指定每个“直到”后面必须跟一个“从”,否则您需要放松子序列中的
        minOccurs
      • 子序列还处理单个from/till的情况——正如一位评论员所指出的,我用
        minOccurs='0'
        进行的第二次编辑允许两个“till”的终止序列
      当有两个分支以同一元素开头时,模式是不确定的,因此,如果不查看该元素,就无法判断要采用哪个分支。一个简单的例子是
      ab | ac
      ——当你看到
      A
      时,你不知道该选择哪个分支。对于循环,“分支”是重复循环,还是在循环之后继续。这方面的一个例子是
      a*a
      ——一旦进入循环,并且阅读了
      a
      ,您就不知道是重复循环,还是继续循环

      查看您的示例模式,假设它刚刚解析了一个
      ,现在需要解析一个
      。您可以使用
      循环或最后一个
      来解析它。仅仅通过查看
      ,您无法判断要使用哪个分支。你只能进一步向前看才能知道


      坏消息:我认为您的示例模式是非常罕见的,无法确定地表达

      下面是您想要接受的XML文档(我对每个元素使用一个字母,其中
      a
      =
      ..
      b
      =
      ..

      …你明白了。问题是,任何字母都可以是序列中的最后一个字母,也可以是循环的一部分。除非看下面的字母,否则无法判断它是哪一个字母。因为“确定性”意味着你不做这种前瞻(根据定义),您想要的语言无法确定地表达

      简化您的模式,它尝试一种类似于
      (ab)*a?
      -的方法,但两个分支都以
      a
      开始。另一种方法是
      a(ba)*b?
      -现在两个分支都以
      b
      开始。我们不能赢

      从技术上讲,模式将接受的所有文档集称为该模式的语言。如果不存在能够表达语言的确定性模式,则该语言称为“一种不明确的语言”

      有关理论讨论,请参阅Bruggemann Klein的系列论文(例如和)。 她为一种明确的语言提供了一个正式的测试。

      当有两个分支以同一元素开头时,模式是不确定的——因此,如果不事先查看该元素,就无法判断要采用哪个分支。一个简单的例子是
      ab | ac
      ——当您看到
      a
      时,您不知道要使用哪个分支以循环为例,“分支”是重复循环,还是在循环之后继续。例如
      a*a
      ——一旦进入循环,并且读到
      a
      ,您就不知道是重复循环,还是继续

      查看您的示例模式,假设它刚刚解析了一个
      ,现在需要解析一个
      。您可以使用
      循环或最后的
      来解析它。您不知道是哪一个