我遇到架构验证问题,这是我的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>
书签中的ID元素应为键,“收藏夹/文件夹/书签/书签ID”属性应始终引用书签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属性的验证无效。
答案 0 :(得分:1)
密钥的上下文是<root>
元素,因为在模式中它们是<xs:element name="root">
元素的子元素。因此,<xs:selector>
XPath失败,因为它们以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>
。
这是一个有效的代码示例。
{{1}}