XSD-如何确保具有给定属性的特定元素的存在?

XSD-如何确保具有给定属性的特定元素的存在?,xsd,schematron,Xsd,Schematron,我正在尝试使用XSD向流程定义文件添加额外的验证 我们有一些规则要补充;但引起我问题的是,必须存在一个“node”元素,其名称为“name”attribute=“Problem” 所以这是有效的: <process-definition name='sample'> <node name="Problem"> </node> <node name="Do Work"> </node> </proce

我正在尝试使用XSD向流程定义文件添加额外的验证

我们有一些规则要补充;但引起我问题的是,必须存在一个“node”元素,其名称为“name”attribute=“Problem”

所以这是有效的:

<process-definition name='sample'>
    <node name="Problem">
    </node>
    <node name="Do Work">
    </node>
</process-definition>

而这不是

<process-definition name='sample'>
    <node name="Do Work">
    </node>
</process-definition>

总之,我需要执行的规则是

  • 值为“问题”的节点属性
  • 存在名称为“问题”的1个节点
  • 允许任意数量的节点使用其他名称

有什么想法吗?

很抱歉,XSD不可能做到这一点


由于性能方面的原因,XML模式设计为从不向前看,也从不向后看当前节点之外的内容。这意味着必须始终在验证程序位于模式树中的位置定义它。这使得像这样的需求无法用XSD定义。

您必须将“问题”节点简单地称为节点吗?如果可以更改名称,那么它可以是doneYeah Robert,它必须仍然是一个节点,因为这是在jpdl的基础上进行的额外验证。这种验证是我们的应用程序特有的,更改文档的格式会导致底层jbpm框架崩溃。谢谢那我有个疯狂的建议。。。将该节点更改为其他节点,然后将该节点替换回后处理。以前也做过类似的把戏。不优雅,但工作哈哈。我一直在考虑类似的问题——我想使用xslt转换来执行规则并输出一个“验证错误”的xml文档。感谢您抽出时间,Robert。您还可以使用XSLT或其他方法来抛出“噪音”,即没有“问题”属性的节点,并使用XSD验证结果。完全使用XSLT进行验证是可行的,但它不是完成这项工作的最佳工具。谢谢。我最终在Schematron中编写了验证规则。