XML 针对姐妹元素的模式验证
XML schema validation against sister elements
这是我的 XML 文件。必须根据以下条件验证此文件
- child -> child1 -> parent数据 -> name 元素应该出现在 parent -> parent* ->名字
- 特定parent(Parent 2)的children的总长度(在本例中为4 + 3 = 7)应等于长度元素该元素
- 如果 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>
元素上进行:如果约束无效,这就是无效的元素。
另请注意,使用 child1
和 child2
等元素名称不会让您的生活更轻松。如果两个元素代表同一个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)
的形式
这是我的 XML 文件。必须根据以下条件验证此文件
- child -> child1 -> parent数据 -> name 元素应该出现在 parent -> parent* ->名字
- 特定parent(Parent 2)的children的总长度(在本例中为4 + 3 = 7)应等于长度元素该元素
- 如果 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>
元素上进行:如果约束无效,这就是无效的元素。
另请注意,使用 child1
和 child2
等元素名称不会让您的生活更轻松。如果两个元素代表同一个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)