2014-02-26 29 views
0

我正在尝试使用NMatrix的Schematron来验证C#中的XML。 如果我将“f”名称空间留在名称空间管理器(nsManager)之外,那么执行此代码时会出现以下异常:未声明的名称空间前缀 - fSchematron断言规则设置上下文时失败

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 &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更有效

+0

您使用XPath 1.0还是2.0? –

回答

0

这是一次学习体验! NMatrix-Schematron完全过时。它不再有效,只支持Schematron 1.5 - 非常陈旧。

我有一个很难找到一个完整的演示。我已经使用Saxon-HE包含了一个完整演示解决方案的链接。

sample code

+0

您现在可以使用XRouter的SchemaTron作为本机(.NET)ISO Schematron(带有xpath2/xslt2)。 https://github.com/gap777/SchemaTron – gap