首页 > 解决方案 > 根据比 http://www.w3.org/2001/XMLSchema 更严格的另一个 XML 模式验证 XML 模式

问题描述

我正在尝试针对另一个 XML 模式(称为“schema_of_schema”)验证 XML 模式(称为“模式”)。“模式”符合http://www.w3.org/2001/XMLSchema但有进一步的限制。

背景:“模式”作为代码生成器的输入,但代码生成器并不了解http://www.w3.org/2001/XMLSchema的所有可能性,而是仅了解“模式”的非常有限的结构. 因此,我想确保“模式”在将其输入生成器之前符合这种限制性结构。

例子:

schema_for_schema.xsd:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="xs:schema">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xs:element" use="required" fixed="data">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="xs:complexType">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="xs:sequence">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="xs:element" minOccurs="0" maxOccurs="unbounded">
                                                        <xs:complexType>
                                                            <xs:sequence>
                                                                <xs:element name="xs:complexType">
                                                                    <xs:complexType>
                                                                        <xs:sequence minOccurs="0" maxOccurs="unbounded">
                                                                            <xs:element name="xs:attribute">
                                                                                <xs:complexType>
                                                                                    <xs:attribute name="name" use="required"/>
                                                                                </xs:complexType>
                                                                            </xs:element>
                                                                        </xs:sequence>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                            </xs:sequence>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="xmlns:xs" use="required" fixed="http://www.w3.org/2001/XMLSchema"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

一个可能的“模式”(应该针对 schema_for_schema.xsd 进行验证):schema_a.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="a">
                    <xs:complexType>
                        <xs:attribute name="value"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

另一个可能的“模式”(也应该针对 schema_for_schema.xsd 进行验证):schema_b.xsd(注意与 schema_a.xsd 的区别:data/a 与 data/b)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="b">
                    <xs:complexType>
                        <xs:attribute name="value"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

针对 schema_a.xsd 进行验证的 XML 文件:data_a.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a value="1"/>
</data>

以及一个针对 schema_b.xsd 进行验证的 XML 文件:data_b.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <b value="2"/>
</data>

XML 文件 data_a.xml/data_b.xml 针对 schema_a.xsd/schema_b.xsd 正确验证。但是,当我尝试针对 schema_for_schema.xsd(使用 xmllint)验证 schema_a.xsd/schema_b.xsd 时,出现以下错误:

attribute 'name': 'xs:schema' is not a valid value of the atomic type 'xs:NCName'

如何处理“模式”元素名称中的冒号?

标签: xmlxsd

解决方案


推荐阅读