2014-02-26 61 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