diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2e2e6d3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+*.xsd
+*.rng
+*.sch
+/test/*-compiled.xspec
+/test/xspec
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0b0be8d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
+XSPEC = xspec.cmd
+TRANG = java -jar lib/trang.jar
+SAXON = java -jar lib/saxon9he.jar
+
+%.rng: %.rnc
+ $(TRANG) -I rnc -O rng $< $@
+
+%.xsd: %.rnc
+ $(TRANG) -I rnc -O xsd $< $@
+
+%.sch: %.rng
+ $(SAXON) -xsl:lib/rngsch.xsl -o:$@ $<
+
+test: src/ruleset.sch
+ $(XSPEC) -s test/ruleset.xspec
+
+all: src/ruleset.xsd src/ruleset.rng src/ruleset.sch test
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..612ce07
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+Schemata für Kitodo.Production
+==
diff --git a/lib/rngsch.xsl b/lib/rngsch.xsl
new file mode 100644
index 0000000..e94f7f0
--- /dev/null
+++ b/lib/rngsch.xsl
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/saxon9he.jar b/lib/saxon9he.jar
new file mode 100644
index 0000000..93b7df7
Binary files /dev/null and b/lib/saxon9he.jar differ
diff --git a/lib/trang.jar b/lib/trang.jar
new file mode 100644
index 0000000..b3d3de1
Binary files /dev/null and b/lib/trang.jar differ
diff --git a/src/ruleset.rnc b/src/ruleset.rnc
new file mode 100644
index 0000000..40a0b15
--- /dev/null
+++ b/src/ruleset.rnc
@@ -0,0 +1,78 @@
+# -*- mode: rnc; -*-
+#
+# RelaxNG Schema für Kitido.Production Regelsatz
+#
+# Author: David Maus
+# Timestamp: <2017-10-10 15:16:42 maus>
+#
+
+namespace s = "http://purl.oclc.org/dsdl/schematron"
+
+start = Preferences
+
+Preferences =
+ element Preferences {
+ element debug { "0" | "1" }?,
+ MetadataTypeDef*
+ }
+
+MetadataTypeDef =
+ element Metadata {
+ attribute type { "person" | "identifier" }?,
+ (
+ Name
+ & NameTranslation*
+ )
+ }
+
+Name =
+ ## Interner Name des Metadaten- oder Strukturtyps. Der Name wird zur Referenzierung benutzt und muss daher dokumentweit eindeutig sein.
+ element Name { xsd:NMTOKEN }
+
+NameTranslation =
+ ## Übersetzung eines Namens in die über das Attribut @name spezifizierte Sprache.
+ element language {
+ attribute name { xsd:language },
+ text
+ }
+
+StructTypeDef =
+ element DocStrctType {
+ attribute anchor { "true" }?
+ & Name
+ & NameTranslation
+ & AllowedChildStruct*
+ & AllowedMetadata*
+ }
+
+AllowedChildStruct =
+ [
+ s:pattern [
+ s:rule [
+ context = "allowedchildtype" s:assert [
+ test = "/Preferences/DocStrctType[Name = .]"
+ "Der Strukturtyp '" s:value-of [ select = "." ] "' muss definiert werden."
+ ]
+ ]
+ ]
+ ]
+ element allowedchildtype {
+ xsd:NMTOKEN
+ }
+
+AllowedMetadata =
+ [
+ s:pattern [
+ s:rule [
+ context = "metadata[parent::DocStrctType]" s:assert [
+ test = "/Preferences/MetadataType[Name = .]"
+ "Das Metadatum '" s:value-of [ select = "." ] "' muss definiert werden."
+ ]
+ ]
+ ]
+ ]
+ element metadata {
+ attribute num { "*" | "+" | "1o" | "1m" }?,
+ attribute DefaultDisplay { text }?,
+ xsd:NMTOKEN
+ }
\ No newline at end of file
diff --git a/test/ruleset.xspec b/test/ruleset.xspec
new file mode 100644
index 0000000..9095837
--- /dev/null
+++ b/test/ruleset.xspec
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ is-defined
+
+
+ is-defined
+
+
+
+
+
+
+
+
+
+ is-not-defined
+
+
+
+
+
+
+