XML 针对姐妹元素的模式验证

XML schema validation against sister elements

这是我的 XML 文件。必须根据以下条件验证此文件

  1. child -> child1 -> parent数据 -> name 元素应该出现在 parent -> parent* ->名字
  2. 特定parent(Parent 2)的children的总长度(在本例中为4 + 3 = 7)应等于长度元素该元素
  3. 如果 Parent2 的第 4-6 部分被 child1 使用,则其他 child 不应使用 Parent2 的相同部分 还有更多...

请帮助我验证此 XML 文件。我尝试从 Visual Studio 生成一个 XSD 文件,并且能够为 parent 和 child 名称实施唯一约束。

<sample>
    <parent>
      <parent1>
        <name>Parent 1</name>
        <length>10</length>
      </parent1>
      <parent2>
        <name>Parent 2</name>
        <length>7</length>
      </parent2>
      <parent3>
        <name>Parent 3</name>
        <length>20</length>
      </parent3>
    </parent>
    <child>
      <child1>
        <length>3</length>
        <parentData>
          <name>Parent 2</name>
          <start>4</start>
          <stop>6</stop>
        </parentData>
      </child1>
      <child2>
        <length>4</length>
        <parentData>
          <name>Parent 2</name>
          <start>0</start>
          <stop>3</stop>
        </parentData>
      </child2>
    </child>
  </sample>

首先请注意,XSD 中元素的有效性仅取决于该元素的递归内容,而不是其兄弟元素、parents 或祖先元素。这告诉您定义 <parent><child> 元素之间约束的规则(我将为元素名称使用尖括号以避免与轴名称混淆)必须在 <sample> 元素上进行:如果约束无效,这就是无效的元素。

另请注意,使用 child1child2 等元素名称不会让您的生活更轻松。如果两个元素代表同一个real-world实体,具有相同的内部结构和规则,则给它们起相同的名字。

The child -> child1 -> parentData -> name element should be present in parent -> parent* -> name

这是在 <sample> 上定义的 key/keyref。 key有selector = parent//name, field = .; keyref 有 selector = child//parentData/name, field = ..

>     The total length (4 + 3 = 7 in this case) of the children of a particular parent (Parent 2) should be equal to the length element of
> that element

这需要断言,因此 XSD 1.1。同样,它是在 <sample> 上定义的断言,它将类似于 every $p in parent/* satisfies $p/length = sum(child/*[parentData/name = $p/name]/length).

If the part 4-6 of Parent2 is used by child1, no other child should use the same part of Parent2 and many more...

那个更难,我不打算尝试。同样,这是对 <sample> 的断言。作为提示,如果您假设 start<end 已经过验证,那么我认为您可以将两个 children $c1 和 $c2 不重叠的约束表达为 ($c1/end < $c2/start or $c2/end < @c1/start)。所以约束将采用 every $c1 in XXX, $c2 in XXX satisfies ($c1 is $c2 or $c1/end < $c2/start or $c2/end < @c1/start)

的形式