1

なぜこれが非決定的であり、それを修正する方法は?

 <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>

<activeyears>これは、が空であるか、シーケンスが含まれていることを意味することになっています。シーケンスは、<from><till>で始まり、<from>どちらかで終わる可能性があります。

4

2 に答える 2

7

同じ要素で始まる2つのブランチがある場合、スキーマは非決定的です。そのため、その要素の後で先を見越さずに、どちらのブランチを取るかを判断することはできません。簡単な例は次のとおりです。ab|acを表示するaと、どのブランチを取るべきかわかりません。ループの場合、「分岐」とは、ループを繰り返すか、ループの後に続行するかを意味します。この例は次のa*aとおりです。ループに入ってからを読んだら、aループを繰り返すか続行するかがわかりません。

サンプルスキーマを見て、それが。を解析したばかり<till>で、今度はを解析する必要があると想像してください<from><from><till>ループまたはfinalで解析できます<from>。それを見ただけでは、どのブランチを使用するかはわかりません<from>。あなたはさらに先を見越してしか分からない。


悪いニュース:あなたのサンプルスキーマは非常にまれなものだと思います。決定論的に表現することは不可能です。

受け入れたいXMLドキュメントは次のとおりです(各要素に1文字を使用しています。ここで、a=<from>...</from>およびb= <to>...</to>

*empty*
a
ab
aba
abab
ababa
ababab
...

...あなたはアイデアを得る。問題は、任意の文字がシーケンスの最後の文字になること、ループの一部になることもあるということです。次の手紙を先読みする以外に、それがどちらになるかを知る方法はありません。「決定論的」とは、(定義上)この先読みを行わないことを意味するため、必要な言語を決定論的に表現することはできません。

スキーマを単純化すると、-と同様のアプローチが試行されます(ab)*a?が、両方のブランチは。で始まりaます。もう1つのアプローチはa(ba)*b?、両方のブランチが。で始まるようになったことbです。勝てない!

技術的には、スキーマが受け入れるすべてのドキュメントのセットは、そのスキーマの言語と呼ばれます。言語を表現できる決定論的スキーマが存在しない場合、その言語は「1つのあいまい」と呼ばれます。

理論的な議論については、Bruggemann-Kleinによる一連の論文を参照してください(たとえば、決定論的正規言語1つの明確な正規言語)。彼女には、明確な言語の正式なテストが含まれています。

于 2009-12-24T01:51:43.297 に答える
0

これはコードの簡単な編集です。私はそれを試していません:

 <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>

背景:XMLスキーマは非常に単純な文法であり、スキーマプロセッサは、この文法の規則を入力ファイルに適用しようとするパーサーです。ただし、従来のコンパイラで使用されるパーサーとは異なり、XMLスキーマには先読みがありません。したがって、同じ初期トークンセット(要素名)を共有する2つのルールを持つことはできません。

だから、私が行った特定の変更:

  • 私はあなたのアウターをsequence変更せずに残しました。「空または特定のコンテンツがある」要件を制御します。
  • コンテンツがある場合は、「from」で始まる必要があります。だから私はそれをelementシーケンスの最初のものにし、明示的な発生カウントを使用しました
  • 明示的な要素として「from」を使用したため、サブシーケンスの順序を逆にする必要がありました。
  • また、すべての「till」の後に「from」が続く必要があることを指定しない限りminOccurs、サブシーケンスでを緩和する必要があります。
  • サブシーケンスは、単一のfrom / tillの場合も処理します。コメント投稿者が指摘したように、2回目の編集では、minOccurs='0'2つの「till」の終了シーケンスが許可されています。
于 2009-12-23T14:20:37.417 に答える