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 + + + + + + +