From 3406d0e4a884bf0863e5b8e74b0426652d255859 Mon Sep 17 00:00:00 2001
From: Frank Steinberg <steinberg@ibr.cs.tu-bs.de>
Date: Sun, 6 Oct 2019 15:07:31 +0200
Subject: [PATCH] Added XML Schema support. "make check".

---
 Makefile                                |  13 +-
 README.md                               |   4 +
 de/1.xml                                |   2 +-
 de/10.xml                               |   5 +-
 de/10A.xml                              |   2 +-
 de/10B.xml                              |   2 +-
 de/10C.xml                              |   4 +-
 de/11.xml                               |   7 +-
 de/11A.xml                              |   2 +-
 de/11B.xml                              |   2 +-
 de/11C.xml                              |   2 +-
 de/12.xml                               |   2 +-
 de/12A.xml                              |   2 +-
 de/12B.xml                              |   2 +-
 de/12C.xml                              |   2 +-
 de/1A.xml                               |   2 +-
 de/4C.xml                               |   2 +-
 de/6C.xml                               |   2 +-
 de/8B.xml                               |   2 +-
 de/9A.xml                               |   6 +-
 de/9B.xml                               |   2 +-
 de/9C.xml                               |   2 +-
 xsd/bjcp-styleguide-2015.xsd            | 315 ++++++++++++++++++++++++
 xsl/bjcp-2015-styleguide-doc-to-xml.xsl |  21 +-
 xsl/bjcp-2015-styleguide-split.xsl      |  20 +-
 xsl/bjcp-2015-styleguide-translate.xsl  |  20 +-
 26 files changed, 385 insertions(+), 62 deletions(-)
 create mode 100644 xsd/bjcp-styleguide-2015.xsd

diff --git a/Makefile b/Makefile
index f528a02..f2f2388 100644
--- a/Makefile
+++ b/Makefile
@@ -39,15 +39,20 @@ status: bjcp-2015-styleguide-orig.xml
 	@-xsltproc --stringparam lang de xsl/bjcp-2015-styleguide-status.xsl bjcp-2015-styleguide-orig.xml 2>&1 | grep -v "failed to load external entity"
 
 
