innoQ

CAPSLOCKMarcel’s (CAPS)Weblog


Validierung mit Schematron und Jing

25.05.05

Für einen Artikel wollte ich ein XML Dokument mit Schematron validieren. Dabei wollte ich aus meinem Javacode heraus die Validierung anstossen. Mehrere Ansätze und APIs hätten sich angeboten. Eine Liste von APIs findet sich hier.

Ich habe mich für Jing entschieden. Ein Java-API von James Clark, dass er zur Validierung mit Relax NG geschrieben hat. Es ist allerdings auch eine Schematron Validierung damit möglich. Die Dokumentation dazu habe ich allerdings nciht gefunden, musste mich also durch den Sourcecode quälen, um zu sehen, wie ich denn nun das XML Dokument mit Schematron und Jing validiert bekomme.

Damit ich nicht noch mal Stunden damit verbinge, wollte ich ein paar Punkte festhalten.

  1. zunächst muss eine SchematronSchemaReaderFactory erzeugt werden; hier die XalanSchemaReaderFactory; alternativ dazu gibt es noch die SaxonSchemaReaderFactory
  2. als nächstes wird ein ValidationDriver erzeugt. Dabei hilft die Factory; hier ist zu beachten, dass der createSchemaReader()-Methode die korrekte Schemtron-Uri (http://www.ascc.net/xml/schematron) übergeben wird, sonst erzeugt die Factory nix
  3. dann darf man nicht vergessen ein Schemtron-Schema über die loadSchema()-Methode zu laden
  4. zum Schluss kann dann eine InputSource validiert werden

Hier nun der Code: import java.io.FileReader; import java.io.StringReader; import org.xml.sax.InputSource; import com.thaiopensource.validate.ValidationDriver; import com.thaiopensource.validate.schematron.SchematronSchemaReaderFactory; import com.thaiopensource.validate.schematron.XalanSchemaReaderFactory;

/**
 * How to validate with Schematron and Jing. 
 */
public class SchematronValidation {
  // Schematron URI
  private static final String SCHEMATRON_URI = "http://www.ascc.net/xml/schematron";
  /**
   * Validates the input with the given xslt.
   * @param input
   */
   public static boolean validate(org.w3c.dom.Node content, String xslt) {
      try {
          InputSource message = new InputSource(new StringReader(
              content.toString())); 
          SchematronSchemaReaderFactory readerFactory = new XalanSchemaReaderFactory();
          ValidationDriver validDriver = new ValidationDriver(
              readerFactory.createSchemaReader(SCHEMATRON_URI));
          validDriver.loadSchema(new InputSource(
              new FileReader(xslt)));
          return validDriver.validate(message);
       } catch (Exception e) {
          System.out.println(e.getMessage());
       }
       return false;
    }
}

Die XSLT-Datei könnte wie folgt aussehen:

<schema xmlns="http://www.ascc.net/xml/schematron">
  <ns prefix="ws" uri="http://ws.innoq.com"/>
  <pattern name="OrderReturn">
    <rule context="ws:orderReturn">
      <assert test="ws:number">Schema contains number.</assert>
      <assert test="ws:block">Schema contains block.</assert>
    </rule>
  </pattern>
</schema>

Post a comment




Remember Me?