2016-03-21 10 views
1

私はルールエンジンを記述していますが、ユーザーは任意の順序でルールを指定できますが、一度指定すると、設定された順序で実行されます。何かのように、このxsd:sequenceを使用せずに順序を強制する方法?

<RuleEngine> 
    <Rule1 ..> 
    <Rule2 ..> 
    <Rule3 ...> 
</RuleEngined> 

(実行:Rule1 - >Rule2 - >Rule3

など

この

<RuleEngine> 
    <Rule3 ..> 
    <Rule1 ..> 
    <Rule2 ...> 
</RuleEngine> 

(実行:Rule3 - >Rule1 - >Rule2

私はこのためのスキーマを書いており、欲望を得ることができません結果はxsd:allまたはxsd:sequenceとなります。 xsd:allを使用すると、ユーザーに柔軟性を与えることができますが、解析中はコードの順序を保持しません。

<xs:element name="RuleEngine"> 
     <xs:complexType> 
     <xs:all> 
       <xs:element ref="Rule1" .. 
       <xs:element ref="Rule2" .. 
       <xs:element ref="Rule3" .. 
     </xs:all> 
     </xs:complexType> 
    </xs:element> 

私はCODEで、それは開発者がオーダーをお知らせしますけれども、それは、彼らの選択の順に規則を指定してからユーザーを防ぐことができます他に、いずれかのxsd:sequenceを使用することはできません。

<xs:element name="RuleEngine"> 
     <xs:complexType> 
     <xs:sequence> 
       <xs:element ref="Rule1" .. 
       <xs:element ref="Rule2" .. 
       <xs:element ref="Rule3" .. 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

thread1thread2これはXML/XSDでは直接的な解決方法ではないようです。あなたはどちらかを実行することができますかそれを強制しません、私は夢のように両方を持つことはできません:) "all"を使用して、コードが実行前にルールをソートするヒント。 他の退屈なものがマイグレーションする場合Boost Property Tree

既存のフレームワークで希望の動作を達成できるかどうかを教えてください。

答えて

1

数多くの問題がシーケンスを使用せずに順序を強制する方法

...偽quandariesにつながる、ここに遊びにありますか?

あなたはしません。シーケンスにはxs:sequenceを使用します。

私は、ユーザーが任意の の順序でルールを指定することができ、ルールエンジンを書いていますが、一度指定し、それらは が設定したのと同じ順序で実行されています。

指定された順序でルールを実行することは、ルールエンジンではなく、命令if命令のシーケンスです。 ...これはあなたのXMLとXSDの懸念を除いています。

私はCODEで、それは 開発者が注文をお知らせしますけれども、それは、自分の好きな順に ルールを指定してからユーザーを防ぐことができます他に、あまりにシーケンスを使用することはできません。

ここでは、ルール番号をルール要素名に書き込むというXML設計の決定に否定的な影響を感じています。単にそれをしないでください。

むしろこれより:より良いまだ

<RuleEngine> 
    <Rule num="1" ..> 
    <Rule num="2" ..> 
    <Rule num="3" ..> 
</RuleEngine> 

それとも、この:

<RuleEngine> 
    <Rule1 ..> 
    <Rule2 ..> 
    <Rule3 ..> 
</RuleEngine> 

これを行う

<RuleEngine> 
    <Rule ..> 
    <Rule ..> 
    <Rule ..> 
</RuleEngine> 

を、ルールの番号は、暗黙的なことができます。

次に、あなたのXSDは、些細なことになります。

<xs:element name="RuleEngine"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="Rule" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
+0

まあ、ルール1、ルール2は「焼き番号」と全く一般的な「ルール」ではありません。それらは OR のような全く異なるルールでも構いません。あなたが提案した最後のスキーマは、ここに収まらないでしょう。ユーザーがジャグリングのルールや注文を保持している場合、ユーザーが特別に私を呪うので、「num」を明示的に追加することは好ましくありません。私はそれが既存の形では解決できないと結論づけるだろうと思う。 TImeがBoost PTreeに移行しよう! –

+0

私が提案した最後のスキーマは、実際には明示的な番号付けを削除します。規則ベースのシステムは、通常、マッチングの際のタイブレークを除いて、順序付けに依存しません。 – kjhughes