2016-03-08 3 views
1

В настоящее время я использую библиотеку PHSchematron для проверки схемы в Java. Если я положил тэг <sch:p> как дочерний элемент <sch:pattern>, тогда он выбрасывает NullPointerException, так как SchematronOutputType имеет значение NULL. Я пытался ставить <sch:p>, как ребенок <sch:schema> и <sch:rule> без каких-либо проблем, хотя XSD означает, что p элемент может быть потомком schema, phase, pattern. Я не уверен, что проблема заключается в реализации PHSchematron или нет. Я предполагаю, что xmlns: sch указывает на версию XSD 1.5 schematron.PHSchematron не удается проверить файл схемы с элементом `p` внутри элемента` pattern`

schematron_1.5.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- schemaVersion of 2001/02/15 --> 
<xs:schema xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.ascc.net/xml/schematron" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ascc.net/xml/schematron" version="+//IDN sinica.edu.tw//SGML W3C XML Schema for Schematron 1.5//EN"> 
    <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"> 
     <xs:annotation> 
      <xs:documentation> 
       Get access to the xml: attribute groups for xml:lang 
      </xs:documentation> 
     </xs:annotation> 
    </xs:import> 
    <xs:annotation> 
     <xs:documentation source="http://www.ascc.net/xml/resource/schematron/schematron.html" xml:lang="en"/> 
    </xs:annotation> 
    <xs:element name="active"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:span"/> 
      </xs:choice> 
      <xs:attribute name="pattern" type="xs:IDREF" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="assert"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:name"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="test" type="xs:string" use="required"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="diagnostics" type="xs:IDREFS"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="subject" type="xs:string" default="."/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="diagnostic"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:value-of"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="id" type="xs:ID" use="required"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="diagnostics"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="diagnostic" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="dir"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
        <xs:attribute name="value"> 
         <xs:simpleType> 
          <xs:restriction base="xs:NMTOKEN"> 
           <xs:enumeration value="ltr"/> 
           <xs:enumeration value="rtl"/> 
          </xs:restriction> 
         </xs:simpleType> 
        </xs:attribute> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="emph" type="xs:string"/> 
    <xs:element name="extends"> 
     <xs:complexType> 
      <xs:attribute name="rule" type="xs:string" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="key"> 
     <xs:complexType> 
      <xs:attribute name="name" type="xs:NMTOKEN" use="required"/> 
      <xs:attribute name="path" type="xs:string" use="required"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="name"> 
     <xs:complexType> 
      <xs:attribute name="path" type="xs:string" default="."/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="ns"> 
     <xs:complexType> 
      <xs:attribute name="uri" type="xs:anyURI" use="required"/> 
      <xs:attribute name="prefix" type="xs:NCName"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="p"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:span"/> 
      </xs:choice> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="class" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="pattern"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:rule" maxOccurs="unbounded"/> 
      </xs:sequence> 
      <xs:attribute name="name" type="xs:string" use="required"/> 
      <xs:attribute name="see" type="xs:anyURI"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="phase"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:active" maxOccurs="unbounded"/> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:string" use="required"/> 
      <xs:attribute name="fpi" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="report"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:name"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="test" type="xs:string" use="required"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="diagnostics" type="xs:IDREFS"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="subject" type="xs:string" default="."/> 
      <xs:attribute ref="xml:lang"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="rule"> 
     <xs:complexType> 
      <xs:choice maxOccurs="unbounded"> 
       <xs:element ref="sch:assert"/> 
       <xs:element ref="sch:report"/> 
       <xs:element ref="sch:key"/> 
       <xs:element ref="sch:extends"/> 
      </xs:choice> 
      <xs:attribute name="context" type="xs:string"/> 
      <xs:attribute name="abstract" type="xs:boolean" default="false"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="schema"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="sch:title" minOccurs="0"/> 
       <xs:element ref="sch:ns" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:phase" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:pattern" maxOccurs="unbounded"/> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:diagnostics" minOccurs="0"/> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:ID"/> 
      <xs:attribute name="fpi" type="xs:string"/> 
      <xs:attribute name="schemaVersion" type="xs:string"/> 
      <xs:attribute name="defaultPhase" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="ns" type="xs:anyURI"/> 
      <xs:attribute name="version" type="xs:string" default="1.5"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
     <xs:unique name="assertId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:assert"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="reportId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:report"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="ruleId"> 
      <xs:selector xpath="sch:pattern/sch:rule"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="patternId"> 
      <xs:selector xpath="sch:pattern"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="pId"> 
      <xs:selector xpath=".//sch:p"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:key name="phaseId"> 
      <xs:selector xpath="sch:phase"/> 
      <xs:field xpath="@id"/> 
     </xs:key> 
     <xs:keyref name="activePattern" refer="patternId"> 
      <xs:selector xpath="sch:phase/sch:active"/> 
      <xs:field xpath="@pattern"/> 
     </xs:keyref> 
     <xs:keyref name="extendsRule" refer="ruleId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:extends"/> 
      <xs:field xpath="@rule"/> 
     </xs:keyref> 
     <xs:keyref name="defaultPhase" refer="phaseId"> 
      <xs:selector xpath="."/> 
      <xs:field xpath="@defaultPhase"/> 
     </xs:keyref> 
     <!-- Define the identity constraints --> 
    </xs:element> 
    <xs:element name="span"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
        <xs:attribute name="class" type="xs:string"/> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="title"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="value-of"> 
     <xs:complexType> 
      <xs:attribute name="select" type="xs:string" use="required"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

