我编写了一个 XSD 来定义以下元素:
- 词汇表
- 定义 [术语=唯一]
- 术语[参考=术语]
- 定义 [术语=唯一]
“词汇表”包含“定义”列表。每个“定义”都有一个唯一的属性“术语”。“定义”可以包含带有元素“术语”的混合文本。每个“术语”都有一个属性“ref”,它引用定义的术语属性。
请注意,keyref
(命名为“termRef”)是complexType
定义(命名为“textType”)的一部分,因为这种类型应该在 xsd 文档的多个位置有用,而不仅仅是在“定义”中。
我不明白为什么 XML linter 找不到关键参考。
这是我写的代码:
XSD:
<?xml version="1.0"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="foo"
xmlns="foo"
xmlns:xsfoo="foo"
elementFormDefault="qualified">
<xs:complexType name="textType" mixed="true">
<xs:choice maxOccurs="unbounded">
<xs:element name="term" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:normalizedString">
<xs:attribute name="ref" use="required" type="xs:token"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:keyref name="termRef" refer="glossaryTermUnique">
<xs:selector xpath="."/>
<xs:field xpath="@ref"/>
</xs:keyref>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:element name="foo">
<xs:complexType>
<xs:sequence>
<xs:element name="glossary">
<xs:complexType>
<xs:sequence>
<xs:element name="definition" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:complexContent>
<xs:extension base="textType">
<xs:attribute name="term" use="required" type="xs:token"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="glossaryTermUnique">
<xs:selector xpath="xsfoo:definition"/>
<xs:field xpath="@term"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML:
<?xml version="1.0"?>
<foo
xmlns="foo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="foo/none.xsd">
<glossary>
<definition term="ik 1">identification key 1</definition>
<definition term="ik 2">identification key 2 with <term ref="ik 1">a ik 1 reference</term></definition>
</glossary>
</foo>
这是来自 xmllint 的错误消息:
架构有效性错误:元素“{foo}term”:未找到 keyref '{foo}termRef' 的键序列 ['ik 1'] 的匹配项。
非常感谢您的帮助!:)