针对另一个比http://www.w3.org/2001/XMLSchema限制更严格的XML模式验证XML模式

时间:2019-01-10 09:39:05

标签: xml xsd

我正在尝试针对另一个XML模式(称为“ schema_of_schema”)验证XML模式(称为“ schema”)。 “模式”符合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的区别:数据/ a与数据/ 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'

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

0 个答案:

没有答案