XML 架构 : Referenced attribute is missing

标签 xml xsd schema xsd-validation

当根据模式验证以下 XML 时,KeyB 的引用属性被标记为缺失/未声明,除非以命名空间为前缀。声明为“内联”的 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.

最佳答案

嗯,这很简单。

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

这由 attributeFormDefault 控制你的 <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 的值是"unqualified" . 因此,当您错过它时,您的所有本地属性都是不合格的(不需要 namespace 前缀)。

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

关于XML 架构 : Referenced attribute is missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573724/

相关文章:

xml - 如何为相同类型的嵌套元素创建带有键/键引用的 xml 模式

schema - 在 MySQL 中提取现有模式,出现未知错误,需要帮助

postgresql - 在 Postgres 中 GRANT/REVOKE 时限制模式的范围

java - 在哪里放置 DTD 和模式文件

java - xml 错误元素或属性与 QName 生成不匹配:QName::=(NCName':')?NCName

c# - 将 ListBox 绑定(bind)到 XmlDocument

javascript - 使用 javascript 通过 XML 验证 XSD

.net - 我的 ConfigurationSection 的 xsd 模式

xml - Xliff - 如何使用 Delphi 读取属性?

jquery 嵌套每个问题