どのような問題が発生しているかは完全にはっきりしていません。私はあなたがあなたの問題に言い聞かせた答えをあなたがあなたの問題を理解できないということに適応させることができないと仮定します。
与えられたコンテンツモデルは、box-type-1
からbox-type-4
までの任意の順序で出現することができます。 4つの要素があるので、4つの要素があります。 = 4 * 3 * 2 * 1 = 24個の可能なシーケンス。 DTDのような構文の単純な正規表現は、次のようになります。簡潔にするために、私は要素をb1
,b2
,b3
,b4
と呼ぶつもりです。
これまで
((b1, b2, b3, b4)
| (b1, b2, b4, b3)
| (b1, b3, b2, b4)
| (b1, b3, b4, b2)
| (b1, b4, b2, b3)
| (b1, b4, b2, b3)
| (b2, b1, b3, b4)
| (b2, b1, b4, b3)
| (b2, b3, b1, b4)
| (b2, b3, b4, b1)
| (b2, b4, b1, b3)
| (b2, b4, b3, b1)
| (b3, b1, b2, b4)
| (b3, b1, b4, b2)
| (b3, b2, b1, b4)
| (b3, b2, b4, b1)
| (b3, b4, b1, b2)
| (b3, b4, b2, b1)
| (b4, b1, b2, b3)
| (b4, b1, b3, b2)
| (b4, b2, b1, b3)
| (b4, b2, b3, b1)
| (b4, b3, b1, b2)
| (b4, b3, b2, b1)
)
、とても良い、しかし、2件の合併症があります:最初、コンテンツモデルはXMLのDTDとXSDスキーマの両方に決定論であることが要求されています。つまり、コンテンツモデル内の特定のトークン(またはxsd:要素要素)に、コンテンツ内の要素を先読みすることなく常に一致させる必要があります。しかし、コンテンツ内の最初のb1
は、コンテンツモデルのb1
の最初の6つの出現のいずれかと一致する可能性があります。これは許されないため、非決定論を排除するためにコンテンツモデルを書き直す必要があります。
だから我々は観察代数的アイデンティティを利用する、式を書き換えるその配列について、((
X
ABC)Y
|(XZDEFが))に等しい(X((YABC)|(ZDEF)))。そのIDによって示唆されているように、我々は一緒に共通の接頭辞を折る場合は、我々は正確に同じ言語を認識し、決定論的表現を生成: ((b1, ((b2, ((b3, b4) | (b4, b3)))
| (b3, ((b2, b4) | (b4, b2)))
| (b4, ((b2, b3) | (b3, b2)))))
| (b2, ((b1, ((b3, b4) | (b4, b3)))
| (b3, ((b1, b4) | (b4, b1)))
| (b4, ((b1, b3) | (b3, b1)))))
| (b3, ((b1, ((b2, b4) | (b4, b2)))
| (b2, ((b1, b4) | (b4, b1)))
| (b4, ((b1, b2) | (b2, b1)))))
| (b4, ((b1, ((b2, b3) | (b3, b2)))
| (b2, ((b1, b3) | (b3, b1)))
| (b3, ((b1, b2) | (b2, b1))))))
は、今、私たちは、第二の合併症をヒット:これは、それ以来、私たちが望むかなりの言語ではありません4つの要素すべてを義務づけます。b2
作りへ
単純なアプローチ - b4
オプションは、それがこのような形のものを持っていますので、式の中でそれらのそれぞれに疑問符を追加するには、次のようになります。
((b1, ((b2?, ((b3?, b4?) | (b4?, b3?)))
| (b3?, ((b2?, b4?) | (b4?, b2?)))
| (b4?, ((b2?, b3?) | (b3?, b2?)))))
| (b2?, ...)
| (b3?, ...)
| (b4?, ...))
しかし、この再紹介非決定論(non-determinism):入力シーケンスb1
,b2
は、示された式の部分のちょうど5つの方法と一致します。正しい修正はそのしばらく観察することです(????(X、Yを)|(Y、X))、式((X、Y非決定論的ですか? )|(y,x?))?決定論的であり、同じ言語を受け入れます。それが不要と望ましくないので、我々は、オプションとして、第1 b1
の左に任意のトークンをマークしない
((b1, ((b2, ((b3, b4?) | (b4, b3?))?)
| (b3, ((b2, b4?) | (b4, b2?))?)
| (b4, ((b2, b3?) | (b3, b2?))?))?)
| (b2, ((b1, ((b3, b4?) | (b4, b3?))?)
| (b3, ((b1, b4?) | (b4, b1)))
| (b4, ((b1, b3?) | (b3, b1)))))
| (b3, ((b1, ((b2, b4?) | (b4, b2?))?)
| (b2, ((b1, b4?) | (b4, b1)))
| (b4, ((b1, b2?) | (b2, b1)))))
| (b4, ((b1, ((b2, b3?) | (b3, b2?))?)
| (b2, ((b1, b3?) | (b3, b1)))
| (b3, ((b1, b2?) | (b2, b1))))))
注:この原則を適用すると、私たちは適切に私たちの表現を書き換えることができます。なぜなら、一般性を失うことなく、常に検証される入力に現れないオプションの要素は、上記の順列の1つの終わりから省略されたと仮定しているからです。非決定性を再導入するため望ましくない。
この式からXSDへの変換は簡単で、読者の練習として残しておきます。
[これを読んでXMLオタクのための注:その他は今読んで停止することがあります。]
私は疑問符なし左折り畳ま式を生成するために書いたXQuery関数が対象となり得る。
declare function local:all-to-choice-of-seq(
$ids as xs:string*
) as xs:string {
let $n := count($ids)
return if ($n eq 1) then $ids
else '(' ||
string-join(for $id in $ids
let $rest := $ids[. ne $id]
return '(' || $id || ', '
|| local:all-to-choice-of-seq($rest) || ')',
' | ')
|| ')'
};
呼び出し:
let $gis := ('b1', 'b2', 'b3', 'b4')
return local:all-to-choice-of-seq($gis)
シンプルextensiいくつかの要素が必要な作るために、他のオプションは次のようになります上:
declare function local:all-to-choice-of-seq2(
$req as xs:string*,
$opt as xs:string*
) as xs:string {
local:all-to-choice-of-seq-aux(($req,$opt), $req)
};
declare function local:all-to-choice-of-seq-aux(
$ids as xs:string*,
$req as xs:string*
) as xs:string {
let $n := count($ids)
return
if ($n eq 1) then
if (exists($req)) then $ids else $ids || '?'
else '(' ||
string-join(for $id in $ids
let $rest := $ids[. ne $id],
$req2 := $req[. ne $id]
return '(' || $id || ', '
|| local:all-to-choice-of-seq-aux($rest, $req2) || ')'
|| (if (exists($req)) then '' else '?'),
' | ')
|| ')'
};
呼び出し:local:all-to-choice-of-seq2('b1', ('b2', 'b3', 'b4'))
しかし、これは厳密には必要以上の疑問符を挿入します。私は良い方法を見つけられませんでした(または、より正直なところ、の方法)emit '?'必要なときにのみ。
Impressiv +あなたの前提が正しい。あなたの投資時間のおかげで多くのありがとう。私は幸運にもオタク部分(un)を好きで理解しています。 – uL1