-test: bjcp-2015-styleguide-orig.xml bjcp-2015-styleguide-de.xml
-	@xmllint --noout bjcp-2015-styleguide-orig.xml
-	@xmllint --noout bjcp-2015-styleguide-de.xml
+check: bjcp-2015-styleguide-orig.xml bjcp-2015-styleguide-de.xml
+	@for f in de/*.xml ; do xmllint --noout --schema xsd/bjcp-styleguide-2015.xsd $$f ; done
+	@xmllint --noout --schema xsd/bjcp-styleguide-2015.xsd bjcp-2015-styleguide-orig.xml
+	@xmllint --noout --schema xsd/bjcp-styleguide-2015.xsd bjcp-2015-styleguide-de.xml
 
 clean:
-	@rm -rf cache orig
+	@rm -rf orig
 	@rm -f bjcp-2015-styleguide-orig.xml
 	@rm -f bjcp-2015-styleguide-de.xml
 	@rm -f bjcp-2015-styleguide-orig.html
 	@rm -f bjcp-2015-styleguide-de.html
 	@echo "cleanup done"
 
+distclean: clean
+	@rm -rf cache
+	@echo "complete cleanup done"
+
diff --git a/README.md b/README.md
index c7f4d69..edc3627 100644
--- a/README.md
+++ b/README.md
@@ -75,6 +75,10 @@ Besides all the contributors to the original BJCP document we would like to than
   ```
   make status
   ```
+- You may check the XML validity of all XML files:
+  ```
+  make check
+  ```
 - Note: We aim for a real translation. Even if you are convinced that adding new details or rephrasing sections would make sense, please don't do that! (Maybe, we should establish a way to take notes in such cases. Let's discuss this, if you feel a real need.)
 - Take care for a consistent wording of all subject matter specific terms throughout the whole styleguide.
 - To supply your work back upstream to the repository server you need write access, please talk to the project maintainers. Then, use Git as usual (we cannot supply a Git tutorial here, but in general do something like):
diff --git a/de/1.xml b/de/1.xml
index cdd6f38..2949761 100644
--- a/de/1.xml
+++ b/de/1.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="1">
     <name>Standard American Beer</name>
     <description>
diff --git a/de/10.xml b/de/10.xml
index 0392371..6c14b1b 100644
--- a/de/10.xml
+++ b/de/10.xml
@@ -1,9 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="10">
     <name>German Wheat Beer</name>
-    <description>
-      <p>This category contains vollbier- and starkbier-strength German wheat beers without sourness, in light and dark colors.</p>
-    </description>
   </category>
 </styleguide>
diff --git a/de/10A.xml b/de/10A.xml
index de5565b..371d023 100644
--- a/de/10A.xml
+++ b/de/10A.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="10">
     <subcategory id="10A">
       <name>Weissbier</name>
diff --git a/de/10B.xml b/de/10B.xml
index d1848c8..97e8cc9 100644
--- a/de/10B.xml
+++ b/de/10B.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="10">
     <subcategory id="10B">
       <name>Dunkles Weissbier</name>
diff --git a/de/10C.xml b/de/10C.xml
index f363188..87abf33 100644
--- a/de/10C.xml
+++ b/de/10C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="10">
     <subcategory id="10C">
       <name>Weizenbock</name>
@@ -14,8 +14,8 @@ optional Karamell). Die Hefe trägt einen typischen Weizen-Charakter von Banane
 [Die Marke Aventinus, das erste obergärige Weizen-Doppelbock-Typ Bier wurde zum ersten Mal 1907 im Weissen Brauhaus in München hergestellt. Die angewandte Methode könnte „Methode Champenoise“, wegen der angewandten Flaschengärung genannt werden. Der Eigentümer Schneider wollte damit eine kreative Antwort auf die damals recht populäre untergärige Sorte Doppelbock geben. (Anmerkung: Hier wird diese Sorte als Weizenstarkbier bezeichnet, um eher die Herkunft als stärker gebrautes obergäriges Weizenbier zu betonen. Die Bezeichnung Weizen-Bock ist u.U. korrekt als Hinweis für die Inspiration dieser Sorte, aber ist ansonsten verwirrend, da es nahe legt, es wäre eine „Mischung“ aus untergärigem Bock und obergärigem Weizen. Ein Hauch korrekter wäre dann Bock-Weizen, was zumindest ansatzweise erkennen lässt, dass es sich hier um ein Weizenbier in Bockstärke handelt).]</history>
       <characteristic-ingredients>Typischerweise wird ca. 50% Weizenanteil verwendet in einigen Fällen auch bis zu 70%, der Restanteil ist Münchner und/oder Wiener Malz in dunkleren Versionen und mehr Pilsner Malz in Helleren. Etwas Farbmalz kann beim läutern verwendet werden. Eine traditionelle Dekoktionsmaische ist für den korrekten Körper zuständig ohne eine appetitverderbende Süße entstehen zu lassen. Weizenhefestämme produzieren eine typisch würzige und fruchtige Note, obwohl zu warme oder zu kalte Vergärungstemperaturen die Ausgewogenheit der Phenole und Ester beeinträchtigen könnten und Fehlgeschmäcker hervorrufen können. Deutsche Varianten sind meist traditionell. [Für die korrekte Bittere wird nur eine kleine Menge an Edelhopfen eingesetzt.]</characteristic-ingredients>
       <style-comparison>Stärker und üppiger als ein Weissbier oder Dunkles Weissbier, aber mit dem gleichen Hefe-Charakter. Beser direkt vergleichbar mit dem Doppelbock-Stil, mit den hellen und dunklen Varianten. Kann in der Stärke weit variiren, aber meist im Bereich des Bock oder Doppelbock.</style-comparison>
-      <entry-instructions>Der Teilnehmer spezifiziert ob es sich bei seinem Bier um eine<b>helle</b> oder eine <b>dunkle</b> Variante handelt.</entry-instructions>
       <commercial-examples><b>Dunkel</b> – Eisenbahn Weizenbock, Plank Bavarian Dunkler Weizenbock, Penn Weizenbock, Schneider Unser Aventinus; <b>Pale</b> – Plank Bavarian Heller Weizenbock, Weihenstephaner Vitus</commercial-examples>
+      <entry-instructions>Der Teilnehmer spezifiziert ob es sich bei seinem Bier um eine<b>helle</b> oder eine <b>dunkle</b> Variante handelt.</entry-instructions>
     </subcategory>
   </category>
 </styleguide>
diff --git a/de/11.xml b/de/11.xml
index 705e6d7..65c596a 100644
--- a/de/11.xml
+++ b/de/11.xml
@@ -1,12 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="11">
     <name>British Bitter</name>
     <description>
-      <p>Die Familie der britischen Bitter entstand aus dem englischen Pale Ale als alternativer Produktentwurf in den späten 1800er Jahren. Die Verwendung von Kristallmalz im Bitter wurde weiter verbreitet nach dem Ersten Weltkrieg. Traditionell serviert sehr frisch, nicht unter Druck (Schwerkraft oder nur  Handpumpe) bei Kellertemperatur serviert (somit entsprechend eines "Real Ale"). Die meisten Flaschen oder Keg-Versionen sind oft höhere Alkohole und höher Carbonisierungen als die Versionen vom Fass, die für den Export hergestellt werden. Sie haben auch einen anderen Charakter und eine andere Balance (wobei oft süßer und weniger hoppy als die Fass-Versionen). Diese Leitlinien spiegeln die "Real Ale" -Version
-des Stils, nicht die Export-Varianten kommerzieller Produkte.
-Es gibt mehrere regionale Unterschiede vom Bitter, sie reichen vom dunklen, süßen Bereich serviert mit fast keiner Schaumkrone bis zu heller, hopfigeren Versionen mit viel Schaum sowie allem dazwischen.
-Die Richter sollten nicht die Karamell-Komponente  dieses Stils überbetonen. Exportierte Bitter oxidieren, was den Karamellgeschmack erhöht (wie auch negativer Geschmacksrichtungen). Gehen Sie nicht davon, dass die von der Oxidation abgeleiteten Aromen traditionell oder für den Stil erforderlich sind.</p>
+      <p>Die Familie der britischen Bitter entstand aus dem englischen Pale Ale als alternativer Produktentwurf in den späten 1800er Jahren. Die Verwendung von Kristallmalz im Bitter wurde weiter verbreitet nach dem Ersten Weltkrieg. Traditionell serviert sehr frisch, nicht unter Druck (Schwerkraft oder nur  Handpumpe) bei Kellertemperatur serviert (somit entsprechend eines "Real Ale"). Die meisten Flaschen oder Keg-Versionen sind oft höhere Alkohole und höher Carbonisierungen als die Versionen vom Fass, die für den Export hergestellt werden. Sie haben auch einen anderen Charakter und eine andere Balance (wobei oft süßer und weniger hoppy als die Fass-Versionen). Diese Leitlinien spiegeln die "Real Ale" -Version des Stils, nicht die Export-Varianten kommerzieller Produkte.  Es gibt mehrere regionale Unterschiede vom Bitter, sie reichen vom dunklen, süßen Bereich serviert mit fast keiner Schaumkrone bis zu heller, hopfigeren Versionen mit viel Schaum sowie allem dazwischen.  Die Richter sollten nicht die Karamell-Komponente  dieses Stils überbetonen. Exportierte Bitter oxidieren, was den Karamellgeschmack erhöht (wie auch negativer Geschmacksrichtungen). Gehen Sie nicht davon, dass die von der Oxidation abgeleiteten Aromen traditionell oder für den Stil erforderlich sind.</p>
     </description>
   </category>
 </styleguide>
diff --git a/de/11A.xml b/de/11A.xml
index a6bb7fe..3e40a4c 100644
--- a/de/11A.xml
+++ b/de/11A.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="11">
     <subcategory id="11A">
       <name>Ordinary Bitter</name>
diff --git a/de/11B.xml b/de/11B.xml
index 67390b8..5582ed3 100644
--- a/de/11B.xml
+++ b/de/11B.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="11">
     <subcategory id="11B">
       <name>Best Bitter</name>
diff --git a/de/11C.xml b/de/11C.xml
index 69d4a99..141ea90 100644
--- a/de/11C.xml
+++ b/de/11C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="11">
     <subcategory id="11C">
       <name>Strong Bitter</name>
diff --git a/de/12.xml b/de/12.xml
index 230435c..6ea7550 100644
--- a/de/12.xml
+++ b/de/12.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="12">
     <name>Pale Commonwealth Beer</name>
     <description>
diff --git a/de/12A.xml b/de/12A.xml
index f5bd972..7f0e1a8 100644
--- a/de/12A.xml
+++ b/de/12A.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="12">
     <subcategory id="12A">
       <name>British Golden Ale</name>
diff --git a/de/12B.xml b/de/12B.xml
index bdec461..e280229 100644
--- a/de/12B.xml
+++ b/de/12B.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="12">
     <subcategory id="12B">
       <name>Australian Sparkling Ale</name>
diff --git a/de/12C.xml b/de/12C.xml
index 4781dd9..0ddd5ed 100644
--- a/de/12C.xml
+++ b/de/12C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="12">
     <subcategory id="12C">
       <name>English IPA</name>
diff --git a/de/1A.xml b/de/1A.xml
index db82504..9b32054 100644
--- a/de/1A.xml
+++ b/de/1A.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="1">
     <subcategory id="1A">
       <name>American Light Lager</name>
diff --git a/de/4C.xml b/de/4C.xml
index 3631f19..5eaf7c0 100644
--- a/de/4C.xml
+++ b/de/4C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="4">
     <subcategory id="4C">
       <name>Helles Bock</name>
diff --git a/de/6C.xml b/de/6C.xml
index 1dba79b..800a352 100644
--- a/de/6C.xml
+++ b/de/6C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="6">
     <subcategory id="6C">
       <name>Dunkles Bock</name>
diff --git a/de/8B.xml b/de/8B.xml
index e812b51..99308b9 100644
--- a/de/8B.xml
+++ b/de/8B.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="8">
     <subcategory id="8B">
       <name>Schwarzbier</name>
diff --git a/de/9A.xml b/de/9A.xml
index 381af7a..7694e7d 100644
--- a/de/9A.xml
+++ b/de/9A.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="9">
     <subcategory id="9A">
       <name>Doppelbock</name>
@@ -13,10 +13,8 @@ Es wird auf jeden Fall einen Eindruck der alkoholischen Stärke geben, allerding
       <history>Eine bayrische Spezialitäten zuerst von Münchner Mönchen des St. Francis von Paula gebraut. Frühere Typen waren nicht so weit vergoren, wie die heutigen Typen und somit erheblich süßer und niedrigerem Alkoholgehalt (somit wurde es als „flüssiges Brot“ empfunden). Der Ausdruck Doppel-Bock entstand mit der Zeit durch den Konsumenten. Viele Doppel-Bock sind an der Endung „-ator“ zu erkennen, was sicherlich in Anlehnung an das Original Salvator üblich geworden ist. Traditionell dunkelbraune Farbe, hellere Beispiele sind eher in jüngster Zeit entwickelt.</history>
       <characteristic-ingredients>Pilsner- und/oder Wiener Malz für die helleren Versionen (mit etwas Einsatz von Münchner Malz), Münchner und Wiener Malz für die dunkleren Typen und hin und wieder dunklere Malze (z.B. Carafa). Edelhopfen (Saazer-Typen). Wasserhärte variiert von weich bis moderat kalkhaltig. Saubere untergärige Hefe. Dekoktionsmaische ist traditionell.</characteristic-ingredients>
       <style-comparison>eine stärkere, üppigere, vollmundige Version entweder aus einem Dunklen Bock oder Hellen Bock. Helle Versionen zeigen eine höhere Vergärung und weniger dunkel fruchtigen Charakter als die dunkleren Versionen.</style-comparison>
-      <entry-instructions>Der Teilnehmer spezifiziert ob es sich bei seinem Bier um eine<b>helle</b>
-                oder ein <b>dunkle</b>
-                Variante handelt.</entry-instructions>
       <commercial-examples><b>Dunkle Sorten</b> – Andechser Doppelbock Dunkel, Ayinger Celebrator, Paulaner Salvator, Spaten Optimator, Tröegs Troegenator, Weihenstephaner Korbinian; <b>Helle Sorten</b> – Eggenberg Urbock 23º, EKU 28, Plank Bavarian Heller Doppelbock</commercial-examples>
+      <entry-instructions>Der Teilnehmer spezifiziert ob es sich bei seinem Bier um eine<b>helle</b> oder ein <b>dunkle</b> Variante handelt.</entry-instructions>
     </subcategory>
   </category>
 </styleguide>
diff --git a/de/9B.xml b/de/9B.xml
index a6d942e..1c27db5 100644
--- a/de/9B.xml
+++ b/de/9B.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="9">
     <subcategory id="9B">
       <name>Eisbock</name>
diff --git a/de/9C.xml b/de/9C.xml
index ef98883..060cfdb 100644
--- a/de/9C.xml
+++ b/de/9C.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<styleguide>
+<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">
   <category id="9">
     <subcategory id="9C">
       <name>Baltic Porter</name>
diff --git a/xsd/bjcp-styleguide-2015.xsd b/xsd/bjcp-styleguide-2015.xsd
new file mode 100644
index 0000000..cdf32ad
--- /dev/null
+++ b/xsd/bjcp-styleguide-2015.xsd
@@ -0,0 +1,315 @@
+<?xml version="1.0"?>
+<xsd:schema targetNamespace="http://heimbrauconvention.de/bjcp-styleguide/2015"
+  xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xml:lang="en"
+  elementFormDefault="qualified"
+  attributeFormDefault="unqualified">
+  
+  <xsd:annotation>
+    <xsd:documentation>
+      ...
+    </xsd:documentation>
+  </xsd:annotation>
+  
+  <xsd:element name="styleguide">
+    <xsd:complexType>
+      <xsd:sequence>
+	<xsd:choice minOccurs="0" maxOccurs="unbounded">
+	  <xsd:element ref="chapter"/>
+	  <xsd:element ref="category"/>
+	</xsd:choice>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="chapter">
+    <xsd:complexType>
+      <xsd:complexContent>
+        <xsd:extension base="Chapter">
+	  <xsd:attribute name="id" use="required">
+	    <xsd:simpleType>
+	      <xsd:restriction base="xsd:string">
+		<xsd:pattern value="[a-zA-Z0-9\-]*"/>
+	      </xsd:restriction>
+	    </xsd:simpleType>
+	  </xsd:attribute>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="category">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="description" type="Description" minOccurs="0"/>
+        <xsd:element name="entry-instructions" type="Text" minOccurs="0"/>
+        <xsd:element ref="subcategory" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="id" use="required">
+        <xsd:simpleType>
+          <xsd:restriction base="xsd:string">
+            <xsd:pattern value="[a-zA-Z0-9\-]*"/>
+          </xsd:restriction>
+        </xsd:simpleType>
+      </xsd:attribute>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="subcategory">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="description" type="Description" minOccurs="0"/>
+        <xsd:element name="overall-impression" type="Text" minOccurs="0"/>
+        <xsd:element name="aroma" type="Text" minOccurs="0"/>
+        <xsd:element name="appearance" type="Text" minOccurs="0"/>
+        <xsd:element name="flavor" type="Text" minOccurs="0"/>
+        <xsd:element name="mouthfeel" type="Text" minOccurs="0"/>
+        <xsd:element name="comments" type="Text" minOccurs="0"/>
+        <xsd:element name="history" type="Text" minOccurs="0"/>
+        <xsd:element name="characteristic-ingredients" type="Text" minOccurs="0"/>
+        <xsd:element name="style-comparison" type="Text" minOccurs="0"/>
+        <xsd:element name="commercial-examples" type="Text" minOccurs="0"/>
+        <xsd:element name="entry-instructions" type="Text" minOccurs="0"/>
+        <xsd:element ref="tags" minOccurs="0"/>
+        <xsd:element ref="specs" minOccurs="0"/>
+        <xsd:element ref="strength-classifications" minOccurs="0"/>
+        <xsd:element ref="subcategory" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="id" use="required">
+        <xsd:simpleType>
+          <xsd:restriction base="xsd:string">
+            <xsd:pattern value="[a-zA-Z0-9\-]*"/>
+          </xsd:restriction>
+        </xsd:simpleType>
+      </xsd:attribute>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:complexType name="Chapter">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="h1" type="xsd:string"/>
+      <xsd:element name="h2" type="xsd:string"/>
+      <xsd:element name="h3" type="xsd:string"/>
+      <xsd:element name="h4" type="xsd:string"/>
+      <xsd:element ref="table"/>
+      <xsd:element ref="ul"/>
+      <xsd:element ref="ol"/>
+      <xsd:element ref="p"/>
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:complexType name="Description">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element ref="p"/>
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:element name="tags">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element minOccurs="0" maxOccurs="unbounded" ref="tag"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="tag">
+    <xsd:simpleType>
+      <xsd:restriction base="xsd:NMTOKEN">
+        <xsd:enumeration value="session-strength"/>
+        <xsd:enumeration value="standard-strength"/>
+        <xsd:enumeration value="high-strength"/>
+        <xsd:enumeration value="very-high-strength"/>
+        <xsd:enumeration value="pale-color"/>
+        <xsd:enumeration value="amber-color"/>
+        <xsd:enumeration value="dark-color"/>
+        <xsd:enumeration value="top-fermented"/>
+        <xsd:enumeration value="bottom-fermented"/>
+        <xsd:enumeration value="any-fermentation"/>
+        <xsd:enumeration value="wild-fermented"/>
+        <xsd:enumeration value="lagered"/>
+        <xsd:enumeration value="aged"/>
+        <xsd:enumeration value="british-isles"/>
+        <xsd:enumeration value="western-europe"/>
+        <xsd:enumeration value="central-europe"/>
+        <xsd:enumeration value="eastern-europe"/>
+        <xsd:enumeration value="north-america"/>
+        <xsd:enumeration value="pacific"/>
+        <xsd:enumeration value="ipa-family"/>
+        <xsd:enumeration value="brown-ale-family"/>
+        <xsd:enumeration value="pale-ale-family"/>
+        <xsd:enumeration value="pale-lager-family"/>
+        <xsd:enumeration value="pilsner-family"/>
+        <xsd:enumeration value="amber-ale-family"/>
+        <xsd:enumeration value="amber-lager-family"/>
+        <xsd:enumeration value="dark-lager-family"/>
+        <xsd:enumeration value="porter-family"/>
+        <xsd:enumeration value="stout-family"/>
+        <xsd:enumeration value="bock-family"/>
+        <xsd:enumeration value="strong-ale-family"/>
+        <xsd:enumeration value="wheat-beer-family"/>
+        <xsd:enumeration value="specialty-beer"/>
+        <xsd:enumeration value="craft-style"/>
+        <xsd:enumeration value="traditional-style"/>
+        <xsd:enumeration value="historical-style"/>
+        <xsd:enumeration value="malty"/>
+        <xsd:enumeration value="bitter"/>
+        <xsd:enumeration value="balanced"/>
+        <xsd:enumeration value="hoppy"/>
+        <xsd:enumeration value="roasty"/>
+        <xsd:enumeration value="sweet"/>
+        <xsd:enumeration value="smoke"/>
+        <xsd:enumeration value="sour"/>
+        <xsd:enumeration value="wood"/>
+        <xsd:enumeration value="fruit"/>
+        <xsd:enumeration value="spice"/>
+      </xsd:restriction>
+    </xsd:simpleType>
+  </xsd:element>
+
+  <xsd:element name="specs">
+    <xsd:complexType mixed="true">
+      <xsd:sequence>
+        <xsd:element ref="ibu" minOccurs="0"/>
+        <xsd:element ref="srm" minOccurs="0"/>
+        <xsd:element ref="og" minOccurs="0"/>
+        <xsd:element ref="fg" minOccurs="0"/>
+        <xsd:element ref="abv" minOccurs="0"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="ibu">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="min"/>
+          <xsd:attribute name="max"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="srm">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="min"/>
+          <xsd:attribute name="max"/>
+          <xsd:attribute name="ebc-min"/>
+          <xsd:attribute name="ebc-max"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="og">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="min"/>
+          <xsd:attribute name="max"/>
+          <xsd:attribute name="plato-min"/>
+          <xsd:attribute name="plato-max"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="fg">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="min"/>
+          <xsd:attribute name="max"/>
+          <xsd:attribute name="plato-min"/>
+          <xsd:attribute name="plato-max"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="abv">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="min"/>
+          <xsd:attribute name="max"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="strength-classifications">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="strength" maxOccurs="unbounded" type="Text"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="table">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element minOccurs="0" maxOccurs="unbounded" ref="tr"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="tr">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="td" minOccurs="0" maxOccurs="unbounded" type="Text"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="ul">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="li" minOccurs="0" maxOccurs="unbounded" type="Text"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="ol">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="li" minOccurs="0" maxOccurs="unbounded" type="Text"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="p">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="class"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="a">
+    <xsd:complexType mixed="true">
+      <xsd:complexContent>
+        <xsd:extension base="Text">
+          <xsd:attribute name="idref"/>
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:complexType name="Text" mixed="true">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="b" type="xsd:string"/>
+      <xsd:element name="i" type="xsd:string"/>
+      <xsd:element name="u" type="xsd:string"/>
+      <xsd:element ref="a"/>
+    </xsd:choice>
+  </xsd:complexType>
+
+
+</xsd:schema>
diff --git a/xsl/bjcp-2015-styleguide-doc-to-xml.xsl b/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
index 661a2d2..e580e50 100644
--- a/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
+++ b/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
@@ -1,6 +1,7 @@
 <?xml version="1.0"?>
 <xsl:stylesheet 
     version="1.0" 
+    xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015"
     xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:exsl="http://exslt.org/common"
@@ -205,6 +206,12 @@
         <xsl:with-param name="attribute">Style Comparison</xsl:with-param>
         <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
       </xsl:apply-templates>
+
+      <xsl:apply-templates select="following-sibling::w:p[1]" mode="attribute">
+        <xsl:with-param name="attribute">Commercial Examples</xsl:with-param>
+        <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
+      </xsl:apply-templates>
+
       <xsl:apply-templates select="following-sibling::w:p[1]" mode="attribute">
         <xsl:with-param name="attribute">Entry Instructions</xsl:with-param>
         <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
@@ -218,20 +225,15 @@
       -->
       <!-- TODO: Currently Defined Types sollte implizit klar sein. -->
 
-      <xsl:apply-templates select="following-sibling::w:p[1]" mode="specs">
-        <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
-      </xsl:apply-templates>
-
-      <xsl:apply-templates select="following-sibling::w:p[1]" mode="strengths">
+      <xsl:apply-templates select="following-sibling::w:p[1]" mode="tags">
         <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
       </xsl:apply-templates>
 
-      <xsl:apply-templates select="following-sibling::w:p[1]" mode="attribute">
-        <xsl:with-param name="attribute">Commercial Examples</xsl:with-param>
+      <xsl:apply-templates select="following-sibling::w:p[1]" mode="specs">
         <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
       </xsl:apply-templates>
 
-      <xsl:apply-templates select="following-sibling::w:p[1]" mode="tags">
+      <xsl:apply-templates select="following-sibling::w:p[1]" mode="strengths">
         <xsl:with-param name="id"><xsl:value-of select="$id0"/></xsl:with-param>
       </xsl:apply-templates>
 
@@ -541,7 +543,8 @@
     <xsl:choose>
       <xsl:when test="contains($tags, ' ')">
         <xsl:element name="tag">
-          <xsl:value-of select="substring-before($tags, ' ')"/>
+	  <!-- we have to adjust some tag names -->
+          <xsl:value-of select="str:replace(str:replace(str:replace(str:replace(str:replace(str:replace(substring-before($tags, ' '),'fermenting','fermented'),'fermentation','fermented'),'any-fermented','any-fermentation'),'session-beer','session-strength'),'sour-ale-family','sour'),'specialty-family','specialty-beer')"/>
         </xsl:element>
         <xsl:call-template name="tag">
           <xsl:with-param name="tags">
diff --git a/xsl/bjcp-2015-styleguide-split.xsl b/xsl/bjcp-2015-styleguide-split.xsl
index 6958004..dc0257a 100644
--- a/xsl/bjcp-2015-styleguide-split.xsl
+++ b/xsl/bjcp-2015-styleguide-split.xsl
@@ -1,6 +1,8 @@
 <?xml version="1.0"?>
 <xsl:stylesheet 
     version="1.0" 
+    xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015"
+    xmlns:bjcp="http://heimbrauconvention.de/bjcp-styleguide/2015"
     xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
     xmlns:xhtml="http://www.w3.org/1999/xhtml"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -16,16 +18,16 @@
 
 
 
-  <xsl:template match="/styleguide">
-    <xsl:apply-templates select="chapter"/>
-    <xsl:apply-templates select="category"/>
-    <xsl:apply-templates select="category/subcategory"/>
-    <xsl:apply-templates select="category/subcategory/subcategory"/>
+  <xsl:template match="/bjcp:styleguide">
+    <xsl:apply-templates select="bjcp:chapter"/>
+    <xsl:apply-templates select="bjcp:category"/>
+    <xsl:apply-templates select="bjcp:category/bjcp:subcategory"/>
+    <xsl:apply-templates select="bjcp:category/bjcp:subcategory/bjcp:subcategory"/>
   </xsl:template>
 
 
 
-  <xsl:template match="/styleguide/chapter">
+  <xsl:template match="/bjcp:styleguide/bjcp:chapter">
     <xsl:variable name="filename">
       <xsl:text>orig/</xsl:text>
       <xsl:value-of select="@id"/>
@@ -43,7 +45,7 @@
 
 
 
-  <xsl:template match="/styleguide/category">
+  <xsl:template match="/bjcp:styleguide/bjcp:category">
     <xsl:variable name="filename">
       <xsl:text>orig/</xsl:text>
       <xsl:value-of select="@id"/>
@@ -61,7 +63,7 @@
 
 
 
-  <xsl:template match="/styleguide/category/subcategory">
+  <xsl:template match="/bjcp:styleguide/bjcp:category/bjcp:subcategory">
     <xsl:variable name="filename">
       <xsl:text>orig/</xsl:text>
       <xsl:value-of select="@id"/>
@@ -82,7 +84,7 @@
 
 
 
-  <xsl:template match="/styleguide/category/subcategory/subcategory">
+  <xsl:template match="/bjcp:styleguide/bjcp:category/bjcp:subcategory/bjcp:subcategory">
     <xsl:variable name="filename">
       <xsl:text>orig/</xsl:text>
       <xsl:value-of select="@id"/>
diff --git a/xsl/bjcp-2015-styleguide-translate.xsl b/xsl/bjcp-2015-styleguide-translate.xsl
index 2e99db2..e253a16 100644
--- a/xsl/bjcp-2015-styleguide-translate.xsl
+++ b/xsl/bjcp-2015-styleguide-translate.xsl
@@ -1,5 +1,7 @@
 <?xml version="1.0"?>
 <xsl:stylesheet version="1.0" 
+    xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015"
+    xmlns:bjcp="http://heimbrauconvention.de/bjcp-styleguide/2015"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:exsl="http://exslt.org/common"
     xmlns:dyn="http://exslt.org/dynamic"
@@ -15,7 +17,7 @@
 
 
 
-  <xsl:template match="*">
+  <xsl:template match="bjcp:*">
     <xsl:element name="{local-name(.)}">
       <xsl:apply-templates select="@*"/>
       <xsl:apply-templates/>
@@ -24,7 +26,7 @@
 
 
 
-  <xsl:template match="chapter">
+  <xsl:template match="bjcp:chapter">
     <xsl:variable name="d">
       <xsl:text>../</xsl:text>
       <xsl:value-of select="$lang"/>
@@ -44,7 +46,7 @@
 
 
 
-  <xsl:template match="category">
+  <xsl:template match="bjcp:category">
     <xsl:variable name="d">
       <xsl:text>../</xsl:text>
       <xsl:value-of select="$lang"/>
@@ -69,7 +71,7 @@
 
 
 
-  <xsl:template match="category/subcategory">
+  <xsl:template match="bjcp:category/bjcp:subcategory">
     <xsl:variable name="d">
       <xsl:text>../</xsl:text>
       <xsl:value-of select="$lang"/>
@@ -94,7 +96,7 @@
 
 
 
-  <xsl:template match="category/subcategory/subcategory">
+  <xsl:template match="bjcp:category/bjcp:subcategory/bjcp:subcategory">
     <xsl:variable name="d">
       <xsl:text>../</xsl:text>
       <xsl:value-of select="$lang"/>
@@ -119,7 +121,7 @@
 
 
 
-  <xsl:template match="chapter" mode="chapter">
+  <xsl:template match="bjcp:chapter" mode="chapter">
     <xsl:param name="t"/>
     <xsl:variable name="p">
       <xsl:value-of select="$t"/>
@@ -139,11 +141,11 @@
 
 
 
-  <xsl:template match="name|description|overall-impression|aroma|appearance|flavor|mouthfeel|comments|history|characteristic-ingredients|style-comparison|entry-instructions|commercial-examples">
+  <xsl:template match="bjcp:name|bjcp:description|bjcp:overall-impression|bjcp:aroma|bjcp:appearance|bjcp:flavor|bjcp:mouthfeel|bjcp:comments|bjcp:history|bjcp:characteristic-ingredients|bjcp:style-comparison|bjcp:entry-instructions|bjcp:commercial-examples">
     <xsl:param name="t"/>
     <xsl:variable name="p">
       <xsl:value-of select="$t"/>
-      <xsl:text>/</xsl:text>
+      <xsl:text>/bjcp:</xsl:text>
       <xsl:value-of select="local-name(.)"/>
     </xsl:variable>
     <xsl:element name="{local-name(.)}">
@@ -162,7 +164,7 @@
 
 
   <!-- suppress these tags in translations -->
-  <xsl:template match="tags|specs">
+  <xsl:template match="bjcp:tags|bjcp:specs">
   </xsl:template>
 
 
-- 
GitLab