我正在尝试实现一个非常简单的XML模式约束.
只应允许<batz>类型元素的idref属性具有与至少一个元素<bar>上的id属性匹配的值.
如果这对你没有任何意义,那么请看下面的示例XML文档,我认为它实际上解释了它比我试图用文字更好.
所以,问题:为什么xmllint让下面的schema/xml组合传递(它说文档是有效的)?如何修复它以达到预期的约束?
架构:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="test" xmlns="test" elementFormDefault="qualified">
<xs:element name="foo">
<xs:complexType>
<xs:sequence>
<xs:element name="bar" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id" use="required" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="batz" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="idref" use="required" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="ID">
<xs:selector xpath="./bar" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="IDREF" refer="ID">
<xs:selector xpath="./batz" />
<xs:field xpath="@idref" />
</xs:keyref>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
文件:
<?xml version="1.0"?>
<foo xmlns="test">
<bar id="1" />
<bar …Run Code Online (Sandbox Code Playgroud) 我一直在寻找答案而找不到答案:
谢谢!
更新:请注意,问题不在于如何验证具有XSD文件的XML.我特别询问了关键/ keyref intellisense / Visual Studio中的任何支持,似乎根本没有添加.
我定期使用一些XML文件,并希望DTD可以提供更好的验证.所以我开始阅读有关模式的内容,看看是否会帮助我.到目前为止,我已经能够创造出几乎像我需要的东西,除了一件.我希望能够将元素的属性限制为具有相同元素类型的兄弟或祖先元素的不同属性的值.使用XML Schema密钥/ keyref限制是否可以实现这一点?
我有一个看起来像这样的文档:
<nodeContainer>
<node name="Table">
</node>
<node name="MyHouse">
<node name="RoomWithDoor">
</node>
<node name="DiningRoom" extends="RoomWithDoor">
<node name="DiningTable" extends="Table">
</node>
</node>
</node>
<node name="MySummerHouse">
<node name="DiningRoom">
<node name="DiningTable" extends="Table">
</node>
</node>
</node>
</nodeContainer>
Run Code Online (Sandbox Code Playgroud)
在本文档中,节点可以"扩展"以下其他节点:
但是,节点不应"扩展":
这意味着MyHouse可以"扩展" 表,这是没有意义的,但我没关系.
同样重要的是,两个房屋节点都应该能够拥有自己的名为DiningRoom的节点.
我目前的架构与此类似:
<xs:complexType name="node">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="node"/> <!-- node can have other nodes inside it -->
<xs:element ref="leaf"/>
</xs:choice>
<xs:attribute name="name" type="xs:anySimpleType" use="required"/>
<xs:attribute name="extends" type="xs:anySimpleType"/>
</xs:complexType>
<!-- document root -->
<xs:element …Run Code Online (Sandbox Code Playgroud)