2017-04-19 38 views
0

我正在使用Schematron.net nuget包來驗證一些XML,但我無法弄清楚如何正確使用診斷標記。我有以下XML:如何讓Schematron.net觸發診斷?

<bk:books xmlns:bk="http://www.example.com/books"> 
    <bk:book publisher="QUE"> 
    <bk:title>XML By Example</bk:title> 
    <!--<bk:author>Benoit Marchal</bk:author>--> 
    <bk:publication-date>1999-12-31</bk:publication-date> 
    <bk:retailPrice>9.95</bk:retailPrice> 
    </bk:book> 
    <bk:book publisher="Addison Wesley"> 
    <bk:title>Essential C++</bk:title> 
    <bk:author>Stanley Lippman</bk:author> 
    <bk:publication-date>2000-10-31</bk:publication-date> 
    <bk:retailPrice>29.95</bk:retailPrice> 
    </bk:book> 
</bk:books> 

我的簡化Schematron模式是這樣的:

<schema xmlns="http://www.ascc.net/xml/schematron" 
     schemaVersion="1.01" > 
    <title>A Schema for Books</title> 
    <ns prefix="bk" uri="http://www.example.com/books" /> 
    <pattern id="authorTests"> 
    <rule context="bk:book"> 
     <assert test="count(bk:author)!= 0" diagnostics="bookTest"> 
     A book must have at least one author 
     </assert> 
    </rule> 
    </pattern> 
    <diagnostics> 
    <diagnostic id="bookTest"> 
     The book that has no author is <value-of select="bk:title"></value-of> 
    </diagnostic> 
    </diagnostics> 
</schema> 

我正在行使這一模式的代碼如下所示:

try 
    { 
     var bookValidator = new Validator(); 
     bookValidator.AddSchema("book.xsd"); 
     bookValidator.Validate("book.xml"); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

當這運行時,我得到以下控制檯輸出:

Results from Schematron validation: A Schema for Books 
    From pattern "" 
     Assert fails: A book must have at least one author 
     At: /bk:bk:books[1]/bk:bk:book[1] 
      <bk:book publisher="QUE">...</bk:book> 
      (Line: 3, Column: 4) 
      xmlns:bk="http://www.example.com/books" 

爲什麼我在控制檯中看不到診斷標記的輸出?

回答

0

看起來好像NMatrix.Schematron實現不支持全套Schematron功能。在查看源代碼後,我根本找不到任何對診斷元素的引用。此外,該代碼似乎只支持XPath 1.0和Schematron的早期實現(在命名空間改爲ISO標準化之前)。最好的建議是使用Schematron「Skeleton」實現作爲指導來實現Schematron管道,可以在這裏找到:http://schematron.com/front-page/the-schematron-skeleton-implementation/