XML Schema:缺少Referenced属性

时间:2013-07-10 14:44:12

标签: xml xsd schema xsd-validation

在针对模式验证以下XML时,除非前缀为命名空间,否则KeyB的引用属性将标记为missing / unclared。 KeyA的类似属性(声明为“内联”)验证正常。谁可以给我解释一下这个? (注意:使用.NET的XmlReader进行验证)。

架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="so"
    targetNamespace="http://test/so.xsd"
    elementFormDefault="qualified"
    xmlns="http://test/so.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:attribute name="Id" type="xs:unsignedByte" />
  <xs:attribute name="Index" type="xs:unsignedByte" />

  <xs:element name="KeyA">
    <xs:complexType>
      <xs:attribute name="Id" type="xs:unsignedByte" use="required" />
      <xs:attribute name="Index" type="xs:unsignedByte" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="KeyB">
    <xs:complexType>
      <xs:attribute ref="Id" use="required" />
      <xs:attribute ref="Index" use="required" />
    </xs:complexType>
  </xs:element>


  <xs:element name="Keys">
    <xs:complexType>
      <xs:all>
        <xs:element ref="KeyA"/>
        <xs:element ref="KeyB"/>
      </xs:all>
    </xs:complexType>
  </xs:element>

</xs:schema>

XML实例示例:

<?xml version="1.0" encoding="utf-8" ?>
<Keys xmlns="http://test/so.xsd">
  <KeyA Id="0" Index="3"/>
  <KeyB Id="0" Index="3"/>
</Keys>

我收到KeyB元素的以下错误消息:

The required attribute 'http://test/so.xsd:Index' is missing.
The required attribute 'http://test/so.xsd:Id' is missing.

The 'Index' attribute is not declared.
The 'Id' attribute is not declared.

1 个答案:

答案 0 :(得分:1)

嗯,这很容易。

本地属性(即您所谓的“em>声明为”内联“)可能是合格的,也可能不是。 “合格”大致意味着需要名称空间前缀。

这由attributeFormDefault的{​​{1}}属性控制。 如果您已指定:

<xs:schema>

然后,所有本地属性都必须是合格的。

但默认情况下,<xs:schema id="so" targetNamespace="http://test/so.xsd" elementFormDefault="qualified" attributeFormDefault="qualified" xmlns="http://test/so.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> .... 的值为attributeFormDefault。 因此,当您错过它时,您将使所有本地属性不合格(不需要名称空间前缀)。

关于全局属性(只有它们可以通过引用包含在内), 他们必须始终 合格。 这实际上是全局声明的任何规则(以及元素)。