Xml 如何在不使用xsd:sequence的情况下强制执行排序?
我正在编写一个规则引擎,用户可以按任意顺序指定规则,但一旦指定,它们将按配置的相同顺序执行。像这样的Xml 如何在不使用xsd:sequence的情况下强制执行排序?,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我正在编写一个规则引擎,用户可以按任意顺序指定规则,但一旦指定,它们将按配置的相同顺序执行。像这样的 <RuleEngine> <Rule1 ..> <Rule2 ..> <Rule3 ...> </RuleEngined> (执行:Rule3->Rule1->Rule2) 我正在为此编写一个模式,但无法使用xsd:all或xsd:sequence获得所需的结果。如果我使用xsd:all,它将为用户提供灵
<RuleEngine>
<Rule1 ..>
<Rule2 ..>
<Rule3 ...>
</RuleEngined>
(执行: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>
例如,我读了几篇文章,似乎没有直接的XML/XSD解决方法。你要么执行命令,要么不执行命令,不能像我做梦一样两者兼得:)
一个不太受欢迎的选项是使用“all”并强制用户将数字ID与规则放在一起,作为代码在执行之前对规则进行排序的提示。
另一个乏味的问题是迁移到
如果我可以用现有的框架实现期望的行为,有什么建议吗?这里有很多问题,导致错误的困惑 如何在不使用序列的情况下强制执行排序 你没有。对序列使用
xs:sequence
。
我正在编写一个规则引擎,用户可以在其中以任何方式指定规则
顺序,但一旦指定,它们将按与相同的顺序执行
配置
按指定顺序执行规则不是规则引擎,而是一系列命令式if
语句。。。但这与XML和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>
在这里,您感受到了将规则编号烘焙到规则元素名称中的XML设计决策的负面后果。不要那样做。
与此相反:
<RuleEngine>
<Rule1 ..>
<Rule2 ..>
<Rule3 ..>
</RuleEngine>
这样做:
<RuleEngine>
<Rule num="1" ..>
<Rule num="2" ..>
<Rule num="3" ..>
</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>
好吧,规则1、规则2并不完全是带有“数字烘焙”的通用“规则”。它们可以是完全“不同”的规则,例如,或具有非统一的结构。所以您建议的最后一个模式不适合这里。显式添加“num”不是我的首选,因为如果我的用户不断篡改规则和命令,他们会特别诅咒我。我想我会得出结论,以现有的形式解决不了这个问题。是时候行动起来了!我建议的最后一个模式实际上删除了显式编号。基于规则的系统通常不依赖于排序,除非可能作为匹配中的一个平局破坏者。
<xs:element name="RuleEngine">
<xs:complexType>
<xs:sequence>
<xs:element ref="Rule" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>