XSLT的document()函数何时对外部XML文件执行模式验证?
XslCompiledTransform次级输入校验行为相关问题解答
前置测试条件
调用XslCompiledTransform.Transform时,使用的读取器配置了ValidationType.Schema、XmlSchemaValidationFlags.ProcessSchemaLocation,且配有可定位schemaLocation属性引用的XSD文件的解析器。转换中包含document()函数调用,用于读取转换编译完成后、Transform调用前生成的次级输入文件,该文件带有有效的schemaLocation属性;转换的主输入无schemaLocation,也无对应的XSD定义,且次级输入不符合其引用的XSD规范。
测试场景归纳
- 共提供两个文件
- 一个文件作为转换的主输入
- 该主输入无关联模式,也无
schemaLocation属性 - 第二个文件通过转换中的
document()函数访问 - 该文件带有
schemaLocation属性,可引用到可用的XSD - 该XSD本身是有效的
- 第二个文件不符合对应XSD的校验规则
核心问题
XslCompiledTransform.Transform调用是否会尝试验证次级输入?当次级输入格式良好但不符合模式要求时,是否会抛出内部包含XmlSchemaValidationException的XslTransformException提示次级输入的验证错误?- 相同测试用例在Visual Studio Test Explorer中运行时触发验证并抛出异常,在同实例的Resharper单元测试会话中运行时成功完成转换,两种行为哪一种更符合规范?
解答结论
虽然目前没有官方文档明确说明该场景的处理规则,但从.NET类库上下文配置继承的设计惯例来看,Visual Studio Test Explorer触发校验抛出异常的行为更符合规范。
原因如下:XslCompiledTransform默认会将主输入读取器的配置继承到转换过程中所有内部加载的XML资源的读取流程中,包括通过document()函数加载的次级输入,没有显式指定独立读取器配置的前提下,次级输入会沿用主输入的Schema校验规则。上述场景下次级输入不符合关联XSD要求,理应触发校验抛出对应异常。
Resharper测试会话未抛出异常的情况,属于测试宿主隐式修改了读取器默认配置、或打断了转换上下文配置继承链路导致的非标准行为,不符合.NET类库的默认设计逻辑。
内容的提问来源于stack exchange,提问作者Jirka Hanika
相关产品推荐
相关产品推荐

