XSD for XML文件,其xs:all后跟xs:choice或xs:sequence

时间:2014-04-25 17:26:20

标签: xml xsd xsd-1.0

我有一个类似于以下内容的XML文件:

<root>
    <node1></node1>
    <node2></node2>
    <node3></node3>
    <line>
       <line1></line1>
       <line2></line2>
       <line3></line3>
    </line>
    <line>
       <line1></line1>
       <line2></line2>
       <line3></line3>
    </line>
</root>

以下是我的限制:

  • <node1><node2><node3>必须每次都出现一次,并且可能会出现在 任何订单
  • <node1><node2><node3>必须全部发生在开头之前 <line>元素
  • <line>元素的任意数量,但必须至少有一个
  • {li> <line1><line2><line3>中的<line>元素必须每次都出现一次,并且可以按任意顺序出现
  • 我无法控制XML。它是由一些第三方软件提供给我的。
  • 我必须使用XSD 1.0。
  • 这是一个简化的例子。我正在寻找20个左右的独特<node#>,所以解决方案必须很好地扩展。

我正在尝试设计一个XSD文件来验证这个XML,但无济于事。问题是我实际上在查看<xs:all>块(对于我的<node#> s),然后是<xs:sequence><xs:choice>maxOccurs="unbounded"(对于我的<line> s,但似乎没有有效的方法可以使用XSD 1.0。

1 个答案:

答案 0 :(得分:1)

只有六个可能的(1,2,3)序列以任何顺序出现一次,因此将它们全部枚举是可行的。当然这不会扩展,但它可能对你有用。那将是

(1((2,3)|(3,2)) | 2((1,3)|(3,1)) | 3((1,2)|(2,1))

使用“,”表示序列和“|”可供选择。

您唯一的其他选项不是XSD 1.0。例如。 XSD 1.1或schematron。