嘿,我在引用文档范围的已定义属性时遇到了困难。我使用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>
这种行为的原因是什么?我该怎么做才能解决这个问题?
答案 0 :(得分:3)
ref="attr"
是对name="attr"
的顶级属性声明的引用,它声明了架构文档的目标命名空间中的属性。这通常不是您想要的,这就是很少见到顶级属性声明的原因。最好引用属性组,该属性组包含名为"attr"
的本地属性,该属性(因为attributeFormDefault
是隐式不合格的)没有名称空间。