【问题标题】:Schematron Assert Rule Fails while setting contextSchematron 断言规则在设置上下文时失败
【发布时间】:2014-03-28 18:38:12
【问题描述】:

我正在尝试使用 NMatrix 的 Schematron 来验证 C# 中的 XML。 如果我将“f”命名空间留在命名空间管理器 (nsManager) 之外,则会在执行此代码时出现异常:未声明的命名空间前缀 - f

CompiledXPathExpression _expr;
...
_expr.SetContext(nsManager);

对于 Schematron Line:

<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 &lt;= 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 &lt;= f:end/@value)">Inv-1: If present, start SHALL have a lower value than end</sch:assert>
end</sch:assert>
   </sch:rule>

一开始我以为我遇到了某种命名空间问题,但现在我开始怀疑这种语法对 XPathExpression 是否有效

【问题讨论】:

  • 您使用的是 XPath 1.0 还是 2.0?

标签: c# xpath namespaces xsd schematron


【解决方案1】:

这是一次学习经历! NMatrix-Schematron 已完全过时。它不再工作,仅支持 Schematron 1.5 - 非常旧。

我很难找到完整的演示。我提供了一个使用 Saxon-HE 的完整演示解决方案的链接。

sample code

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多