XSD 无法验证包含 dt:dt 属性的 XML

XSD unable to validate XML containing dt:dt attribute

XSD 文件无法验证包含 dt:dt 属性的 XML 文件。 XSD 文件不接受 dt:dt 属性。

例如

<xs:attribute name="dt:dt" type="xs:nonNegativeInteger" use="optional"/>

在上面 xs:attribute 中,不接受 dt:dt 名称。因此 XML 包含属性 dt:dt="10" 的文件无法验证。

是否有修改 XSD 以使 dt:dt 属性得到验证的解决方案?

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<OperationalTopology xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns:dt="urn:schemas-microsoft-com:datatypes"
                     xsi:noNamespaceSchemaLocation="xsd.xsd">
   <Element1>
      <Element1_In ID="xx" dt:dt="string"/>
   </Element1>
</OperationalTopology>

XSD 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="OperationalTopology">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:all>
                <xs:element name="Element1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                <xs:attribute name="ID" use="optional"/>
                                <xs:attribute name="dt" use="optional"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

上面的 xsd 在验证 XML 时出错。 错误发生在 dt:dt 属性中。

xs:attribute 元素的 name 属性的值只能是本地名称 (dt)。它应该在它自己的模式中声明(比如,xsd2.xsd),因为它有一个不同的命名空间(当然除非这个模式已经存在于某个地方):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:schemas-microsoft-com:datatypes">
    <xs:attribute name="dt"/>
</xs:schema>

然后原始模式可以导入上述模式,将命名空间绑定到 dt 前缀,并使用对 dt:dt 的属性引用而不是声明它:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:dt="urn:schemas-microsoft-com:datatypes"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:import namespace="urn:schemas-microsoft-com:datatypes" schemaLocation="xsd2.xsd"/>
    <xs:element name="OperationalTopology">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:all>
                <xs:element name="Element1" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Element1_In" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:attribute name="ID" use="optional"/>
                                    <xs:attribute ref="dt:dt" use="optional" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>