使 XSD 中需要的 xs 和 xmls:xsi 属性

Make xs and xmls:xsi attributes required in XSD

我有以下架构

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="translator">
        ...
    </xs:element>
</xs:schema>

如何定义以下必需属性,以便在添加新的翻译器节点时也添加这些属性?

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Translator.xsd"

如果我把它们放在 XSD 中,像这样

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="translator">
         <xs:attribute name="xmlns:xsi" type="xs:string" default="http://www.w3.org/2001/XMLSchema-instance"/>
         <xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string" default="Translator.xsd"/>
    </xs:element>
</xs:schema>

Xerces 报告了以下问题

[Error] :678:114: s4s-att-invalid-value: Invalid attribute value for 'name' in element 'attribute'. Recorded reason: cvc-datatype-valid.1.2.1: 'xmlns:xsi' is not a valid value for 'NCName'.
[Error] :678:114: src-attribute.3.1: One of 'ref' or 'name' must be present in a local attribute declaration.
[Error] :679:117: s4s-att-invalid-value: Invalid attribute value for 'name' in element 'attribute'. Recorded reason: cvc-datatype-valid.1.2.1: 'xsi:noNamespaceSchemaLocation' is not a valid value for 'NCName'.
[Error] :679:117: src-attribute.3.1: One of 'ref' or 'name' must be present in a local attribute declaration.

首先警告:XML 架构规范禁止在 XML 架构实例命名空间和 explicitly discourages attempts to alter its behavior.

中声明属性

话虽如此,您收到错误的原因是名称属性仅支持通过提供本地名称在目标命名空间(或在本例中为无命名空间)中定义新元素。

从技术上讲,您可以通过引用 xsi:noNamespaceSchemaLocation 属性来执行类似的操作,该属性已在内置 XML 架构实例命名空间中定义:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xs:element name="translator">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute ref="xsi:noNamespaceSchemaLocation" default="Translator.xsd"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

但是,您无法更改其定义,并且由于此属性是内置的并以特殊方式处理,我不确定您能否对其行为产生很大影响。