Schematron est un langage se conformant lui-même au balisage XML. Il permet de définir un ensemble d'assertions en XPath liées à des métadonnées, tel qu'un message d'erreur en texte libre. Le code ci-dessous est un exemple de fichier Schematron :
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern>
<title>Contraintes sur les dates</title>
<rule context="Contract">
<assert test="ContractDate < current-date()">La date des contrats, ContractDate, doit être passée.</assert>
</rule>
</pattern>
</schema>
L'assertion vérifie que, pour chaque élément Contract, il existe un élément fils ContractDate dont la valeur est inférieure à la date actuelle.
Il est également possible d'embarquer les règles directement dans un fichier XSD ou RELAX NG. Le code ci-dessous est un exemple de règles embarquées dans un schéma XSD :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<xs:element name="adresse">
<xs:annotation>
<xs:appinfo>
<sch:pattern>
<sch:rule context="adresse">
<sch:assert test="(@ville and @codePostal) or not @ville">Dans une adresse,
si l'attribut ville est renseigné, alors le code postal doit également être renseigné.</sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:attribute name="ville" type="xs:string" use="optional"/>
<xs:attribute name="codePostal" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>
Plusieurs implémentations consistent à convertir les fichiers Schematron en feuilles XSLT, un simple processeur XSLT permet alors de valider les fichiers XML.
Certains outils commerciaux, par exemple Oxygen XML Editor et XMLBlueprint XML Editor, vérifient nativement les contraintes Schematron.