添加新属性后,我有一个要针对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>
我希望未声明的属性不会通过验证。
我还想知道为什么添加名称空间对于验证至关重要。
答案 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>
元素。