为什么我的xsd会验证未声明的属性?

时间:2019-06-26 12:27:23

标签: xml xsd xsd-validation

添加新属性后,我有一个要针对xsd进行验证的xml。
我试图在xsd中为某些元素在本地声明属性,但无法弄清楚该怎么做。
一时兴起,我获取了一个已经通过验证的xml,并将新属性添加到元素中,而无需对xsd进行任何更改,并且验证成功通过。

该属性(letter-spacing)仅通过了其具有名称空间前缀(在xsd中定义并在xml中出现的名称空间'dptt')的验证:
通过验证的一行示例:

<tt:style dptt:letter-spacing="4px" style="s01" tts:lineHeight="120px" xml:id="1"/>

未通过验证的行的示例:

<tt:style letter-spacing="4px" style="s01" tts:lineHeight="120px" xml:id="1"/>

这是xsd中定义样式属性的部分:

<xs:element name="style">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="tt:metadata" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute ref="xml:id" use="required">
        </xs:attribute>
        <xs:attribute name="style" type="xs:IDREFS">
        </xs:attribute>
        <xs:attribute ref="tts:direction" >
        </xs:attribute>
        <xs:attribute ref="tts:fontFamily" >
        </xs:attribute>
        <xs:attribute ref="tts:fontSize" >
        </xs:attribute>
        <xs:attribute ref="tts:lineHeight" >
        </xs:attribute>
        <xs:attribute ref="tts:textAlign" >
        </xs:attribute>
        <xs:attribute ref="tts:color" >
        </xs:attribute>
        <xs:attribute ref="tts:backgroundColor" >
        </xs:attribute>
        <xs:attribute ref="tts:fontStyle" >
        </xs:attribute>
        <xs:attribute ref="tts:fontWeight" >
        </xs:attribute>
        <xs:attribute ref="tts:textDecoration" >
        </xs:attribute>
        <xs:attribute ref="tts:unicodeBidi" >
        </xs:attribute>
        <xs:attribute ref="tts:padding">
        </xs:attribute>
        <xs:attribute ref="ebutts:multiRowAlign"/>
    </xs:complexType>
</xs:element>

我希望未声明的属性不会通过验证。
我还想知道为什么添加名称空间对于验证至关重要。

2 个答案:

答案 0 :(得分:2)

没有看到我们可能无法知道的模式。我的猜测是,包含元素的复杂类型包括一个xs:anyAttribute通配符。

答案 1 :(得分:0)

发现模式引用的元素与我认为引用的元素不同。
花了一段时间让我注意到xml中的元素

<tt:style letter-spacing="4px" style="s01" tts:lineHeight="120px" xml:id="1"/>

与xsd中的元素不同

<xs:element name="style">...</xs:element>

tt:style元素在其他地方定义,并且确实在许多引用的xsd之一中包含<xs:anyAttribute>元素。