2017-04-19 61 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/