我的XML(简化)是这样的:
<Actions>
<Action Id="1">
</Action>
<Action Id="2">
<DoSomething>
<ActionRef ActionId="1" /> <!-- valid -->
</DoSomething>
</Action>
</Actions>
ActionId
属性值引用Id
元素的Action
属性值。我已经在XSD中设置了一个外键约束,它可以正常工作。
我想阻止外部字段中的自引用值,如下所示:
<Actions>
<Action Id="1">
</Action>
<Action Id="2">
<DoSomething>
<ActionRef ActionId="2" /> <!-- invalid -->
</DoSomething>
</Action>
</Actions>
当然,这可以在处理XML的应用程序中轻松完成,如果我要求的是不可能的话,我会依赖它,但我更愿意通过自动完成验证过程。
我尝试将[not(@ActionId = ../@Id)]
添加到外键选择器XPath查询中,但在该上下文中无效(我也不确定它是否正确)。除此之外,我不知道还有什么可以尝试,并且它看起来并不像互联网上的许多人甚至在他们的XSD中建立外键关系,更不用说防止这种情况了(我在这个确切的主题上一无所获)。
答案 0 :(得分:1)
无法完成 - XSD约束的选择器语法非常有限。其他替代方案可能包括Schematron,假设您的运行时可以访问XSLT处理器,这应该是合理的集成。如果您决定添加更多与处理XML的应用程序代码分开的验证规则,那么这项工作可能会有所回报。