RELAX NG + Schematron
<?xml version="1.0" encoding="utf-8"?>
<element xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:sch="http://www.ascc.net/xml/schematron"
name="zamestnanci">
<sch:pattern name="Máme dost na vyplacení platů">
<sch:rule context="zamestnanci">
<sch:report test="sum(zamestnanec/plat) > 50000">Součet platů nemůže být větší než 50.000,-.
Současný součet je <sch:value-of select="sum(zamestnanec/plat)"/></sch:report>
</sch:rule>
</sch:pattern>
<oneOrMore>
<element name="zamestnanec">
<attribute name="id">
<data type="int"/>
</attribute>
<element name="jmeno">
<data type="string"/>
</element>
<element name="prijmeni">
<data type="string"/>
</element>
<oneOrMore>
<element name="email">
<data type="string"/>
</element>
</oneOrMore>
<optional>
<element name="plat">
<data type="decimal"/>
</element>
</optional>
<element name="narozen">
<data type="date"/>
</element>
<sch:pattern name="Duplicita osobních čísel">
<sch:rule context="zamestnanec">
<sch:report test="count(../zamestnanec[@id = current()/@id]) > 1">Duplicitiní osobní číslo
<sch:value-of select="@id"/> u elementu <sch:name/>.</sch:report>
</sch:rule>
</sch:pattern>
</element>
</oneOrMore>
</element>