关于XSD类型替换控制的困惑及blockDefault属性疑问
问题分析与解决
先明确XSD里block和blockDefault的优先级规则:
blockDefault是整个Schema的默认限制,作用于所有未显式指定block属性的类型或元素。- 当复杂类型自己显式设置
block属性时,会直接覆盖blockDefault的规则。block=""这个空值的实际含义是不施加任何派生替换限制,允许通过xsi:type将该类型替换为任何合法的派生类型。
你碰到的.NET 8.0验证失败问题,本质是微软XML验证器的实现偏差——它没有严格遵循XSD规范,当类型显式设置block=""时,错误地沿用了blockDefault="#all"的限制,没有识别空值代表的“无限制”规则。
临时解决办法
- 明确指定允许的派生类型:把Base类型的
block从空字符串改成具体的派生方式,比如Derived是通过扩展得到的,就写block="extension",直接告知验证器允许这种替换:<xs:complexType name="Base" block="extension"> - 移除Schema的
blockDefault="#all":如果不需要全局限制所有派生替换,直接删掉这个属性,就能恢复正常的验证逻辑。
关于resolved block值的疑问
你认为两种类型的resolved block值为空是正确的,这完全符合XSD规范,空值确实应该覆盖blockDefault。本次验证失败属于.NET实现的问题,你可以到微软开发者社区提交该问题反馈。
内容的提问来源于stack exchange,提问作者voidp
相关产品推荐
相关产品推荐

