Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在不使用xsd:sequence的情况下强制执行排序?_Xml_Xsd_Xsd Validation_Xml Validation - Fatal编程技术网

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>