要求元素具有另一个元素作为后代

时间:2011-06-21 21:15:43

标签: xsd

在xsd架构中是否有办法要求某个元素在某个地方有另一个元素作为后代?

例如,元素parent需要后代desc。这是有效的:

<parent>
  <a>
   <b>
     <desc></desc>
   </b>
  </a>
</parent>

就是这样:

<parent>
  <c>
    <desc></desc>
  </c>
</parent>

但这不是:

<a>
  <parent>
    <b/>
  </parent>
</a>

父级的潜在子元素很多且复杂,因此很难枚举每个可能的有效配置。

类似于键/选择器模式元素似乎可以工作,我可以提供定义desc元素的有效位置的xpath表达式,但我发现的所有示例都旨在匹配属性的值

2 个答案:

答案 0 :(得分:2)

不,(几乎)所有XML Schema验证都很浅,在规范中称为“本地”。这是一个强调类型验证为“本地”验证的摘录。

  

按类型验证的元素如果是   元素信息项有效·   关于·类型定义·as   每个元素本地有效(类型)   (§3.3.4),[标记为]·已验证·。

唯一的例外是身份限制,例如唯一性和键引用,它们在XML文档中具有广泛的范围,但使用范围很窄。

答案 1 :(得分:1)

我不知道XSD是否支持您尝试做的事情,但有一种解决方法。

您可以通过两个步骤进行复杂的验证:

  • 首先只需使用您的XSD架构进行基本验证
  • 接下来使用XSLT进行更复杂的验证,并输出该验证的结果

这可能无法很好地插入您正在使用的任何框架,但可能适用于(部分)自定义代码。它还具有(可以在代码中执行额外验证)的优势,您可以发布这两个文档。

通过快速谷歌搜索,为此目的的一个努力是Schematron。它实际上完全取决于XSD,并且只使用XSLT。它似乎是一个已发布的标准: