将 XSD 个断言保存在单独的模式中

Keeping XSD assertions in a separate schema

我想向 XSD 添加断言,但将断言保存在单独的架构文件中。这是因为 XSD 是由第三方提供的,并且经常发布新版本。

第三方XSD(SchoolModule.xsd):

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.1" id="SchoolModule"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">

    <xs:include schemaLocation="../Includes/Address_Structure.xsd"/>

    <xs:element name="School" type="SchoolStructure"/>

    <xs:complexType name="SchoolStructure">
        <xs:sequence>
            <xs:element name="Headteacher" type="xs:String" minOccurs="0"/>
            <xs:element name="SchoolCharacteristics" type="SchoolCharacteristicsStructure"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="SchoolCharacteristicsStructure">
        <xs:sequence>
            <xs:element name="SchoolName" type="SchoolNameType"/>
            <xs:element name="SchoolType" type="SchoolTypeType"/>
            <xs:element name="NumberOfPlaces" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0"/>
                        <xs:maxInclusive value="999"/>
                        <xs:totalDigits value="3"/>
                        <xs:fractionDigits value="0"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="IntakeType" type="xs:boolean"/>
        </xs:sequence>
    </xs:complexType>
    ...
</xs:schema>

这是我在单独的文件中尝试过的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.1" id="Assertions"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
    <xs:include schemaLocation="SchoolModule.xsd"/>

    <xs:element name="assertions">
        <xs:complexType>
            <xs:assert test="/Message/School/SchoolCharacteristics/SchoolType ='Secondary' and /Message/School/Headteacher"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

我试图断言只有在 SchoolType = Secondary 时才应出现 Headteacher 元素。但是,这似乎不起作用,因为即使我在我的 XML 文件中将 SchoolType 设置为 Secondary 以外的其他内容并且存在 Headteacher 元素,我的 XML 文件也已成功验证。谁能指出我哪里出错了?

注意:我已验证断言中的 XPath 是正确的并且 return 是预期值。

XSD 断言只能针对关联元素的内容模型。您不能从 xs:assert.

全局限制标记

您可以改为编写 XSLT,它可以将原始 XSD 转换为在适当位置包含您的断言的 XSLT。但是,您必须注意您所说的经常更改的原始 XSD 仍然与您的断言兼容(或相应地调整您的断言)。