xml - 使用 XML Schema xs:key 和 xs:keyref 未找到 keyRef 的引用值
问题描述
我正在尝试向我的 XML Schema 模式添加约束,但我有一个正在监督的错误。我不断得到:
- 未找到 keyRef {author} 的引用值:2
- 未找到 keyRef {author} 的引用值:3
我不知道我做错了什么。我的 keyref 显然工作正常,但 key 不是。我该如何解决?
这是架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="articles">
<xs:complexType>
<xs:sequence>
<xs:element name="article" type="article" maxOccurs="unbounded">
<xs:keyref name="author" refer="authorKey">
<xs:selector xpath="author"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
<xs:unique name="unique-author">
<xs:selector xpath="author"/>
<xs:field xpath="@ref-number"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="authors" type="authors" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="article">
<xs:sequence>
<xs:element name="author" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ref-number" type="xs:integer" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="authors">
<xs:sequence>
<xs:element name="author" type="author">
<xs:key name="authorKey">
<xs:selector xpath="."/>
<xs:field xpath="@key-number"/>
</xs:key>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="author">
<xs:attribute name="key-number" type="xs:integer" use="required" />
</xs:complexType>
</xs:schema>
以下是无法验证的示例 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="m5-schema.xsd">
<articles>
<article>
<author ref-number="2"></author>
<author ref-number="3"></author>
</article>
</articles>
<authors>
<author key-number="2">
</author>
</authors>
</root>
解决方案
这似乎是一个范围问题,因此将键约束移动到 root 并为 root 定义命名类型有助于:
<xs:element name="root" type="root">
<xs:keyref name="author" refer="authorKey">
<xs:selector xpath=".//article/author"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
<xs:unique name="unique-author">
<xs:selector xpath=".//authors/author"/>
<xs:field xpath="@ref-number"/>
</xs:unique>
</xs:element>
<xs:complexType name="root">
<xs:sequence>
<xs:element name="articles">
<xs:complexType>
<xs:sequence>
<xs:element name="article" type="article" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="authors" type="authors" />
</xs:sequence>
</xs:complexType>
推荐阅读
- postfix-mta - DD-WRT Build 杀死 Postfix Rewrite
- reactjs - 组件未从作为道具传入的对象呈现页面上的任何值
- javascript - 如何使用 JavaScript 淡化循环?
- python - 如何在 PYSPIDER 中设置同时请求数
- docker - 上次 Ubuntu 18.04 更新后损坏的 Docker
- python - 标签 python 的不一致使用
- mysql - 最高总工资
- objective-c - 如何使用可以键入图像的 Objective-C 制作自定义键盘
- ruby-on-rails - 无法在 Rails 应用程序上启动克隆的 ruby - RubyMine
- javascript - 如何在数组中找到素数?