Xsd 无法找到一种方法来创建将随机顺序项与条件匹配的XML架构
我们试图找到一种方法来创建一个能够验证某些规则的模式,但是我们尝试了xs:all、xs:choice、xs:group和xs:sequence的各种组合,但都没有成功。规则基本上是这样的:Xsd 无法找到一种方法来创建将随机顺序项与条件匹配的XML架构,xsd,Xsd,我们试图找到一种方法来创建一个能够验证某些规则的模式,但是我们尝试了xs:all、xs:choice、xs:group和xs:sequence的各种组合,但都没有成功。规则基本上是这样的: LICAPPIN01元素只能出现一次 LICAPPIN99元素只能出现一次 应该有相同数量的LICAPPIN30和LICAPPIN31 应该有相同数量的LICAPPIN40和LICAPPIN41 需要至少有一组LICAPPIN30/31或LICAPPIN40/41(两者也可以存在) 对于上述所有情况,订单无关
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="NewDataSet">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="LICAPPIN01" minOccurs="1" maxOccurs="1">
</xs:element>
<xs:element name="LICAPPIN30" minOccurs="1" maxOccurs="unbounded">
</xs:element>
<xs:element name="LICAPPIN31" minOccurs="1" maxOccurs="unbounded">
</xs:element>
<xs:element name="LICAPPIN40" minOccurs="1" maxOccurs="unbounded">
</xs:element>
<xs:element name="LICAPPIN41" minOccurs="1" maxOccurs="unbounded">
</xs:element>
<xs:element name="LICAPPIN99" minOccurs="1" maxOccurs="1">
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
这有许多问题:
- 它允许多个LICAPPIN01和LICAPPIN99(替换为xs:all可能会解决这个问题?)
- 它不执行规则3和4
- 对于第5条规则,它似乎同时强制执行LICAPPIN30/31和LICAPPIN40/41,因为这两个集合中只有一个是可能的
Denis要编写一个内容模型来满足您的所有需求并不容易,但要满足除最后一个之外的所有需求却很容易 如果元素顺序的变化对于传递必要的信息至关重要,那么最好使用XSD1.1或Schematron中的断言。如果元素顺序的变化没有传递任何信息,那么您可以选择声明顺序的变化毕竟不是一项要求。我最尊重的词汇设计权威一致地说,如果孩子的顺序没有传达信息,那么没有理由不纠正它 以下是一个内容模型,它满足您列出的所有要求(最后一个除外):
<xs:complexType>
<xs:sequence>
<xs:element name="LICAPPIN01"/>
<xs:choice maxOccurs="unbounded">
<xs:sequence>
<xs:element name="LICAPPIN30"/>
<xs:element name="LICAPPIN31"/>
</xs:sequence>
<xs:sequence>
<xs:element name="LICAPPIN40"/>
<xs:element name="LICAPPIN41"/>
</xs:sequence>
</xs:choice>
<xs:element name="LICAPPIN99"/>
</xs:sequence>
</xs:complexType>
实际上,它不是一个简单的模式。关于相关节点的规则和它们的缺乏(即任何顺序),但没有结构所暗示的任何规则。我知道得到你们想要的东西的唯一方法就是叫做schematron的东西。你可以用它做比你想要的更多的事情。我们将使用类似于上面的东西,并让人们知道,如果他们更容易以不同的方式组织项目,我们也会接受他们的文件,但是除非他们遵循一些基本的顺序,否则不能使用模式。谢谢