You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于XSD类型替换控制的困惑及blockDefault属性疑问

问题分析与解决

先明确XSD里block和blockDefault的优先级规则:

  • blockDefault是整个Schema的默认限制,作用于所有未显式指定block属性的类型或元素。
  • 当复杂类型自己显式设置block属性时,会直接覆盖blockDefault的规则。block=""这个空值的实际含义是不施加任何派生替换限制,允许通过xsi:type将该类型替换为任何合法的派生类型。

你碰到的.NET 8.0验证失败问题,本质是微软XML验证器的实现偏差——它没有严格遵循XSD规范,当类型显式设置block=""时,错误地沿用了blockDefault="#all"的限制,没有识别空值代表的“无限制”规则。

临时解决办法

  1. 明确指定允许的派生类型:把Base类型的block从空字符串改成具体的派生方式,比如Derived是通过扩展得到的,就写block="extension",直接告知验证器允许这种替换:
    <xs:complexType name="Base" block="extension">
    
  2. 移除Schema的blockDefault="#all":如果不需要全局限制所有派生替换,直接删掉这个属性,就能恢复正常的验证逻辑。

关于resolved block值的疑问

你认为两种类型的resolved block值为空是正确的,这完全符合XSD规范,空值确实应该覆盖blockDefault。本次验证失败属于.NET实现的问题,你可以到微软开发者社区提交该问题反馈。

内容的提问来源于stack exchange,提问作者voidp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:26:16