sample_schematron.sch

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema 
    xmlns:sch="http://purl.oclc.org/dsdl/schematron" 
    queryBinding="xslt2" 
    xmlns="http://purl.oclc.org/dsdl/schematron" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://purl.oclc.org/dsdl/schematron"> 
    <sch:pattern id="sampleValidation"> 
     <sch:title>PatternTitle</sch:title> 
     <sch:p>A paragraph</sch:p> 
     <sch:rule context="CCC"> 
      <assert test="normalize-space(.) and *">Source contains an empty element</assert> 
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

SchematronUtil.java:

public class SchematronUtil { 
    public static boolean validateXMLViaXSLTSchematron(@Nonnull final File aSchematronFile, 
      @Nonnull final File aXMLFile) throws Exception { 
     final ISchematronResource aResSCH = SchematronResourceSCH.fromFile(aSchematronFile); 
     if (!aResSCH.isValidSchematron()) 
      throw new IllegalArgumentException("Invalid Schematron!"); 
     return aResSCH.getSchematronValidity(new StreamSource(aXMLFile)).isValid(); 
    } 

    public static SchematronOutputType validateXMLViaXSLTSchematronFull(@Nonnull final File aSchematronFile, 
      @Nonnull final File aXMLFile) throws Exception { 
     final ISchematronResource aResSCH = SchematronResourceSCH.fromFile(aSchematronFile); 
     if (!aResSCH.isValidSchematron()) 
      throw new IllegalArgumentException("Invalid Schematron!"); 
     return aResSCH.applySchematronValidationToSVRL(new StreamSource(aXMLFile)); 
    } 

    public static boolean validateXMLViaPureSchematron(@Nonnull final File aSchematronFile, 
      @Nonnull final File aXMLFile) throws Exception { 
     final ISchematronResource aResPure = SchematronResourcePure.fromFile(aSchematronFile); 
     if (!aResPure.isValidSchematron()) 
      throw new IllegalArgumentException("Invalid Schematron!"); 
     return aResPure.getSchematronValidity(new StreamSource(aXMLFile)).isValid(); 
    } 

