我有一些XML我正在编写验证工具,因此我们的客户可以测试他们的示例源,但我对XSD很新。基于cookie切割器示例,我已经达到了一切正确验证的程度,所以我想在其中抛出一些其他场景。我想出的第一个是在基节点中有不同的元素顺序。
实施例: 我使用以下complexType来验证每个事务节点
C(x,y,z) == C(y,z,x) == C(z,x,y)
以下示例节点的顺序正确,因此可以正确验证
<xs:complexType name="transactionType">
<xs:sequence>
<xs:element type="xs:string" name="id"/>
<xs:element type="xs:string" name="type"/>
<xs:element type="xs:float" name="amount"/>
<xs:element type="xs:string" name="description"/>
<xs:element type="xs:string" name="status"/>
<xs:choice>
<xs:element name="transacted_on" type="xs:date"/>
<xs:element name="transacted_at" type="xs:date"/>
</xs:choice>
<xs:choice>
<xs:element name="posted_on" type="xs:date"/>
<xs:element name="posted_at" type="xs:date"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
但我希望能够以任何顺序拥有元素。因此,以下内容将正确验证。我们的想法是所有元素都存在,并且可以按任何顺序排列。
<transaction>
<id>20150617-123456</id>
<type>DEBIT</type>
<amount>17.44</amount>
<description>Debit Card: CAFE 06/16/15</description>
<status>POSTED</status>
<transacted_on>2015-06-17</transacted_on>
<posted_on>2015-06-16</posted_on>
</transaction>
我做了一些研究,并很快指出使用<transactions>
<transaction>
<amount>17.44</amount>
<id>20150617-123456</id>
<type>DEBIT</type>
<description>Debit Card: CAFE 06/16/15</description>
<status>POSTED</status>
<transacted_on>2015-06-17</transacted_on>
<posted_on>2015-06-16</posted_on>
</transaction>
<transaction>
<id>20150617-123456</id>
<type>CREDIT</type>
<amount>17.44</amount>
<description>VISA Card: payment</description>
<status>POSTED</status>
<transacted_on>2015-06-17</transacted_on>
<posted_on>2015-06-16</posted_on>
</transaction>
</transactions>
元素,它应该完全符合我的要求。因此,我将架构更改为使用xs:all
而不是xs:all
。
xs:sequence
当我在进行此更改后运行验证时,仍然会收到错误:
不期望这个元素。预计是(id)。
我在这里缺少什么?
答案 0 :(得分:0)
XML Schema不允许xs:choice
成为xs:all
的孩子。
解决方法:
xs:choice
元素周围添加包装元素。xs:all
并通过xs:sequence
以固定顺序生活。我建议在实践中xs:sequence
正常工作并避免此问题以及xs:all
经常出现的其他问题,包括违反Unique Particle Principle。