0

我编写了一个 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'] 的匹配项。

非常感谢您的帮助!:)

4

2 回答 2

0

Xerces 说,我认为 XSD 中元素的嵌套很重要

身份约束错误:keyref 身份约束“termRef”指的是超出范围的键或唯一键。

尽管

               <xs:unique name="glossaryTermUnique">
                    <xs:selector xpath="xsfoo:definition"/>
                    <xs:field xpath="@term"/>
                </xs:unique>
                <xs:keyref name="termRef" refer="glossaryTermUnique">
                    <xs:selector xpath="xsfoo:definition/xsfoo:term"/>
                    <xs:field xpath="@ref"/>
                </xs:keyref>

修复它似乎。

于 2021-09-12T08:28:33.997 回答
0

正如之前的答案所指出的,嵌套似乎是关键。

为了解决 "textType" 的可重用性问题,我们可以keyref使用选择器的以下 xpath 进入 "foo" 定义.//xsfoo:term:所以,“textType”的定义是分裂的(所以,也许语义上不正确?),但它有效。

完整的 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: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:keyref name="termRef" refer="glossaryTermUnique">
            <xs:selector xpath=".//xsfoo:term"/>
            <xs:field xpath="@ref"/>
        </xs:keyref>

    </xs:element>

</xs:schema>
于 2021-09-12T16:04:59.497 回答