    public static boolean validateXMLViaPureSchematron2(@Nonnull final File aSchematronFile, 
      @Nonnull final File aXMLFile) throws Exception { 
     // Read the schematron from file 
     final PSSchema aSchema = new PSReader(new FileSystemResource(aSchematronFile)).readSchema(); 
     if (!aSchema.isValid(new DoNothingPSErrorHandler())) 
      throw new IllegalArgumentException("Invalid Schematron!"); 
     // Resolve the query binding to use 
     final IPSQueryBinding aQueryBinding = PSQueryBindingRegistry 
       .getQueryBindingOfNameOrThrow(aSchema.getQueryBinding()); 
     // Pre-process schema 
     final PSPreprocessor aPreprocessor = new PSPreprocessor(aQueryBinding); 
     aPreprocessor.setKeepTitles(true); 
     final PSSchema aPreprocessedSchema = aPreprocessor.getAsPreprocessedSchema(aSchema); 
     // Bind the pre-processed schema 
     final IPSBoundSchema aBoundSchema = aQueryBinding.bind(aPreprocessedSchema, null, null, null, null); 
     // Read the XML file 
     final Document aXMLNode = DOMReader.readXMLDOM(aXMLFile); 
     if (aXMLNode == null) 
      return false; 
     // Perform the validation 
     return aBoundSchema.validatePartially(aXMLNode).isValid(); 
    } 

    public static boolean readModifyAndWrite(@Nonnull final File aSchematronFile) throws Exception { 
     final PSSchema aSchema = new PSReader(new FileSystemResource(aSchematronFile)).readSchema(); 
     final PSTitle aTitle = new PSTitle(); 
     aTitle.addText("Created by ph-schematron"); 
     aSchema.setTitle(aTitle); 
     return MicroWriter.writeToFile(aSchema.getAsMicroElement(), aSchematronFile).isSuccess(); 
    } 
} 

Основной метод:

SchematronOutputType outputType = SchematronUtil.validateXMLViaXSLTSchematronFull(schematronFile, xmlFile); 

      if (outputType == null){ 
       throw new Exception("SchematronOutputType null"); 
      } 

      List<SVRLSuccessfulReport> succeededList = SVRLHelper.getAllSuccessfulReports(outputType); 
      for (SVRLSuccessfulReport succeededReport : succeededList){ 
       System.out.println(succeededReport.getTest()); 
      } 

      int i = 1; 
      List<SVRLFailedAssert> failedList = SVRLHelper.getAllFailedAssertions(outputType); 
      for (SVRLFailedAssert failedAssert : failedList) { 
       System.out.println(i++ + ". Location:" + failedAssert.getLocation()); 
       System.out.println("Test: " + failedAssert.getTest()); 
       System.out.println("Text: " + failedAssert.getText()); 

       List<DiagnosticReference> diagnisticReferences = failedAssert.getDiagnisticReferences(); 
       for (DiagnosticReference diagnisticRef : diagnisticReferences) { 
        System.out.println("Diag ref: " + diagnisticRef.getDiagnostic()); 
        System.out.println("Diag text: " + diagnisticRef.getText()); 
       } 
      } 

      if (failedList.isEmpty()){ 
       System.out.println("PASS"); 
      } 
      else{ 
       System.out.println("FAIL"); 
      } 
+0

Почему вы отметили вопрос 'xslt'? –

+0

@ MathiasMüller, потому что я проверяю использование XSLT2, PHSchematron поддерживает проверки XSLT и Pure Schematron – Silentbang

ответ

0

Тестирование в соответствии с общими правилами ISO Schematron, ваш документ Schematron является правильным, за исключением атрибута targetNamespace. Наличие пространства имен по умолчанию в нем xmlns="..." тоже не имеет особого смысла, поскольку все элементы имеют префикс.

Schematron

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
    <sch:pattern id="sampleValidation"> 
     <sch:title>PatternTitle</sch:title> 
     <sch:p>A paragraph</sch:p> 
     <sch:rule context="CCC"> 
      <assert test="normalize-space(.) and *">Source contains an empty element</assert> 
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

