我在模式验证方面遇到了问题,这是我的xml
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation='favorites.xsd'>
<Favorites>
<Folder>
<Name>Entertainment</Name>
<Bookmarks>
<Bookmark ID="1"/>
<Bookmark ID="200"/> <!-- This should fail validation -->
</Bookmarks>
</Folder>
</Favorites>
<Bookmarks>
<Bookmark>
<ID>1</ID>
<URL>www.website1.com</URL>
</Bookmark>
<Bookmark>
<ID>2</ID>
<URL>www.website2.com</URL>
</Bookmark>
<Bookmark>
<ID>3</ID>
<URL>www.website3.com</URL>
</Bookmark>
</Bookmarks>
</root>Bookmark中的ID元素应该是键,并且Favorites/Folder/ Bookmark /Bookmark ID属性应该始终引用一个Bookmark ID。
下面是我的xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="Favorites" type="Favorites"/>
<xs:element name="Bookmarks" type="Bookmarks"/>
</xs:sequence>
</xs:complexType>
<xs:keyref name="bookmarkIDKeyRef" refer="bookmarkIDKey">
<xs:selector xpath="root/Favorites/Folder/Bookmarks/*"/>
<xs:field xpath="@ID"/>
</xs:keyref>
<xs:key name="bookmarkIDKey">
<xs:selector xpath="root/Bookmarks/Bookmark/ID"/>
<xs:field xpath="ID"/>
</xs:key>
</xs:element>
<xs:complexType name="Favorites">
<xs:sequence maxOccurs="unbounded">
<xs:element name="Folder" type="Folder"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Folder">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Bookmarks">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="Bookmark">
<xs:complexType>
<xs:attribute name="ID" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Bookmarks">
<xs:sequence maxOccurs ="unbounded">
<xs:element name="Bookmark" type="Bookmark"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Bookmark">
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="URL" type ="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>xml格式正确,但ID属性的验证不起作用。
发布于 2011-11-26 04:19:23
键的上下文是<root>元素,因为在模式中它们是<xs:element name="root">元素的子元素。因此,您的<xs:selector> XPaths会失败,因为它们以root/...开头,而它不是<root>元素的子元素。为key和keyref去掉它。由于类似的问题,密钥的<xs:field>也会失败。您已经选择了<ID>元素作为上下文,然后尝试查找该元素的<ID>子元素。将<xs:field>的XPath切换为. (一个点)或从选择器中删除尾随的/ID。
下面是一个有效的代码示例。
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="Favorites" type="Favorites"/>
<xs:element name="Bookmarks" type="Bookmarks"/>
</xs:sequence>
</xs:complexType>
<xs:keyref name="bookmarkIDKeyRef" refer="bookmarkIDKey">
<xs:selector xpath="Favorites/Folder/Bookmarks/*"/>
<xs:field xpath="@ID"/>
</xs:keyref>
<xs:key name="bookmarkIDKey">
<xs:selector xpath="Bookmarks/Bookmark"/>
<xs:field xpath="ID"/>
</xs:key>
</xs:element>https://stackoverflow.com/questions/8273312
复制相似问题