XSD:文档范围的属性

时间:2011-03-30 14:56:22

标签: xml xsd

嘿,我在引用文档范围的已定义属性时遇到了困难。我使用ref属性使用元素内部的属性,我认为它应该工作。但是当我尝试针对它验证我的测试XML文件时,我只是得到一个错误,该属性未定义。

如果我用内联声明替换ref - 属性,或者甚至用只包含属性定义的attributeGroup替换它,那么它就会神奇地起作用。 Visual Studio的自动完成建议我再次使用一些前缀导入命名空间,并希望在属性上使用该前缀,尽管命名空间本身已经作为默认命名空间导入(并且是唯一要使用的命名空间)。

我已经将我的XML和我的XSD文件简化了,所以剩下的就是:

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="http://example.com/test" attr="xy" />
<!-- Visual Studio autocompletes to this, which works too:
<foo xmlns="http://example.com/test" a:attr="xy" xmlns:a="http://example.com/test" />
-->

这就是计划:

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

  <xs:attribute name="attr" type="xs:string" />

  <xs:attributeGroup name="attrGroup">
    <xs:attribute name="attr" type="xs:string" />
  </xs:attributeGroup>

  <xs:element name="foo">
    <xs:complexType>
      <xs:attribute ref="attr" />
      <!-- These two examples work:
      <xs:attributeGroup ref="attrGroup" />
      <xs:attribute name="attr" type="xs:string" />
      -->
    </xs:complexType>
  </xs:element>
</xs:schema>

这种行为的原因是什么?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

ref="attr"是对name="attr"的顶级属性声明的引用,它声明了架构文档的目标命名空间中的属性。这通常不是您想要的,这就是很少见到顶级属性声明的原因。最好引用属性组,该属性组包含名为"attr"的本地属性,该属性(因为attributeFormDefault是隐式不合格的)没有名称空间。