Затем Schematron прекрасно, но есть куча проблем с XML-схемы. Прежде всего, пространства имен в документе XML Schema отличаются. Файл Schematron имеет http://purl.oclc.org/dsdl/schematron, а в XSD - http://www.ascc.net/xml/schematron. Это, скорее всего, потому, что вы используете старую XML-схему для более старой версии Schematron.

Наличие правильных пространств имен должно решить проблему с недопустимым sch:p внутри sch:pattern. После фиксации проблемы пространства имен в XSD, следующие проблемы остаются:

Attribute 'queryBinding' is not allowed to appear in element 'sch:schema'. 
Attribute 'name' must appear on element 'sch:pattern'. 
Invalid content was found starting with element '{"http://purl.oclc.org/dsdl/schematron":title}'. One of '{"http://purl.oclc.org/dsdl/schematron":p, "http://purl.oclc.org/dsdl/schematron":rule}' is expected. 

Все это может быть исправлено путем изменения схемы XML, следующая версия, которая работает:

XML Schema

<?xml version="1.0" encoding="UTF-8"?> 
<!-- schemaVersion of 2001/02/15 --> 
<xs:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://purl.oclc.org/dsdl/schematron" version="+//IDN sinica.edu.tw//SGML W3C XML Schema for Schematron 1.5//EN"> 
    <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"> 
     <xs:annotation> 
      <xs:documentation> 
       Get access to the xml: attribute groups for xml:lang 
      </xs:documentation> 
     </xs:annotation> 
    </xs:import> 
    <xs:annotation> 
     <xs:documentation source="http://www.ascc.net/xml/resource/schematron/schematron.html" xml:lang="en"/> 
    </xs:annotation> 
    <xs:element name="active"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:span"/> 
      </xs:choice> 
      <xs:attribute name="pattern" type="xs:IDREF" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="assert"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:name"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="test" type="xs:string" use="required"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="diagnostics" type="xs:IDREFS"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="subject" type="xs:string" default="."/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="diagnostic"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:value-of"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="id" type="xs:ID" use="required"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="diagnostics"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="diagnostic" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="dir"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
        <xs:attribute name="value"> 
         <xs:simpleType> 
          <xs:restriction base="xs:NMTOKEN"> 
           <xs:enumeration value="ltr"/> 
           <xs:enumeration value="rtl"/> 
          </xs:restriction> 
         </xs:simpleType> 
        </xs:attribute> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="emph" type="xs:string"/> 
    <xs:element name="extends"> 
     <xs:complexType> 
      <xs:attribute name="rule" type="xs:string" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="key"> 
     <xs:complexType> 
      <xs:attribute name="name" type="xs:NMTOKEN" use="required"/> 
      <xs:attribute name="path" type="xs:string" use="required"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="name"> 
     <xs:complexType> 
      <xs:attribute name="path" type="xs:string" default="." /> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="ns"> 
     <xs:complexType> 
      <xs:attribute name="uri" type="xs:anyURI" use="required"/> 
      <xs:attribute name="prefix" type="xs:NCName"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="p"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:span"/> 
      </xs:choice> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="class" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="pattern"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="sch:title" minOccurs="0"/> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:rule" maxOccurs="unbounded"/> 
      </xs:sequence> 
      <xs:attribute name="name" type="xs:string" use="optional"/> 
      <xs:attribute name="see" type="xs:anyURI"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="phase"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:active" maxOccurs="unbounded"/> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:string" use="required"/> 
      <xs:attribute name="fpi" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="report"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:name"/> 
       <xs:element ref="sch:emph"/> 
       <xs:element ref="sch:dir"/> 
       <xs:element ref="sch:span"/> 
       <xs:any namespace="##other" processContents="lax"/> 
      </xs:choice> 
      <xs:attribute name="test" type="xs:string" use="required"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
      <xs:attribute name="diagnostics" type="xs:IDREFS"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="subject" type="xs:string" default="."/> 
      <xs:attribute ref="xml:lang"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="rule"> 
     <xs:complexType> 
      <xs:choice maxOccurs="unbounded"> 
       <xs:element ref="sch:assert"/> 
       <xs:element ref="sch:report"/> 
       <xs:element ref="sch:key"/> 
       <xs:element ref="sch:extends"/> 
      </xs:choice> 
      <xs:attribute name="context" type="xs:string"/> 
      <xs:attribute name="abstract" type="xs:boolean" default="false"/> 
      <xs:attribute name="role" type="xs:NMTOKEN"/> 
      <xs:attribute name="id" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="schema"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="sch:title" minOccurs="0"/> 
       <xs:element ref="sch:ns" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:phase" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:pattern" maxOccurs="unbounded"/> 
       <xs:element ref="sch:p" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="sch:diagnostics" minOccurs="0"/> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:ID"/> 
      <xs:attribute name="fpi" type="xs:string"/> 
      <xs:attribute name="schemaVersion" type="xs:string"/> 
      <xs:attribute name="defaultPhase" type="xs:string"/> 
      <xs:attribute name="icon" type="xs:anyURI"/> 
      <xs:attribute name="ns" type="xs:anyURI"/> 
      <xs:attribute name="version" type="xs:string" default="1.5"/> 
      <xs:attribute ref="xml:lang"/> 
      <xs:attribute name="queryBinding" type="xs:string"/> 
      <xs:anyAttribute namespace="##other" processContents="lax"/> 
     </xs:complexType> 
     <xs:unique name="assertId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:assert"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="reportId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:report"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="ruleId"> 
      <xs:selector xpath="sch:pattern/sch:rule"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="patternId"> 
      <xs:selector xpath="sch:pattern"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:unique name="pId"> 
      <xs:selector xpath=".//sch:p"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
     <xs:key name="phaseId"> 
      <xs:selector xpath="sch:phase"/> 
      <xs:field xpath="@id"/> 
     </xs:key> 
     <xs:keyref name="activePattern" refer="patternId"> 
      <xs:selector xpath="sch:phase/sch:active"/> 
      <xs:field xpath="@pattern"/> 
     </xs:keyref> 
     <xs:keyref name="extendsRule" refer="ruleId"> 
      <xs:selector xpath="sch:pattern/sch:rule/sch:extends"/> 
      <xs:field xpath="@rule"/> 
     </xs:keyref> 
     <xs:keyref name="defaultPhase" refer="phaseId"> 
      <xs:selector xpath="."/> 
      <xs:field xpath="@defaultPhase"/> 
     </xs:keyref> 
     <!-- Define the identity constraints --> 
    </xs:element> 
    <xs:element name="span"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
        <xs:attribute name="class" type="xs:string"/> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="title"> 
     <xs:complexType mixed="true"> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element ref="sch:dir"/> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="value-of"> 
     <xs:complexType> 
      <xs:attribute name="select" type="xs:string" use="required"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Но, пожалуйста, имейте в виду: этот документ XSD устарел и не отражает последние изменения спецификации Schematron. Очень вероятно, что с ним будут другие проблемы.

В качестве альтернативы вы можете использовать последние ISO Schematron and SQF schemas from Schematron Quickfix. Убедитесь, что вы загружаете все компоненты схемы, а затем проверяете на iso-schematron.xsd.

+0

Благодарим за то, что вы указали мне файл ISO Schematron XSD.Как проверить его проверку, Notepad ++? – Silentbang

+0

@Silentbang Я использовал Oxygen для тестирования, но я уверен, что вы также можете сделать это с помощью Notepad ++ или инструмента командной строки, такого как xmllint. Однако вам нужен инструмент, который понимает как XSD, так и Schematron. –

+0

@Silentbang Итак, это решило вашу проблему? Что-то не хватает в моем ответе? Пожалуйста, примите этот ответ или сообщите мне, если с ним что-то не так. –

 Смежные вопросы

  • Нет связанных вопросов^_^