我正在尝试使用 NMatrix 的 Schematron 来验证 C# 中的 XML。如果我将“f”命名空间留在命名空间管理器 (nsManager) 之外,则会出现异常:未声明的命名空间前缀 - f执行此代码时。
CompiledXPathExpression _expr;
...
_expr.SetContext(nsManager);
对于 Schematron 线:
<sch:rule context="/f:Patient/f:identifier/f:period">
添加“f”命名空间后,“规则”行完成,但 执行相同代码时出现异常:无法识别的扩展函数命名空间:前缀='',命名空间URI='' 。
CompiledXPathExpression _expr;
...
_expr.SetContext(nsManager);
对于下一个 Schematron 行:
<sch:assert test="not(exists(f:start)) or not(exists(f:end)) or (f:start/@value <= f:end/@value)">Inv-1: If present, start SHALL have a lower value than end</sch:assert>
经过一些实验,我发现这是可行的:
<sch:rule context="/f:Patient/f:identifier/f:period">
<sch:assert test="f:start">Inv-1: If present, start SHALL have a lower value than end</sch:assert>
</sch:rule>
但这失败了:
<sch:rule context="/f:Patient/f:identifier/f:period">
<sch:assert test="not(exists(f:start)) or not(exists(f:end)) or (f:start/@value <= f:end/@value)">Inv-1: If present, start SHALL have a lower value than end</sch:assert>
end</sch:assert>
</sch:rule>
起初我以为我遇到了某种命名空间问题,但现在我开始怀疑这种语法对 XPathExpression 是否有效