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) &gt; 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]) &gt; 1">Duplicitiní osobní číslo
            <sch:value-of select="@id"/> u elementu <sch:name/>.</sch:report>
        </sch:rule>
      </sch:pattern>
    </element>
  </oneOrMore>
</element>