<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt3" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sqf="http://www.schematron-quickfix.com/validator/process" xmlns:tei="http://www.tei-c.org/ns/1.0">
	<ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>
	<ns prefix="xi" uri="http://www.w3.org/2001/XInclude"/>
	<!--Qualitätskontrolle für die Astronautilia-Transkriptionen und Register-->
	<!--erstellt und gepflegt von Jennifer Bunselmeier (2026)-->
	<!--..........................................-->
	<!--Globale Variablen-->
	<!--..........................................-->
	<let name="QMTrans" value="/tei:TEI[descendant::tei:change[@type = 'readyForQMTrans']]"/>
	<let name="PublTrans" value="/tei:TEI[descendant::tei:change[@type = 'readyForPublicationTrans']]"/>
	<let name="hasSimilia" value="/tei:TEI[descendant::tei:change[@type = 'hasSimilia']]"/>
	<let name="haupttext" value="/tei:TEI[matches(@xml:id, 'Astronautilia_\d')]"/>
	<let name="respNames" value="('Stefan Weise', 'Jennifer Bunselmeier')"/>
	<let name="simQualifier" value="('cf', 'de_re_cf', 'sim', 'eq', 'undefined')"/>
	<let name="xmlFileNames" value="('Astronautilia_01.xml', 'Astronautilia_02.xml', 'Astronautilia_03.xml', 'Astronautilia_04.xml', 'Astronautilia_05.xml', 'Astronautilia_06.xml', 'Astronautilia_07.xml', 'Astronautilia_08.xml', 'Astronautilia_09.xml', 'Astronautilia_10.xml', 'Astronautilia_11.xml', 'Astronautilia_12.xml', 'Astronautilia_13.xml', 'Astronautilia_14.xml', 'Astronautilia_15.xml', 'Astronautilia_16.xml', 'Astronautilia_17.xml', 'Astronautilia_18.xml', 'Astronautilia_19.xml', 'Astronautilia_20.xml', 'Astronautilia_21.xml', 'Astronautilia_22.xml', 'Astronautilia_23.xml', 'Astronautilia_24.xml', 'Astronautilia_Glossar.xml', 'Astronautilia_Vorwort.xml', 'Astronautilia_Vorspann.xml', 'Astronautilia_Brief.xml', 'Astronautilia_Synopsis.xml', 'Astronautilia_Titelei.xml')"/>
	
	<let name="htmlFileNames" value="('astronautilia_01.html', 'astronautilia_02.html', 'astronautilia_03.html', 'astronautilia_04.html', 'astronautilia_05.html', 'astronautilia_06.html', 'astronautilia_07.html', 'astronautilia_08.html', 'astronautilia_09.html', 'astronautilia_10.html', 'astronautilia_11.html', 'astronautilia_12.html', 'astronautilia_13.html', 'astronautilia_14.html', 'astronautilia_15.html', 'astronautilia_16.html', 'astronautilia_17.html', 'astronautilia_18.html', 'astronautilia_19.html', 'astronautilia_20.html', 'astronautilia_21.html', 'astronautilia_22.html', 'astronautilia_23.html', 'astronautilia_24.html', 'astronautilia_glossar.html', 'astronautilia_vorwort.html', 'astronautilia_vorspann.html', 'astronautilia_brief.html', 'astronautilia_synopsis.html', 'astronautilia_titelei.html','bibliographie.html','register.html','drawings.html')"/>
	<let name="assetsFileNames" value="('bildrechte','astronautilia','astronautilia_xml','astronautilia_md')"/>
	<!--TODO: noch alt von Rhodoman; an Astro anpassen-->
	<let name="listAuthorSingle" value="doc('../../GitLab_Rhodomanologia/rhodomanologia/tools/uebersichtAutorenstellen/uebersichtAutorenstellen.xml')//tei:list[@type = 'authorSingle']"/>
	<let name="listTitleSingle" value="doc('../../GitLab_Rhodomanologia/rhodomanologia/tools/uebersichtAutorenstellen/uebersichtAutorenstellen.xml')//tei:list[@type = 'titleSingle']"/>
	<let name="listAuthorTitle" value="doc('../../GitLab_Rhodomanologia/rhodomanologia/tools/uebersichtAutorenstellen/uebersichtAutorenstellen.xml')//tei:list[@type = 'author-title']"/>
	<let name="importVarMapSimilienTitleStyled" value="document('../scripts/common/variables.xsl')//xsl:variable[@name = 'mapSimilienTitleStyled']"/>
	<let name="flag" value="
			if (/tei:TEI[descendant::tei:change[@n = 'readyForPublicationTrans']]) then
				'publ] '
			else
				if (/tei:TEI[descendant::tei:change[@type = 'readyForQMTrans']]) then
					'QM] '
				else
					'unpubl] '"/>
	<!--..........................................-->
	<!--Globale Keys-->
	<!--..........................................-->
	<xsl:key name="k-lineIDHash" match="//tei:l" use="concat('#', @xml:id)"><!--l/@xml:id (erweitert um #, zum Abgleich mit @corresp)--></xsl:key>
	<xsl:key name="k-quoteIDHash" match="//tei:quote" use="concat('#', @xml:id)"><!--quote/@xml:id (erweitert um #, zum Abgleich mit @corresp)--></xsl:key>
	<!--..........................................-->
	<!--Globale Message-Variablen-->
	<!--..........................................-->
	<diagnostics>
		<!--mEName: Name des rule-Elements ausgeben-->
		<diagnostic id="mEName">[<value-of select="name()"/>]</diagnostic>
		<!--mValues: Werteliste ausgeben ($values = Werteliste in Globalen Variablen s.o.; jew. in der rule aufgerufen)-->
		<diagnostic id="mValues">Erlaubte Werte: <value-of select="string-join($values, ', ')"/>.</diagnostic>
		<!--mJB: Meldung an JB ausgeben (Fehler evtl. aus word2tei-Transformation oder nur von JB behebbar)-->
		<diagnostic id="mJB">[An JB melden!]</diagnostic>
	</diagnostics>
	<!--..........................................-->
	<!--QickFixes-->
	<!--..........................................-->
	<sqf:fixes>
		<sqf:fix id="replaceMinus">
			<sqf:description>
				<sqf:title>Minus in Bis-Strich ändern</sqf:title>
			</sqf:description>
			<sqf:stringReplace match="text()" regex="\-(\d)?">
				<xsl:analyze-string select="." regex="\-(\d)?">
					<xsl:matching-substring>
						<xsl:value-of select="'‒' || regex-group(1)"/>
					</xsl:matching-substring>
					<xsl:non-matching-substring/>
				</xsl:analyze-string>
			</sqf:stringReplace>
		</sqf:fix>
		<sqf:fix id="deleteSpaceStart">
			<sqf:description>
				<sqf:title>Leerzeichen am Anfang löschen</sqf:title>
			</sqf:description>
			<sqf:stringReplace match="." regex="^\s+"/>
		</sqf:fix>
		<sqf:fix id="deleteSpaceEnd">
			<sqf:description>
				<sqf:title>Leerzeichen am Ende löschen</sqf:title>
			</sqf:description>
			<sqf:stringReplace match="." regex="\s+$"/>
		</sqf:fix>
	</sqf:fixes>
	<!--..........................................-->
	<!--Hauptskript-->
	<!--..........................................-->
	<!--....................... Grobe Warnungen - nur bei Bedarf einschalten (Anfang).......................-->
	<!--<pattern id="sumNumberw2tFehler">
		<rule context="tei:seg[@type='simNumber']">
			<!-\-Grobe Fehlersuche: bei der Similienauszeichnung wurde teilweise @n falsch erweitert: Word "1,5.8" = 1,5+1,8, wurde aber gesetzt zu: 1,5,5 und 1,5,8-\->
			<!-\-Betrifft anscheinend nur Similien mit Punkt und dreistelligem @n-\->
			<assert test="not(some $val in tokenize(@n, ',') satisfies count(tokenize(@n, ',')[. = $val]) > 1)" role="warn">[grobe Warnung für JB] Gedoppelte Zahl in simNumber gefunden (<value-of select="@n"/>) -> mit Word abgleichen und ggf. löschen.</assert>
			<report test="matches(.,'\.\d') and matches(@n,'\d*,\d*,\d*')" role="warn">[grobe Warnung für JB] Zahl mit Punkt und drei Werten in @n gefunden (<value-of select="@n"/>) -> potentiell mittlere Zahl überflüssig -> mit Word vergleichen und ggf. löschen.</report>
		</rule>
	</pattern>-->
	<!--<pattern id="contentMilestonesItemBenennung">
		<rule context="tei:div[@type = 'contentMilestones']//tei:item">
			<report test="matches(@n, '\d{2}\-1\-0001') and not(tei:desc[contains(., 'Gedicht')])" role="warn">contentMilestone zielt auf header, v.1, heißt aber nicht "Gedicht x" -> zielt ein manueller Marker auf delselben Vers?</report>
		</rule>
	</pattern>-->
	<!--....................... Grobe Warnungen - nur bei Bedarf einschalten (Ende).......................-->
	<pattern id="fileName">
		<rule context="/">
			<let name="fileName" value="substring-before(tokenize(document-uri(/), '/')[last()], '.xml')"/>
			<let name="fileID" value="tei:TEI/@xml:id"/>
			<assert test="$fileID = $fileName"><value-of select="$flag"/>Dateiname "<value-of select="$fileName"/>" und Datei-ID "<value-of select="$fileID"/>" stimmen nicht überein.</assert>
		</rule>
	</pattern>
	<pattern id="quoteInternal">
		<rule context="tei:title[@type = 'quoteInternal']">
			<assert test="string(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Im Int. Kürzel fehlt @sameAs.</assert>
		</rule>
	</pattern>
	<pattern id="copies.complete">
		<rule context="tei:listBibl[@type = 'copies']/tei:bibl">
			<report test="tei:orgName[text()] and not(tei:idno[text()])"><value-of select="$flag"/>Signatur fehlt.</report>
			<report test="tei:idno[text()] and not(tei:orgName[text()])"><value-of select="$flag"/>Institution fehlt.</report>
		</rule>
	</pattern>
	<pattern id="metDecl.item">
		<rule context="tei:note[@type = 'metDecl']//tei:item">
			<!--Stufe 1: Gedichtzuordnung vom Editor fehlt-->
			<assert test="string(@corresp)"><value-of select="$flag"/>Bitte die Sprach-/Metrikangaben einer Gedichtnr. zuordnen.</assert>
			<!--Stufe 2: Format prüfen [a) vor QM = einfache Zahl, b) nach QM = #d1]-->
			<report test="matches(@corresp, '\D') and not(matches(@corresp, '#d\d'))"><value-of select="$flag"/>Fehler im Format der Gedichtzuordnung (erwartet: einfache Zahl oder "#d[Zahl]").</report>
		</rule>
	</pattern>
	<!--<pattern id="metDecl.prose">
		<rule context="tei:TEI[descendant::tei:change[@type = 'hasTranscript']]//tei:note[@type = 'metDecl']//tei:seg[@type = 'meter' and @ana = '#prose']">
			<let name="divNr" value="substring-after(ancestor::tei:item/@corresp, '#')"/>
			<let name="segLang" value="parent::tei:seg/tei:textLang/@mainLang"/>
			<assert test="/tei:TEI//tei:div[@xml:id = $divNr][descendant::tei:lg//tei:seg[@xml:lang = $segLang][@met = 'prose'] or descendant::tei:ab]"><value-of select="$flag"/>In metDecl ist für Gedicht (<value-of select="$divNr"/>), Sprache (<value-of select="$segLang"/>) "Prosa" gesetzt. Aber kein seg hat @met=prose und kein ab gesetzt.</assert>
		</rule>
	</pattern>-->
	<pattern id="metDecl.meter">
		<rule context="$PublTrans//tei:note[@type = 'metDecl']//tei:seg[@type = 'meter']">
			<let name="ana" value="substring-after(@ana, '#')"/>
			<assert test="@ana" role="error" diagnostics="mJB"><value-of select="$flag"/>in seg[meter] fehlt @ana.</assert>
			<report test="text()" role="error" diagnostics="mJB"><value-of select="$flag"/>in seg[meter] kein Freitext erlaubt [stattdessen @ana setzen].</report>
			<assert test="/tei:TEI//tei:category[@xml:id = $ana]" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in @ana ('<value-of select="@ana"/>') - keinen passenden Wert in category gefunden (u.U. fehlt # oder mehrere Werte angegeben).</assert>
		</rule>
	</pattern>
	<pattern id="commonMetadata.metDecl">
		<rule context="tei:div[@type = 'metadataMetrics']/tei:list/tei:item[@type = 'metVerse']">
			<let name="value" value="tei:num"/>
			<let name="xmlName" value="concat(/tei:TEI/@xml:id, '.xml')"/>
			<let name="divN" value="parent::tei:list/@corresp"/>
			<let name="itemCorresp" value="concat($xmlName, $divN)"/>
			<assert test="/tei:TEI//tei:note[@type = 'metDecl']/tei:list/tei:item[@corresp = $itemCorresp]/tei:seg[@type = 'verseCount'] = $value"><value-of select="$flag"/>Gesamtverszahl in commonMetadata entspricht nicht aktuellem Wert (<value-of select="$value"/>) oder ist leer.</assert>
		</rule>
	</pattern>
	<pattern id="metDeclStructure.item">
		<rule context="tei:item[@type = 'metDeclPart']">
			<assert test="tei:seg[@type = 'metDeclLanguage']" role="error"><value-of select="$flag"/>_seg[metDeclLanguage] fehlt.</assert>
			<assert test="tei:seg[@type = 'verseCount']" role="error"><value-of select="$flag"/>_seg[verseCount] fehlt.</assert>
		</rule>
	</pattern>
	<pattern id="metDeclStructure.seg">
		<rule context="tei:seg[@type = 'metDeclLanguage']">
			<assert test="tei:textLang[@mainLang]" role="error"><value-of select="$flag"/>_textLang (oder @mainLang) fehlt.</assert>
			<assert test="tei:seg[@type = 'meter']" role="error"><value-of select="$flag"/>_seg[meter] fehlt.</assert>
		</rule>
	</pattern>
	<pattern id="neologismenText">
		<rule context="tei:div[@type = 'listNeologisms']/tei:list[text()]">
			<report test="matches(., '\d ')" role="error"><value-of select="$flag"/>Leerzeichen nach Zahl löschen [Komma setzen, außer beim letzten Eintrag].</report>
		</rule>
	</pattern>
	<pattern id="TEI.att.id">
		<rule context="tei:TEI">
			<assert test="string(@xml:id)" role="error"><value-of select="$flag"/>Datei-ID fehlt.</assert>
			<report test="matches(@xml:id, ' ')" role="error"><value-of select="$flag"/>In der Datei-ID keine Leerzeichen verwenden.</report>
			<report test="matches(@xml:id, '\.$')" role="error"><value-of select="$flag"/>In der Datei-ID am Ende keinen Punkt setzen.</report>
			<report test="@rendition = 'astronautilia_transcript' and not(tei:standOff)" role="error" diagnostics="mJB"><value-of select="$flag"/>'standOff' fehlt</report>
			<report test="@rendition = 'astronautilia_transcript' and tei:text/tei:back//tei:div[@type = 'bibliography' or @type = 'quoteTitle' or @type = 'index']" role="error" diagnostics="mJB"><value-of select="$flag"/>Veraltete Kodierung 'back/XInclude'</report>
		</rule>
	</pattern>
	<pattern id="note">
		<rule context="$QMTrans//tei:note[@type = 'crit' or @type = 'similia' or @type = 'ms' or @type = 'comment']">
			<let name="reg1" value="'^\d+$'"/>
			<let name="reg2" value="'^\d+sq\.$'"/>
			<let name="reg3" value="'^\d+‒\d+$'"/>
			<let name="reg4" value="'^\d+–\d+$'"/>
			<!--15 (20.22)-->
			<let name="reg5" value="'^\d+ \(((\.)?\d+)+\)'"/>
			<!--91a-->
			<let name="reg6" value="'^\d+[a-z]$'"/>
			<!--123f. (in comment)-->
			<let name="reg7" value="'^\d+f\.$'"/>
			<let name="id" value="substring-after(@corresp, '#')"/>
			<let name="correspDivNum" value="replace(@corresp, '^(#d\d+)\..*$', '$1')"/>
			<let name="parentDivNum" value="ancestor::tei:list/@corresp"/>
			<assert test="@n" role="error"><value-of select="$flag"/>@n in der Anmerkung fehlt.</assert>
			<assert test="matches(@n, $reg1) or matches(@n, $reg2) or matches(@n, $reg3) or matches(@n, $reg4) or matches(@n, $reg5) or matches(@n, $reg6) or matches(@n, $reg7)" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: Fehler im Nummernformat der Anm. Auch @corresp prüfen.</assert>
			<report test="matches(., '^\S*\]')" role="warn"><value-of select="$flag"/>Bitte prüfen: schließende Klammer am Anfang der Note gefunden. Wurde ein Lemma nicht korrekt kodiert?</report>
			<report test="matches(@corresp, '^#$') or matches(@corresp, '^$')" role="error"><value-of select="$flag"/>@corresp in der Anmerkung fehlt.</report>
			<assert test="
					every $corresp in tokenize(@corresp, ' ')
						satisfies exists(key('k-lineIDHash', $corresp))" diagnostics="mJB"><value-of select="$flag"/>Min. eine in @corresp referenzierte Vers-ID kann nicht gefunden werden.</assert>
			<report test="@type = 'similia' and matches(., ' nl\.') and not(/tei:TEI//tei:l[@xml:id = $id][descendant::tei:distinct])" role="warn"><value-of select="$flag"/>Neologismus ("nl.") genannt, aber im Vers ist kein Neologismus ausgezeichnet.</report>
			<assert test="$correspDivNum = $parentDivNum" role="error" diagnostics="mJB"><value-of select="$flag"/>Div-Nummer in @corresp (<value-of select="$correspDivNum"/>) entspricht nicht der Div-Nummer der übergeordn. Liste (<value-of select="$parentDivNum"/>)</assert>
		</rule>
		<rule context="tei:note[@type = 'footnote']">
			<assert test="@n" role="error"><value-of select="$flag"/>@n in der Anmerkung fehlt.</assert>
			<!--Achtung: id und corresp befinden sich, anders als bei Rhodoman, im seg und werden dort geprüft-->
		</rule>
	</pattern>
	<pattern id="additionalAnnotation">
		<rule context="tei:note">
			<report test="@resp = '#additionalAnnotation' and not(descendant::text()[matches(., '(SW|TG|Weise|Gärtner)')])" role="warn" diagnostics="mJB"><value-of select="$flag"/>In Note ist @resp=additionalAnnotation kodiert, es kann aber kein "SW|TG" im Freitext gefunden werden.</report>
			<report test="descendant::text()[matches(., '(SW|TG)')] and not(@resp = '#additionalAnnotation')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Im Note-Freitext steht "SW|TG", es ist aber (noch) kein @resp=additionalAnnotation kodiert.</report>
		</rule>
	</pattern>
	<pattern id="anchor">
		<rule context="tei:anchor[ancestor::tei:TEI[@xml:id = 'about']]">
			<assert test="matches(@xml:id, '^a_[a-z_\d]+$')" role="error"><value-of select="$flag"/>Fehler im Format anchor/@xml:id (<value-of select="@xml:id"/>) [erwartet "a_[...]"].</assert>
			<assert test="matches(@corresp, '^#n_[a-z_\d]+$')" role="error"><value-of select="$flag"/>Fehler im Format anchor/@corresp (<value-of select="@corresp"/>) [erwartet "#n_[...]"].</assert>
		</rule>
		<rule context="tei:anchor[not(ancestor::tei:TEI[@xml:id = 'about'])]">
			<assert test="matches(@xml:id, '^a_[a-z_\d]+_(cs|de|grc)$')" role="error"><value-of select="$flag"/>Fehler im Format anchor/@xml:id (<value-of select="@xml:id"/>) [erwartet "a_[...]_[cs|de|grc]"].</assert>
			<assert test="matches(@corresp, '^#n_[a-z_\d]+_(cs|de|grc)$')" role="error"><value-of select="$flag"/>Fehler im Format anchor/@corresp (<value-of select="@corresp"/>) [erwartet "#n_[...]_[cs|de|grc]"].</assert>
		</rule>
	</pattern>
	<pattern id="pb1">
		<!--Kapitel-->
		<rule context="tei:TEI[matches(@xml:id, 'Astronautilia_\d+')]//tei:div[@type = 'segment']">
			<assert test="tei:*[1][self::tei:pb] and tei:*[2][self::tei:pb] and tei:*[3][self::tei:pb]" role="warn"><value-of select="$flag"/>Kapitel muss mit drei Seitenzahlen (für M, T, E) beginnen.</assert>
		</rule>
		<!--Umtexte-->
		<!--<rule context="tei:TEI[not(matches(@xml:id, 'Astronautilia_\d+'))]//tei:div[@type = 'segment']">
			<assert test="tei:*[1][self::tei:pb] and tei:*[2][self::tei:pb] and tei:*[3][self::tei:pb]" role="warn"><value-of select="$flag"/>Kapitel muss mit drei Seitenzahlen (für M, T, E) beginnen.</assert>
		</rule>-->
	</pattern>
	<pattern id="pb2">
		<!--Kapitel (und Glossar)-->
		<rule context="tei:TEI[matches(@xml:id, 'Astronautilia_\d+') or matches(@xml:id, 'Astronautilia_Glossar')]//tei:pb">
			<assert test="string(@n)" role="error"><value-of select="$flag"/>Seitenumbruch ist leer, bitte angeben.</assert>
			<assert test="matches(@n, '^M f\. \d+[r|v]$') or matches(@n, '^[T|E] p\. \d+$')" role="warn"><value-of select="$flag"/>Fehler im Seitenzahlformat "<value-of select="@n"/>" ("M f. 0r|v" oder "T|E p. 0")</assert>
		</rule>
		<!--Umtexte-->
		<rule context="tei:TEI[not(matches(@xml:id, 'Astronautilia_\d+') or matches(@xml:id, 'Astronautilia_Glossar'))]//tei:pb">
			<!--M f. εr, T/E p. I-X-->
			<assert test="string(@n)" role="error"><value-of select="$flag"/>Seitenumbruch ist leer, bitte angeben.</assert>
			<assert test="matches(@n, '^M f\. [α-ω][r|v]$') or matches(@n, '^M f\. [I|V|X]+[r|v]$') or matches(@n, '^[T|E] p\. [IVX]+$')" role="warn"><value-of select="$flag"/>Fehler im Seitenzahlformat "<value-of select="@n"/>" ("M f. (α|I)r|v" oder "T|E p. I")</assert>
		</rule>
	</pattern>
	<pattern id="text">
		<!--Auf w2t Transformationsfehler prüfen -->
		<rule context="tei:body//tei:*/text()">
			<report test="matches(., '\{|\}')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: geschweifte Klammer gefunden > wurde ein Seitenumbruch nicht korrekt kodiert?</report>
			<report test="matches(., '@')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: @-Zeichen gefunden > wurde ein Seitenumbruch nicht korrekt kodiert?</report>
			<report test="matches(., '&lt;|&gt;')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: Spitzklammer gefunden > wurde ein supplied oder g nicht korrekt kodiert?</report>
			<report test="matches(., '〈|〉|⟨|⟩|&#9001;|&#9002;|&#10216;|&#10217;')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: franz. Spitzklammer gefunden > wurde ein supplied oder g nicht korrekt kodiert?</report>
			<!--Spitzklammern: &#9001; &#9002; &#10216; &#10217;-->
			<report test="matches(., '%')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: Prozentzeichen gefunden > Fehler aus w2t?</report>
			<report test="matches(., '§')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: Pargraphenzeichen gefunden > Fehler aus w2t?</report>
			<report test="matches(., '\S\(') and ancestor::tei:seg[not(@function)][@xml:lang[contains(., 'cs') or contains(., 'grc')]]" role="warn" diagnostics="mJB"><value-of select="$flag"/>Bitte prüfen: runde Klammer im Wort gefunden > wurde ein expan nicht korrekt kodiert?</report>
			<report test="matches(., '[a-zα-ω]') and parent::tei:l" role="warn"><value-of select="$flag"/>Text direkt in l gefunden > wurde ein Sprach-Segment nicht korrekt kodiert?</report>
			<!--<report test="matches(., '[&#x201E;&#x201C;&#x201A;&#x2018;&#x201B;&#x275B;&#x275C;&#x275D;&#x275E;]')" role="warn"><value-of select="$flag"/>[JB] Anführungszeichen gefunden -> ersetzen durch "quot"</report>-->
		</rule>
		<rule context="tei:*[self::tei:teiHeader or self::tei:front or self::tei:back]//tei:*/text()">
			<report test="matches(., '\?') and ancestor::tei:teiHeader" role="warn"><value-of select="$flag"/>Bitte prüfen: Fragezeichen gefunden > muss hier noch etwas nachgetragen werden?</report>
			<report test="matches(., ' [A-Z]{3,} ') and not(ancestor::tei:editorialDecl)" role="warn"><value-of select="$flag"/>_test: BiblReferenz (oder RefInternal) nicht kodiert? (gefunden: Spatium + min. 3 Großbuchstaben + Spatium).</report>
			<report test="matches(., ' WA')" role="warn"><value-of select="$flag"/>Bitte prüfen: Referenz auf WA? Dann umformulieren zu Referenz auf Kurzkommentar, da es keinen separaten WA gibt?</report>
		</rule>
	</pattern>
	<pattern id="text2">
		<rule context="$PublTrans//tei:div[@type = 'transcript']//tei:seg[not(@type = 'translationOfMainText' or @type = 'translationOfMarginalia')]//tei:*/text()">
			<report test="matches(., '\[') or matches(., '\]')" role="warn"><value-of select="$flag"/>Bitte prüfen: eckige Klammer(n) gefunden > wurde ein surplus nicht korrekt kodiert?</report>
		</rule>
	</pattern>
	<pattern id="text3">
		<rule context="tei:*[not(self::tei:seg[@type = 'gnd'])]/text()">
			<report test="matches(., '\d-\d')" role="warn"><value-of select="$flag"/>Minus zwischen Zahlen gefunden, bitte Bis-Strich setzen (Achtung: kein QUICKFIX)</report>
		</rule>
	</pattern>
	<pattern id="text4">
		<rule context="tei:*/text()">
			<report test="matches(., 'siehe (oben|unten)')" role="warn"><value-of select="$flag"/>Gefunden "siehe oben/unten" -> prüfen, ob das im Digitalen noch sinnvoll ist oder "oben/unten" rausnehmen.</report>
		</rule>
	</pattern>
	<pattern id="distinct">
		<rule context="$QMTrans//tei:body//tei:distinct">
			<assert test="tei:orig" role="error" diagnostics="mJB mEName"><value-of select="$flag"/>Im Neologismus fehlt das Element für die Originalschreibung.</assert>
			<assert test="tei:reg" role="error" diagnostics="mJB mEName"><value-of select="$flag"/>Im Neologismus fehlt das Element für die lemmatisierte Form.</assert>
			<assert test="string(tei:orig)" role="error" subject="tei:orig"><value-of select="$flag"/>Im Neologismus fehlt die Originalschreibung.</assert>
			<assert test="string(tei:reg)" role="error" subject="tei:reg"><value-of select="$flag"/>Im Neologismus fehlt die lemmatisierte Form.</assert>
			<assert test="count(tei:rs[@type = 'bibl']) eq 3" role="error"><value-of select="$flag"/>Im Neologismus werden genau 3 Literaturangaben erwartet.</assert>
			<report test="tei:orig/tei:rs" role="warn"><value-of select="$flag"/>Bitte prüfen: Indexauszeichnung in Neologismus gefunden - nur in seltenen Ausnahmefällen korrekt (z.B. Coc.Ion.)</report>
			<report test="tei:rs[@subtype = 'not-checked']" role="warn"><value-of select="$flag"/>Neologismus wurde noch nicht in allen Lexika überprüft, aber die Flag "readyForPublicationTrans" ist bereits gesetzt.</report>
		</rule>
		<rule context="$PublTrans//tei:back//tei:distinct">
			<report test="tei:rs[@subtype = 'not-checked']" role="warn"><value-of select="$flag"/>Back: Neologismus wurde noch nicht in allen Lexika überprüft, aber die Flag "readyForPublicationTrans" ist bereits gesetzt.</report>
		</rule>
	</pattern>
	<pattern id="distinct.rs">
		<rule abstract="true" id="checkRs">
			<assert test="@ref = $refTypes" role="error"><value-of select="$flag"/>Lit.Ang. (<value-of select="@ref"/>) im Neologismus fehlerhaft (erlaubte Werte im <value-of select="$lang"/>: <value-of select="string-join($refTypes, ', ')"/>).</assert>
		</rule>
		<rule context="$PublTrans//tei:seg[@xml:lang = 'grc']//tei:distinct/tei:rs">
			<let name="refTypes" value="('#lsj_1996', '#lampe_1961', '#lbg_2017')"/>
			<let name="lang" value="'Gr.'"/>
			<extends rule="checkRs"/>
		</rule>
	</pattern>
	<pattern id="transcriptAndTranslation.exists">
		<rule context="tei:l">
			<report test="tei:seg[@type = 'translationOfMainText'] and not(tei:seg[@type = 'mainText'])" role="error" diagnostics="mJB"><value-of select="$flag"/>Es fehlt der Haupttext zur Übersetzung.</report>
			<report test="tei:seg[@type = 'mainText'] and not(tei:seg[@type = 'translationOfMainText'])" role="error" diagnostics="mJB"><value-of select="$flag"/>Es fehlt die dt. Übersetzung des Haupttextes.</report>
		</rule>
	</pattern>
	<pattern id="l.att.id">
		<rule abstract="true" id="checkID">
			<let name="regex" value="'d\d+\.' || $expected || '\d\.v\d+'"/>
			<assert test="matches(., $regex)" role="error"><value-of select="$flag"/>Line-ID ("<value-of select="
						if (matches(., 'd\d\.')) then
							substring(., 4, 1)
						else
							substring(., 5, 1)"/>" in <value-of select="."/>) passt nicht zum übergeordneten Element (<value-of select="parent::*/parent::*/name()"/>); erwartet: "<value-of select="$expected"/>"</assert>
		</rule>
		<rule context="tei:lg/tei:l/@xml:id">
			<let name="expected" value="'g'"/>
			<extends rule="checkID"/>
		</rule>
		<rule context="tei:ab/tei:l/@xml:id">
			<let name="expected" value="'a'"/>
			<extends rule="checkID"/>
		</rule>
		<rule context="tei:head/tei:l/@xml:id">
			<let name="expected" value="'h'"/>
			<extends rule="checkID"/>
		</rule>
		<rule context="tei:opener/tei:l/@xml:id">
			<let name="expected" value="'o'"/>
			<extends rule="checkID"/>
		</rule>
		<rule context="tei:closer/tei:l/@xml:id">
			<let name="expected" value="'c'"/>
			<extends rule="checkID"/>
		</rule>
	</pattern>
	<pattern id="div">
		<rule context="tei:div[@xml:id]">
			<assert test="@xml:id = ('div_quoteTitle', 'div_about', 'div_bibliography', 'div_contentMilestones', 'div_index', 'footnotes', 'div_edition', 'div_drawings') or @xml:id[matches(., '^d\d+$')]" role="error"><value-of select="$flag"/>Falscher ID-Wert in div (erlaubt: 'd00' ODER 'div_quoteTitle','div_about','div_bibliography','div_contentMilestones','div_index', 'footnotes','div_edition', 'div_drawings')</assert>
		</rule>
	</pattern>
	<pattern id="structure.div.segment">
		<rule context="tei:div[@type = 'transcript']/tei:*">
			<report test="not(self::tei:div[@type = ('segment', 'footnotes')])" role="error" diagnostics="mJB"><value-of select="$flag"/>In Transcript-Div wurde ein Element gefunden, das keine Segments/Footnotes-Div ist.</report>
		</rule>
	</pattern>
	<pattern id="structure.back.div">
		<rule context="tei:TEI[not(@xml:id = $registerTEIids)]//tei:back">
			<assert test="tei:div[@type = 'critNotes']" role="error"><value-of select="$flag"/>Im back fehlt eine div (critNotes).</assert>
			<assert test="tei:div[@type = 'similiaNotes']" role="error"><value-of select="$flag"/>Im back fehlt eine div (similiaNotes).</assert>
			<assert test="tei:div[@type = 'listSpondiaci']" role="error"><value-of select="$flag"/>Im back fehlt eine div (listSpondiaci).</assert>
			<assert test="tei:div[@type = 'listNeologisms']" role="error"><value-of select="$flag"/>Im back fehlt eine div (listNeologisms).</assert>
			<assert test="tei:div[@type = 'listIndexReferences']" role="error"><value-of select="$flag"/>Im back fehlt eine div (listIndexReferences).</assert>
			<assert test="tei:div[@type = 'listMonosyllaba']" role="error"><value-of select="$flag"/>Im back fehlt eine div (listMonosyllaba).</assert>
			<assert test="tei:div[@type = 'metadataMetrics']" role="error"><value-of select="$flag"/>Im back fehlt eine div (metadataMetrics).</assert>
			<assert test="tei:div[@type = 'contentMilestones'] or xi:include[@xpointer = 'div_contentMilestones']" role="error"><value-of select="$flag"/>Im back fehlt eine div (contentMilestones) [Achtung: über XInclude eingezogen].</assert>
		</rule>
	</pattern>
	<pattern id="structure.back.list">
		<rule context="tei:back/tei:div[not(@type = 'contentMilestones')]/tei:list">
			<assert test="string(@corresp)" role="error"><value-of select="$flag"/>In back/list fehlt @corresp zum zugehörigen Gedicht.</assert>
			<assert test="@corresp[matches(., '#d\d')]" role="error"><value-of select="$flag"/>Fehler im Format des back/list/@corresp (Format: "#d1").</assert>
		</rule>
	</pattern>
	<pattern id="structure.back.hasList">
		<rule context="tei:back/tei:div[@type = 'critNotes' or @type = 'similiaNotes' or @type = 'footnotes'][tei:*]">
			<report test="tei:*[not(self::tei:list)]" role="error" diagnostics="mJB"><value-of select="$flag"/>In back/div sind möglicherweise notes ohne list kodiert.</report>
		</rule>
	</pattern>
	<pattern id="date">
		<rule context="tei:origin/tei:date[text()] | tei:imprint/tei:date[text()]">
			<assert test="@when[matches(., '^\d{4}$')]" role="error"><value-of select="$flag"/>Technisches Jahr fehlt oder ist im falschen Format (erwartet: nur Jahreszahl).</assert>
		</rule>
	</pattern>
	<pattern id="seg">
		<rule context="tei:l/tei:seg[not(@function)]">
			<let name="lang" value="@xml:lang"/>
			<let name="type" value="@type"/>
			<let name="subtype" value="@subtype"/>
			<!-- <seg>-Typ nur einmal pro l erlaubt-->
			<report test="preceding-sibling::tei:seg[@xml:lang = $lang and @type = $type and not(@function)]" role="warn"><value-of select="$flag"/>Bitte prüfen: es gibt bereits ein Segment mit diesem Type und dieser Sprache.</report>
		</rule>
		<rule context="tei:l/tei:seg[@function]">
			<let name="lang" value="@xml:lang"/>
			<let name="type" value="@type"/>
			<let name="subtype" value="@subtype"/>
			<!-- <seg>-Typ nur einmal pro l erlaubt-->
			<report test="preceding-sibling::tei:seg[@xml:lang = $lang and @type = $type and @function]" role="warn"><value-of select="$flag"/>Bitte prüfen: es gibt bereits ein Segment mit diesem Type und dieser Sprache.</report>
		</rule>
	</pattern>
	<pattern id="seg.empty">
		<rule context="tei:l/tei:seg">
			<!--leere Seg als Error ausgeben, aber ab publTrans nur noch als Warnung (weil in seltenen Fällen u.U. korrekt)-->
			<report test="not(node()) and ancestor::tei:TEI[not(descendant::tei:change[@type = 'readyForPublicationTrans'])]" role="error" diagnostics="mJB"><value-of select="$flag"/>Segment ist leer.</report>
			<report test="not(node()) and ancestor::tei:TEI[descendant::tei:change[@type = 'readyForPublicationTrans']]" role="warn"><value-of select="$flag"/>Segment ist leer.</report>
		</rule>
	</pattern>
	<pattern id="normalised">
		<rule context="$haupttext//tei:div[@type = 'transcript']/tei:div[@type = 'segment']/tei:*/tei:l">
			<assert test="tei:seg[@xml:lang = 'grc'][@function]"><value-of select="$flag"/>Keine normalisierte Version zu diesem Vers gefunden.</assert>
			<assert test="tei:seg[@xml:lang = 'grc'][not(@function)]"><value-of select="$flag"/>Keine nicht-normalisierte Version zu diesem Vers gefunden.</assert>
			<report test="count(tei:seg[@function]) &gt; 1"><value-of select="$flag"/>Mehr als eine normalisierte Version gefunden (nur zum Gr. erlaubt).</report>
		</rule>
	</pattern>
	<pattern id="seg2">
		<rule context="tei:seg[ancestor::tei:seg]">
			<let name="type" value="@type"/>
			<report test="ancestor::tei:seg[@type = $type]" role="warn"><value-of select="$flag"/>Es gibt eine übergeordnete seg mit demselben @type-Wert (<value-of select="$type"/>)</report>
		</rule>
	</pattern>
	<pattern id="seg3">
		<rule context="tei:seg[not(parent::tei:note[@type = 'footnote'])]">
			<report test="@xml:id" role="error"><value-of select="$flag"/>@xml:id nur bei seg innerhalb von Originalanmerkungen (note[footnote]) erlaubt.</report>
			<report test="@corresp" role="error"><value-of select="$flag"/>@corresp nur bei seg innerhalb von Originalanmerkungen (note[footnote]) erlaubt.</report>
		</rule>
		<rule context="tei:seg[parent::tei:note[@type = 'footnote']]">
			<assert test="matches(@xml:id, '^n_[a-z_\d]+_(cs|de|grc)$')" role="error"><value-of select="$flag"/>Fehler im Format seg/@xml:id-Format (<value-of select="@xml:id"/>) [erwartet "n_[...]_[cs|de|grc]"].</assert>
			<assert test="matches(@corresp, '^#a_[a-z_\d]+_(cs|de|grc)$')" role="error"><value-of select="$flag"/>Fehler im Format seg/@corresp-Format (<value-of select="@corresp"/>) [erwartet "#a_[...]_[cs|de|grc]"].</assert>
		</rule>
	</pattern>
	<pattern id="seg-spondaic">
		<rule context="tei:seg[@type = 'spondaic']">
			<report test="tei:seg" role="error" diagnostics="mJB"><value-of select="$flag"/>Spondiacus mehrfach geschachtelt.</report>
		</rule>
	</pattern>
	<pattern id="seg.met.ana">
		<!--@MET:
Beispiele Hexameter: groß/klein:
- DDDDS-; DSDSDu
- dddds-; dsdsdu
Beispiele Pentameter: klein (vor QM): [mm= eigentlich Doppelminus, aber hier nicht darstellbar wegen Kommentar)]
- ddmm, dsmm, ds-u
Beispiele Pentameter nach QM:
- DD-DD-, DS-DD-, DS-DD-u
-->
		<!--
		Prosa (nur Mischform, dh innerhalb von lg; nicht bei ab):
		met='prose'
		-->
		<!--@ANA: 
			a) beliebig viele von: #TH #PH #HH #BD #KTT #MZ
			b) Prosa: darf nicht stehen
-->
		<!--Achtung: für @met und @ana auch Hotfix-Ausnahme "na"-->
		<let name="reg1" value="'^[D|S]{5}[-|u]$'"/>
		<let name="reg2" value="'^[D|S]{2}[-|u]DD[-|u]$'"/>
		<let name="reg3" value="'^[d|s]{5}[-|u]$'"/>
		<let name="reg4" value="'^[d|s]{2}-[-|u]$'"/>
		<let name="reg5" value="'^(#TH ?|#PH ?|#HH ?|#BD ?|#KTT ?|#MZ)+$'"/>
		<let name="reg6" value="'^(th,?|ph,?|hh,?|bd,?|ktt,?|mz)+$'"/>
		<!--A) @met (nach QM)-->
		<rule context="$PublTrans//tei:seg/@met[matches(., 'D|S') or matches(., 'na') or matches(., 'NA') or matches(., 'prose')]">
			<assert test="matches(., $reg1) or matches(., $reg2) or matches(., '^na$') or matches(., '^prose$')" role="error"><value-of select="$flag"/>@met: Fehler im Metrikformat.</assert>
			<report test="matches(., 'prose') and parent::tei:seg[@ana]" diagnostics="mJB"><value-of select="$flag"/>Bei seg(prose) kein @ana setzen.</report>
		</rule>
		<!--A) @met (vor QM)-->
		<rule context="$QMTrans//tei:seg/@met[matches(., 'd|s') or matches(., 'na') or matches(., 'prose')]">
			<assert test="matches(., $reg3) or matches(., $reg4) or matches(., '^na$') or matches(., '^prose$')" role="error"><value-of select="$flag"/>@met: Fehler im Metrikformat.</assert>
			<!--<report test="matches(.,'na')" role="warn">@met: Bite prüfen - NA-Metrikformat absichtlich gesetzt?</report>-->
		</rule>
		<!--B) @ana (nach QM)-->
		<rule context="$PublTrans//tei:seg/@ana[matches(., 'na') or matches(., 'NA')][not(ancestor::tei:note[@type = 'metDecl'])]">
			<assert test="matches(., '^#na$')" role="error"><value-of select="$flag"/>@ana: Fehler im NA-Zäsurformat (erlaubt nur "#na", nicht mit anderen kombinierbar, nicht "NA").</assert>
		</rule>
		<rule context="$PublTrans//tei:seg/@ana[matches(., '[BDHKMPTZ]')][not(ancestor::tei:note[@type = 'metDecl'])]">
			<assert test="matches(., $reg5)" role="error"><value-of select="$flag"/>@ana: Fehler im Zäsurformat .</assert>
			<report test="matches(., '[BDHKMPTZ]#')" role="error"><value-of select="$flag"/>@ana: Zäsueren durch Spatium trennen.</report>
			<report test="contains(., 'PH') and contains(., 'KTT')"><value-of select="$flag"/>@ana: Fehler im Zäsurformat (PH und KTT dürfen nicht zusammen vorkommen).</report>
		</rule>
		<!--B) @ana (vor QM)-->
		<rule context="$QMTrans//tei:seg/@ana[matches(., 'na')][not(ancestor::tei:note[@type = 'metDecl'])]">
			<assert test="matches(., '^na$')" role="error"><value-of select="$flag"/>@ana: Fehler im NA-Zäsurformat (erlaubt nur "na", nicht mit anderen kombinierbar).</assert>
			<!--<report test="matches(., '^na$')" role="warn">@ana: Bitte prüfen - NA-Zäsurformat absichtlich gesetzt?</report>-->
		</rule>
		<rule context="$QMTrans//tei:seg/@ana[matches(., '[bdhkmptz]')][not(ancestor::tei:note[@type = 'metDecl'])]">
			<assert test="matches(., $reg6)" role="error"><value-of select="$flag"/>@ana: Fehler im Zäsurformat (erlaubt: "th,ph,hh,bd,ktt,mz"; mehrere durch Komma trennen ohne Spatium).</assert>
		</rule>
		<!--C) <seg> sicherstellen, dass nach QM @met+@ana angereichert-->
		<rule context="$PublTrans//tei:seg[string(@met) and string(@ana)][not(@ana = 'na' or @met = 'na')]">
			<report test="@met[matches(., 'D|S')] and @ana[matches(., 'bdhkmptz')]" diagnostics="mJB"><value-of select="$flag"/>Fehler nach QM (Kleinbuchstaben in @ana gefunden).</report>
			<report test="@met[matches(., 'd|s')] and @ana[matches(., '[BDHKMPTZ]')]" diagnostics="mJB"><value-of select="$flag"/>Fehler nach QM (Kleinbuchstaben in @met gefunden).</report>
		</rule>
	</pattern>
	<pattern id="seg.metComplete">
		<rule context="$PublTrans//tei:lg[descendant::tei:seg[@met]]//tei:seg[not(@function) and not(@met = 'prose')][(@type = 'mainText' or @type = 'translationOfMainText') and not(@xml:lang = ('de', 'cs'))]">
			<assert test="string(@met)" role="error"><value-of select="$flag"/>@met fehlt oder leer.</assert>
			<assert test="string(@ana)" role="error"><value-of select="$flag"/>@ana fehlt oder leer.</assert>
		</rule>
	</pattern>
	<!--................... Flags (Anfang) ...................-->
	<pattern id="change-processStatus-logic">
		<rule context="tei:TEI//tei:listChange[@type = 'processStatus']/tei:change">
			<report test="@type = 'readyForQMTrans' and not(parent::tei:listChange[tei:change[@type = 'hasTranscript']])" role="error" diagnostics="mJB"><value-of select="$flag"/>Vor der Flag "QM (Transkription)" muss die Flag "Basistranskription" gesetzt werden.</report>
			<report test="@type = 'hasSimilia' and not(parent::tei:listChange[tei:change[@type = 'readyForQMTrans']])" role="error" diagnostics="mJB"><value-of select="$flag"/>Vor der Flag "Similien ausgezeichnet" muss die Flag "QM (Transkription)" gesetzt werden.</report>
			<report test="@type = 'readyForPublicationTrans' and not(parent::tei:listChange[tei:change[@type = 'readyForQMTrans']])" role="error"><value-of select="$flag"/>Vor der Flag "Publikationsfreigabe (Transkription)" muss die Flag "QM (Transkription)" gesetzt werden.</report>
			<report test="@type = 'update' and not(parent::tei:listChange[tei:change[@type = 'readyForPublicationTrans']])" role="error"><value-of select="$flag"/>Vor der Flag "Änderungen" muss die Flag "Publikationsfreigabe" (Transkription) gesetzt werden.</report>
			<report test="@type = 'readyForEpub' and not(parent::tei:listChange[tei:change[@type = 'readyForPublicationTrans']])" role="error"><value-of select="$flag"/>Vor der Flag "E-Book-Freigagbe" muss die Flag "Publikationsfreigabe (Transkription)" gesetzt werden.</report>
		</rule>
	</pattern>
	<pattern id="change-fileStatus-logic">
		<rule context="tei:listChange[@type = 'fileStatus']">
			<!--Grundsätzliche Plausibilitätsprüfungen zur Statusfreigabe-->
			<report test="tei:change[@type = 'statusEdition'][@status = 'open'] and (tei:change[@type = 'metadata'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'transcription'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'similia'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'neologisms'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'versusTetracoli'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'indexReferences'][@status[matches(., '(finished|notApplicable)')]])" role="info">Flag(statusEdition) steht auf "open", aber alle flags sind 'finished/notApplicable'</report>
			<report test="tei:change[@type = 'statusPublication'][@status = 'inProgress'] and (tei:change[@type = 'metadata'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'transcription'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'similia'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'neologisms'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'versusTetracoli'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'indexReferences'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'statusEdition'][@status[matches(., '(finished)')]])" role="info">Flag(statusPublication) steht auf "inProgress", aber alle flags sind 'finished'</report>
			<report test="tei:change[@type = 'statusPublication'][@status = 'inProgress'] and (tei:change[@type = 'metadata'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'transcription'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'similia'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'neologisms'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'versusTetracoli'][@status[matches(., '(finished|notApplicable)')]] and tei:change[@type = 'indexReferences'][@status[matches(., '(open)')]] and tei:change[@type = 'statusEdition'][@status[matches(., '(open)')]])" role="info">Flag(statusPublication) steht auf "inProgress", aber alle flags außer indexRef sind 'finished/na' -> finishedLight?</report>
		</rule>
	</pattern>
	<pattern id="change-attributes">
		<rule context="tei:listChange[@type = 'processStatus']/tei:change">
			<assert test="@type[matches(., '(created|hasTranscript||hasNormalised|readyForQMTrans|hasSimilia|readyForPublicationTrans|update|hasVersusTetracoli|readyForEpub)')]" role="error"><value-of select="$flag"/>Falscher Wert (<value-of select="@type"/>) in change/@type.</assert>
			<assert test="@when" role="error"><value-of select="$flag"/>In normaler Flag ist @when verpflichtend.</assert>
			<assert test="@who" role="error"><value-of select="$flag"/>In normaler Flag ist @who verpflichtend.</assert>
			<assert test="matches(@when, '\d{4}-\d{2}-\d{2}')" role="warn"><value-of select="$flag"/>Datumsformat in change/@when falsch (erwartet: 0000-00-00).</assert>
			<report test="@type = 'update' and not(string())" role="error"><value-of select="$flag"/>In der Flag "Änderungen" fehlt eine kurze Beschreibung der Änderungen.</report>
			<report test="string() and not(@type = 'update')" role="error"><value-of select="$flag"/>Freitext in der Flag nicht erlaubt.</report>
		</rule>
		<rule context="tei:listChange[@type = 'fileStatus']/tei:change">
			<assert test="@type[matches(., '(metadata|transcription|similia|versusTetracoli|metrics|indexReferences|neologisms|statusEdition|statusPublication|normalised)')]" role="error"><value-of select="$flag"/>Falscher Wert (<value-of select="@type"/>) in change/@type.</assert>
			<report test="@type[matches(., '(metadata|transcription|similia|versusTetracoli|metrics|indexReferences|neologisms|statusEdition)')] and not(@status[matches(., '(finished$|notApplicable|open)')])" role="error"><value-of select="$flag"/>Falscher Wert (<value-of select="@status"/>) in change/@status.</report>
			<report test="@type[matches(., '(statusPublication)')] and not(@status[matches(., '(finishedComplete|finishedLight|inProgress)')])" role="error"><value-of select="$flag"/>Falscher Wert (<value-of select="@status"/>) in change/@status.</report>
			<report test="@who or @when" role=""><value-of select="$flag"/>In diesem change keine @who/@when setzen.</report>
		</rule>
	</pattern>
	<pattern id="change-content-checks">
		<rule context="tei:change[@type = 'transcription']">
			<report test="@status = 'notApplicable' and parent::tei:listChange[tei:change[(@type = 'similia' or @type = 'versusTetracoli' or @type = 'metrics' or @type = 'indexReferences' or @type = 'neologisms') and @status = 'finished']]" role="info">Flag(transcription) auf na, aber noch changes(finished) für similien o.ä. gefunden --> bei Einheiten ohne Text nicht logisch.</report>
		</rule>
		<rule context="tei:change[@type = 'statusEdition']">
			<report test="@status = 'finished' and parent::tei:listChange[tei:change[@status = 'open']]" role="info">Flag(statusEdition) auf finished, aber noch change(open) gefunden.</report>
		</rule>
		<rule context="tei:change[@type = 'statusPublication']">
			<report test="@status[matches(., '(finishedComplete)')] and parent::tei:listChange[tei:change[@status = 'open']]" role="info">Flag(statusPublication) auf finishedComplete, aber noch change(open) gefunden.</report>
			<report test="@status[matches(., '(finishedComplete|finishedLight)')] and not(/tei:TEI//tei:change[@type = 'readyForPublicationTrans'])" role="info">Flag(statusPublication) auf finishedComplete/Light, aber noch keine change(readyForPublicationTrans) gesetzt.</report>
			<report test="@status[matches(., '(inProgress)')] and /tei:TEI//tei:change[@type = 'readyForPublicationTrans']" role="info">Flag(statusPublication) auf inProgress, aber change(readyForPublicationTrans) schon gesetzt.</report>
		</rule>
		<rule context="tei:change[@type = 'similia']">
			<report test="@status = 'finished' and not(/tei:TEI//tei:div[@type = 'segment'][descendant::tei:quote])" role="info">Flag(similia) auf finished, aber keine quote gefunden.</report>
			<report test="@status = 'notApplicable' and /tei:TEI//tei:div[@type = 'segment'][descendant::tei:quote]" role="info">Flag(similia) auf na, aber quote gefunden.</report>
		</rule>
		<rule context="tei:change[@type = 'versusTetracoli']">
			<report test="@status = 'finished' and not(/tei:TEI//tei:l[contains(@ana, 'versusTetracoli')])" role="info">Flag(versusTetracoli) auf finished, aber keine l/@ana gefunden.</report>
			<report test="@status = 'notApplicable' and /tei:TEI//tei:l[contains(@ana, 'versusTetracoli')]" role="info">Flag(versusTetracoli) auf na, aber l/@ana gefunden.</report>
		</rule>
		<rule context="tei:change[@type = 'metrics']">
			<report test="@status = 'finished' and not(/tei:TEI//tei:seg[string(@met) and string(@ana)])" role="info">Flag(metrics) auf finished, aber keine l/@ana+@met gefunden.</report>
			<report test="@status = 'notApplicable' and /tei:TEI//tei:seg[string(@met) and string(@ana)]" role="info">Flag(metrics) auf na, aber l/@ana+@met gefunden.</report>
		</rule>
		<rule context="tei:change[@type = 'indexReferences']">
			<report test="@status = 'finished' and not(/tei:TEI//tei:div[@type = 'segment'][descendant::tei:rs])" role="info">Flag(indexReferences) auf finished, aber keine rs gefunden.</report>
			<report test="@status = 'notApplicable' and /tei:TEI//tei:div[@type = 'segment'][descendant::tei:rs]" role="info">Flag(indexReferences) auf na, aber rs gefunden.</report>
		</rule>
		<rule context="tei:change[@type = 'neologisms']">
			<report test="@status = 'finished' and not(/tei:TEI//tei:div[@type = 'segment'][descendant::tei:distinct])" role="info">Flag(neologisms) auf finished, aber keine distinct gefunden.</report>
			<report test="@status = 'notApplicable' and /tei:TEI//tei:div[@type = 'segment'][descendant::tei:distinct]" role="info">Flag(neologisms) auf na, aber distinct gefunden.</report>
		</rule>
	</pattern>
	<pattern id="flagMissingHasTranscript">
		<rule context="tei:TEI[not(contains(@xml:id, 'Theol.Christ')) and descendant::tei:div[@type = 'transcript']/tei:*]//tei:listChange[@type = 'processStatus']">
			<assert test="tei:change[@type = 'hasTranscript']" role="error" diagnostics="mJB"><value-of select="$flag"/>Transkriptionsflag fehlt.</assert>
		</rule>
	</pattern>
	<pattern id="flagMissingHasSimilia">
		<rule context="tei:TEI[descendant::tei:quote[@type = 'similia'] or descendant::tei:ref[@subtype = 'similia']]//tei:listChange[@type = 'processStatus']">
			<assert test="tei:change[@type = 'hasSimilia']" role="warn" diagnostics="mJB"><value-of select="$flag"/>QM-Similia-Flag fehlt.</assert>
		</rule>
	</pattern>
	<pattern id="flagMissingHasVersusTetracoli">
		<rule context="tei:TEI[descendant::tei:change[@type = 'readyForPublicationTrans']]//tei:listChange[@type = 'processStatus']">
			<assert test="tei:change[@type = 'hasVersusTetracoli']" role="warn" diagnostics="mJB"><value-of select="$flag"/>Versus-Tetracoli-Flag noch nicht gesetzt, aber Transkription bereits zur Publikation freigegeben.</assert>
		</rule>
	</pattern>
	<pattern id="flagMissingHasNormalised">
		<rule context="tei:TEI[descendant::tei:change[@type = 'readyForPublicationTrans']]">
			<assert test="descendant::tei:change[@type = 'hasNormalised']" role="warn" diagnostics="mJB"><value-of select="$flag"/>Normalised-Flag noch nicht gesetzt, aber Transkription bereits zur Publikation freigegeben.</assert>
		</rule>
	</pattern>
	<!--................... Flags (Ende) ...................-->
	<!--<pattern id="biblScope">
		<rule context="tei:biblScope">
			<assert test="string()" role="error"><value-of select="$flag"/>Bitte Seitenabschnitt(e) angeben oder "Ganzschrift" auswählen.</assert>
			<report test="matches(text(), '\-')" role="warn" sqf:fix="replaceMinus"><value-of select="$flag"/>Minus gefunden im Seitenabschnitt (sollte ein Bis-Strich sein) - QUICKFIX</report>
		</rule>
	</pattern>-->
	<pattern id="seg.biblScope">
		<rule context="tei:seg[@type = 'biblScope']">
			<report test="matches(text(), '\-')" role="warn" sqf:fix="replaceMinus"><value-of select="$flag"/>Minus gefunden im Seitenabschnitt (sollte ein Bis-Strich sein) - QUICKFIX</report>
		</rule>
	</pattern>
	<pattern id="contentMilestonesPtr">
		<rule context="tei:div[@xml:id = 'div_contentMilestones']//tei:ptr/@target">
			<!--in commonMetadata-->
			<let name="reg" value="'Astronautilia_[A-Za-z\d]*\.xml#d\d{1,2}\.[hogac]\d\.[ve]\d+'"/>
			<assert test="matches(., $reg)" role="error"><value-of select="$flag"/>Fehler im Format der Zielvers-ID (<value-of select="."/>).</assert>
		</rule>
	</pattern>
	<pattern id="contentMilestonesItem">
		<rule context="tei:div[@xml:id = 'div_contentMilestones']//tei:item">
			<!--in commonMetadata-->
			<assert test="matches(@n, '^\d\-\d{2}\-\d\-\d{4}$')" role="warn">Fehler im item/@n Format (erwartet: 0-00-0-000)</assert>
		</rule>
		<rule context="tei:div[@xml:id = 'contentMilestones']//tei:item">
			<!--in Einheit (nicht commonMetadata)-->
			<assert test="matches(@n, '^\d{2}\-\d\-\d{3}$')" role="warn"><value-of select="$flag"/>Fehler im item/@n Format (erwartet: 00-0-000)</assert>
		</rule>
	</pattern>
	<pattern id="contentMilestonesDesc">
		<rule context="tei:div[@type = 'contentMilestones']//tei:desc">
			<!--in Einheit (nicht commonMetadata)-->
			<assert test="@type"><value-of select="$flag"/>In Beschreibung der Textsprungmarke fehlt @type.</assert>
			<assert test="string()" role="error"><value-of select="$flag"/>Beschreibung der Textsprungmarke darf nicht leer sein.</assert>
			<report test="starts-with(., ' ') or ends-with(., ' ')" role="error"><value-of select="$flag"/>Spatium gefunden am Anfang/Ende der Beschreibung der Textsprungmarke.</report>
		</rule>
	</pattern>
	<pattern id="resp">
		<!--Prüft auf Kombination und Format von resp je nach Dateityp-->
		<let name="nContentIDs" value="('transcription', 'edition', 'annotation', 'transmission', 'additionalAnnotation', 'translation', 'similia', 'content', 'contentAutoGenerated')"/>
		<let name="nTechIDs" value="('markup', 'encoding', 'technicalRealisation', 'dataModel', 'dataAnalysis')"/>
		<let name="idsNurEinheit" value="('transcription', 'edition', 'annotation', 'transmission', 'additionalAnnotation', 'translation', 'similia', 'markup')"/>
		<let name="idsNurRegister" value="('content', 'contentAutoGenerated')"/>
		<let name="registerTEIids" value="('bibliography', 'about', 'werke', 'index', 'lists', 'fulltextIndex', 'quoteTitle', 'commonMetadata', 'drawings', 'edition')"/>
		<rule context="tei:resp">
			<report test="(@xml:id = 'edition' or @xml:id = 'additionalAnnotation' or @xml:id = 'encoding') and count(tei:persName) &gt; 1" role="error" diagnostics="mEName"><value-of select="$flag"/>Nicht mehr als ein Name (persName) erlaubt.</report>
			<report test="@xml:id = $nContentIDs and not(@n = 'content')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Zu dieser @xml:id (<value-of select="@xml:id"/>) gehört @n=content</report>
			<report test="@xml:id = $nTechIDs and not(@n = 'tech')" role="warn" diagnostics="mJB"><value-of select="$flag"/>Zu dieser @xml:id (<value-of select="@xml:id"/>) gehört @n=content</report>
			<report test="not(/tei:TEI[@xml:id = $registerTEIids]) and @xml:id = $idsNurRegister" role="warn" diagnostics="mJB"><value-of select="$flag"/>@xml:id (<value-of select="@xml:id"/>) bei Einheiten nicht erlaubt (nur bei Registern).</report>
			<report test="/tei:TEI[@xml:id = $registerTEIids] and @xml:id = $idsNurEinheit" role="warn" diagnostics="mJB"><value-of select="$flag"/>@xml:id (<value-of select="@xml:id"/>) bei Registern nicht erlaubt (nur bei Einheiten).</report>
		</rule>
	</pattern>
	<pattern id="respExistTrans">
		<rule context="$PublTrans//tei:respStmt">
			<assert test="tei:resp[@xml:id = 'transcription'][tei:persName[string()]]" role="error"><value-of select="$flag"/>Verantwortlichkeit fehlt [transcription].</assert>
			<assert test="tei:resp[@xml:id = 'annotation'][tei:persName[string()]]" role="error"><value-of select="$flag"/>Verantwortlichkeit fehlt [annotation].</assert>
			<assert test="tei:resp[@xml:id = 'translation'][tei:persName[string()]]" role="error"><value-of select="$flag"/>Verantwortlichkeit fehlt [translation].</assert>
			<report test="tei:resp[@xml:id = 'additionalAnnotation'][not(tei:persName[string()])]" role="error"><value-of select="$flag"/>Verantwortlichkeit fehlt [additionalAnnotation].</report>
			<report test="tei:resp[@xml:id = 'similia'][not(tei:persName[string()])]" role="error"><value-of select="$flag"/>Verantwortlichkeit fehlt [similia].</report>
		</rule>
	</pattern>
	<pattern id="resp.note">
		<rule context="$PublTrans//tei:resp[@xml:id = 'additionalAnnotation']">
			<assert test="/tei:TEI//tei:note[@resp = '#additionalAnnotation']" role="error" diagnostics="mJB"><value-of select="$flag"/>resp additionalAnnotation kodiert, aber keine Note mit entsprechendem @resp versehen.</assert>
		</rule>
		<rule context="$PublTrans//tei:note[@resp = '#additionalAnnotation']">
			<assert test="/tei:TEI//tei:resp[@xml:id = 'additionalAnnotation']" role="error" diagnostics="mJB"><value-of select="$flag"/>Anm. mit @resp=#additionalAnnotation kodiert, aber kein entsprechendes resp im Header.</assert>
		</rule>
	</pattern>
	<pattern id="resp.note2">
		<rule context="$PublTrans//tei:note[@resp = '#additionalAnnotation'][contains(., 'SW')]">
			<assert test="/tei:TEI//tei:resp[@xml:id = 'additionalAnnotation']/tei:persName[contains(., 'Stefan Weise')]" role="warn" diagnostics="mJB"><value-of select="$flag"/>In note ist SW festgehalten, aber es fehlt resp "Stefan Weise".</assert>
		</rule>
		<rule context="$PublTrans//tei:note[@resp = '#additionalAnnotation'][contains(., 'TG')]">
			<assert test="/tei:TEI//tei:resp[@xml:id = 'additionalAnnotation']/tei:persName[contains(., 'Thomas Gärtner')]" role="warn" diagnostics="mJB"><value-of select="$flag"/>In note ist TG festgehalten, aber es fehlt resp "Thomas Gärtner".</assert>
		</rule>
	</pattern>
	<pattern id="rs.bibl">
		<rule context="tei:rs[@type = 'bibl']">
			<report test="following-sibling::node()[1][self::text() and matches(., '^\s*–')]" role="warn"><value-of select="$flag"/>Trennstrich nach rs.bibl gefunden -> Zahl nicht komplett übernommen?</report>
			<report test="following-sibling::node()[1][self::text() and matches(., '^\s*\d')]" role="warn"><value-of select="$flag"/>Zahl nach rs.bibl gefunden -> rs nicht komplett?</report>
			<report test="matches(., '^\s*s\.\s?v\.')" role="warn" diagnostics="mJB"><value-of select="$flag"/>s.v. nach dem rs setzen (nicht hinein)</report>
			<report test="@ref = '#brockhaus_2006' and not(matches(., '\d+, \d+'))" role="warn"><value-of select="$flag"/>Bei Brockhaus im rs Bandnr. und Seitenzahl angeben (Format: "1, 11")</report>
		</rule>
	</pattern>
	<pattern id="rs.index">
		<rule context="tei:rs[@type = 'index']">
			<report test="tei:*[not(self::tei:expan or self::tei:hi or self::tei:supplied or self::tei:seg[@type = 'initial'])]" role="warn"><value-of select="$flag"/>Bitte prüfen: innerhalb von Indexreferenzen sind keine weiteren Auszeichnungen erlaubt (Neologismus, Spondiacus, Kursivierung etc. drum herum auszeichnen).</report>
			<!--Freitext an einigen Stellen verboten-->
			<!--analytic/author
			imprint/pubPlace
			imprint/publisher
			item/pubPlace
			note[@type='relatedPersons']
			note[@type='relatedPlaces']
			correspAction
			back//item-->
			<report test="text() and parent::tei:*[self::tei:author[parent::tei:analytic] or self::tei:pubPlace or self::tei:publisher or self::tei:note[@type = 'relatedPersons' or @type = 'relatedPlaces'] or self::tei:item[ancestor::tei:back]]" role="warn"><value-of select="$flag"/>Bitte prüfen: bei Indexreferenzen an dieser Stelle keinen Freitext eingeben, nur ID-Referenz.</report>
			<!--Freitext an einigen Stellen verplichtend-->
			<!--monogr/author
			msItem/author
			seg/rs [Achtung, gibt selten auch seg/hi/rs]-->
			<report test="string(@ref) and not(text()) and (parent::tei:*[self::tei:author[parent::tei:monogr or parent::tei:msItem]] or ancestor::tei:*[self::tei:seg])" role="warn"><value-of select="$flag"/>Bitte prüfen: bei Indexreferenzen an dieser Stelle auch Freitext eingeben (Originalschreibweise).</report>
		</rule>
	</pattern>
	<pattern id="rs.index2">
		<!--In Metadaten: immer Index-Referenzen auf Korrektheit prüfen-->
		<rule context="tei:teiHeader//tei:rs[@type = 'index']">
			<report test="text() and not(string(@ref))" role="error"><value-of select="$flag"/>[Metadaten] Index-ID fehlt.</report>
		</rule>
		<!--In Transkription: erst nach QM-Flag auf Korrektheit prüfen-->
		<rule context="$QMTrans//tei:*[self::tei:body or self::tei:back]//tei:rs[@type = 'index']">
			<report test="text() and not(string(@ref))" role="error"><value-of select="$flag"/>Index-ID fehlt.</report>
		</rule>
	</pattern>
	<pattern id="rsEntryExistsTrans">
		<rule context="tei:*[self::tei:body or self::tei:back]//tei:rs[@type = 'bibl']">
			<let name="id" value="substring-after(@ref, '#')"/>
			<assert test="exists(/tei:TEI//tei:bibl[@xml:id = $id])" role="error"><value-of select="$flag"/>[Transkript] In rs referenzierte ID (<value-of select="@ref"/>) ist in der Bibliographie nicht vergeben (oder # fehlt).</assert>
		</rule>
		<rule context="tei:*[self::tei:body or self::tei:back]//tei:rs[@type = 'index'][string() or string(@ref)]">
			<let name="id" value="substring-after(@ref, '#')"/>
			<assert test="exists(/tei:TEI//tei:item[@xml:id = $id])" role="error"><value-of select="$flag"/>[Transkript] In rs referenzierte ID (<value-of select="@ref"/>) ist im Index nicht vergeben (oder # fehlt).</assert>
		</rule>
	</pattern>
	<pattern id="linkformat">
		<!--Getrennt prüfen Metadaten (immer) und Transkription (erst nach PublTrans)-->
		<rule context="tei:teiHeader//tei:ref">
			<report test="not(@subtype = 'similia') and not(@target)" role="error"><value-of select="$flag"/>[Metadaten] Bei allen ref (außer @subtype='similia') ist @target verpflichtend.</report>
		</rule>
		<rule context="$PublTrans//tei:ref">
			<report test="not(@subtype = 'similia') and not(@target)" role="error"><value-of select="$flag"/>Bei allen ref (außer @subtype='similia') ist @target verpflichtend.</report>
		</rule>
	</pattern>
	<pattern id="linkformat2">
		<rule context="tei:ptr | tei:ref">
			<report test="@target[ends-with(., '.')]" role="error"><value-of select="$flag"/>Fehler im Linkformat (Punkt am Ende gefunden).</report>
			<report test="@target[contains(., ' ')]" role="error"><value-of select="$flag"/>Fehler im Linkformat (Leerzeichen gefunden).</report>
		</rule>
	</pattern>
	<pattern id="ref">
		<rule abstract="true" id="correspNotAllowed">
			<report test="@corresp and not(@subtype = 'similia')" role="error" diagnostics="mJB"><value-of select="$flag"/>@corresp nur bei @subtype=similia erlaubt.</report>
		</rule>
		<rule abstract="true" id="missingCorrespToQuote">
			<report test="/tei:TEI[descendant::tei:change[@type = 'hasSimila']] and @subtype = 'similia' and ancestor::tei:note[tei:q[not(@type = 'similiaOverlap')]] and not(@corresp)" role="warn" diagnostics="mJB"><value-of select="$flag"/>ref[similia] fehlt @corresp zu zugehörigen quotes.</report>
		</rule>
		<rule abstract="true" id="fellowRefDifferentCorresp">
			<let name="corresp" value="@corresp"/>
			<report test="parent::tei:note[tei:ref[@corresp and (@corresp != $corresp)]]" role="warn" diagnostics="mJB"><value-of select="$flag"/>alle ref[similia] innerhalb der Note sollten denselben @corresp-Wert haben.</report>
		</rule>
		<rule abstract="true" id="flagRefToCurrentFile">
			<let name="targetFileName" value="substring-before(@target, '.xml')"/>
			<let name="currentFileName" value="substring-before(tokenize(document-uri(/), '/')[last()], '.xml')"/>
			<report test="$targetFileName = $currentFileName" role="warn" diagnostics="mJB"><value-of select="$flag"/>Ziel befindet sich in derselben Datei -> in @target nur Fragment angeben, nicht die vollständige Ziel-XML.</report>
		</rule>
		<rule abstract="true" id="targetFileExistsXml">
			<let name="targetFile" value="concat(substring-before(@target, '.xml'), '.xml')"/>
			<!--wenn ein target mit einer XML beginnt (nicht mit #), dann prüfen, dass die genannte XML-Datei existiert. Da ein failed document() test die Validierung abbricht, muss der Umweg über eine explizite Liste gegangen werden-->
			<report test="not(matches(@target, '^#')) and not($targetFile = $xmlFileNames)" role="error" diagnostics="mJB"><value-of select="$flag"/>In @target referenzierte XML-Datei (<value-of select="$targetFile"/>) unbekannt.</report>
		</rule>
		<rule abstract="true" id="targetFileExistsHtml">
			<let name="targetFile" value="@target"/>
			<report test="not($targetFile = $htmlFileNames)" role="error" diagnostics="mJB"><value-of select="$flag"/>In @target referenzierte HTML-Datei (<value-of select="$targetFile"/>) unbekannt.</report>
		</rule>
		<rule abstract="true" id="targetFileExistsAssets">
			<let name="targetFile" value="substring-before(@target,'.')"/>
			<report test="not($targetFile = $assetsFileNames)" role="error" diagnostics="mJB"><value-of select="$flag"/>In @target referenzierte Datei (<value-of select="$targetFile"/>) unbekannt.</report>
		</rule>
		<rule abstract="true" id="targetContainsZero">
			<!--in @target #d darf keine Null enthalten (#d04 => #d4) -->
			<report test="matches(@target, '#d0')" role="error" diagnostics="mJB"><value-of select="$flag"/>@target: #d-Wert nicht aufnullen (falsch: #d04 - richtig: #d4)</report>
		</rule>
		<rule abstract="true" id="kurztitelExists">
			<!--Sicherstellen, dass Wert aus sameAs in KT-Liste vergeben ist, weil sonst für das Ref kein Text ausgegeben wird-->
			<let name="kurztitel" value="//tei:div[@xml:id = 'div_quoteTitle']"/>
			<let name="sameAs" value="substring-after(@sameAs, '#')"/>
			<assert test="$kurztitel//tei:item[@xml:id = $sameAs]" role="error" diagnostics="mJB"><value-of select="$flag"/>Kurztitel aus @sameAs (<value-of select="$sameAs"/>) in KT-Liste nicht gefunden.</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][not(@subtype)]">
			<report test="matches(., '\-')" role="error" sqf:fix="replaceMinus"><value-of select="$flag"/>Minus gefunden in Versangabe (statt Bis-Strich) - QUICKFIX [Achtung: muss auch in Word korrigiert werden]</report>
			<!--nur in notes mit <q> prüfen, weil es auch Autorenstellen zum ges. Vers ohne Lem gibt-->
			<extends rule="missingCorrespToQuote"/>
			<extends rule="correspNotAllowed"/>
			<extends rule="fellowRefDifferentCorresp"/>
			<extends rule="flagRefToCurrentFile"/>
			<extends rule="targetFileExistsXml"/>
			<extends rule="kurztitelExists"/>
			<extends rule="targetContainsZero"/>
			<report test="following-sibling::node()[1][self::text() and matches(., '^\s*–')]" role="warn"><value-of select="$flag"/>Trennstrich nach ref gefunden -> Zahl nicht komplett übernommen?</report>
			<report test="following-sibling::node()[1][self::text() and matches(., '^\s*\d')]" role="warn"><value-of select="$flag"/>Zahl nach ref gefunden -> ref nicht komplett?</report>
			<report test="matches(., 'et al')" role="warn"><value-of select="$flag"/>"et al." im ref gefunden -> danach setzen.</report>
			<report test="matches(., '[IVX]')" role="warn"><value-of select="$flag"/>röm. Zahl im ref gefunden -> vmtl. löschen.</report>
		</rule>
		<rule context="tei:ref[@type = 'internal'][@subtype = 'download']">
			<extends rule="correspNotAllowed"/>
			<extends rule="targetFileExistsAssets"/>
		</rule>
		<!--<rule context="tei:ref[@type = 'internal'][@subtype = 'html']">
			<extends rule="correspNotAllowed"/>
			<extends rule="targetFileExistsHtml"/>
		</rule>-->
		<rule context="tei:ref[@type = 'external']">
			<extends rule="missingCorrespToQuote"/>
			<extends rule="correspNotAllowed"/>
			<extends rule="fellowRefDifferentCorresp"/>
		</rule>
		<rule context="tei:ref[not(@*)]">
			<!--Manuell von SW gesetzte temporäre ref werden (erst) im QM-Trans-Skript kodiert -> deshalb warnen, falls diese in Metadaten auftreten -> dann muss ausnahmsweise manuell kodiert werden-->
			<report test="ancestor::tei:teiHeader" role="error" diagnostics="mJB"><value-of select="$flag"/>Ref muss ausnahmsweise manuell kodiert werden.</report>
		</rule>
	</pattern>
	<pattern id="ref.structure">
		<!--Ref-Varianten prüfen:
		- type=external, no subtype, target, no corresp, no sameAs
		- type=external, subtype=di, target, no corresp, no sameAs
		- type=external, subtype=digitalCopy, target, no corresp, no sameAs
		- type=external, subtype=similia, no target, [corresp], no sameAs
		- type=internal, no subtype, target, no corresp, sameAs
		- type=internal, subtype=similia, target, [corresp], sameAs
		- type=internal, subtype=html, target, no corresp, no sameAs
		-->
		<rule context="tei:ref[@type = 'external'][not(@subtype)]">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (external, target, !corresp, sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'di']">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (external, target, !corresp, !sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'doi']">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (external, target, !corresp, !sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'digitalCopy']">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (external, target, !corresp, !sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']">
			<!--Eigentlich sollte es auch @corresp geben, ist aber noch nicht überall möglich, deshalb in Warnung rauslassen-->
			<assert test="not(@target) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (external, !target, [corresp], !sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][not(@subtype)]">
			<assert test="@target and not(@corresp) and @sameAs" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (internal, target, !corresp, sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][@subtype='retainContent']">
			<assert test="@target and not(@corresp) and @sameAs" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (internal, target, !corresp, sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][@subtype = 'similia']">
			<!--Eigentlich sollte es auch @corresp geben, ist aber noch nicht überall möglich, deshalb in Warnung rauslassen-->
			<assert test="@target and @sameAs" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (internal, target, [corresp], sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][@subtype = 'html']">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (internal, target, !corresp, !sameAs)</assert>
		</rule>
		<rule context="tei:ref[@type = 'internal'][@subtype = 'download']">
			<assert test="@target and not(@corresp) and not(@sameAs)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler in Ref-Attributkombination (internal, target, !corresp, !sameAs)</assert>
		</rule>
		<rule context="tei:ref">
			<report test="@* or not(@*)" role="error" diagnostics="mJB"><value-of select="$flag"/>Fallback-Prüfung: Fehler Ref-Attributkombinationen</report>
		</rule>
	</pattern>
	<pattern id="ref.internal.text">
		<rule context="tei:ref[@type = 'internal']">
			<report test="matches(., '^\s')" role="warn"><value-of select="$flag"/>ref[internal] sollte nicht mit Spatium beginnen</report>
			<report test="matches(., '\s$')" role="warn"><value-of select="$flag"/>ref[internal] sollte nicht mit Spatium enden</report>
			<report test="matches(., '^\.\s+\d')" role="warn"><value-of select="$flag"/>ref[internal] Spatium zwischen Punkt und Zahl löschen</report>
		</rule>
	</pattern>
	<pattern id="pubPlace">
		<rule context="tei:pubPlace">
			<report test="ancestor::tei:publicationStmt and not(matches(., '^Wuppertal$'))" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler im Publikationsort.</report>
		</rule>
	</pattern>
	<pattern id="publicationStmt.date">
		<rule context="tei:publicationStmt/tei:date">
			<assert test="matches(., '^2026$')" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler im Publikationsdatum (muss 2026 sein).</assert>
		</rule>
	</pattern>
	<pattern id="hi">
		<!--<rule context="tei:hi">
			<report test="tei:hi and not(ancestor::tei:div[@type = 'quoteTitle'] or ancestor::tei:list[contains(@xml:id, 'similia')])" role="warn" diagnostics="mJB"><value-of select="$flag"/>Hi in Hi nicht erlaubt (außer in Kurztitelliste und Lists).</report>
			<report test="@rend = 'bold' and not(ancestor::tei:div[@subtype = 'introduction_editorial'])" role="error"><value-of select="$flag"/>'bold' nur in der Sacheinführung erlaubt.</report>
		</rule>-->
		<rule context="tei:hi">
			<let name="rend" value="@rend"/>
			<report test="tei:hi[@rend = $rend]" role="warn"><value-of select="$flag"/>hi in hi geschachtelt mit demselben @rend-Wert.</report>
			<report test="descendant::tei:hi[descendant::tei:hi]" role="warn"><value-of select="$flag"/>hi dreifach geschachtelt; maximal zweifach erlaubt, wenn nötig</report>
			<report test="matches(., '^\s')" role="warn">Hi beginnt mit Spatium -> davor kodieren.</report>
			<report test="matches(., '\s$')" role="warn">Hi endet mit Spatium -> danach kodieren.</report>
		</rule>
	</pattern>
	<!--Sonstige Textprüfungen-->
	<pattern id="supplied">
		<rule context="$PublTrans//tei:supplied">
			<report test="matches(., '\.\.+|…')" role="warn" diagnostics="mJB"><value-of select="$flag"/>(Auslassungs)Punkte in supplied gefunden -> ist eigentlich unclear gemeint?</report>
			<report test="tei:*" role="warn"><value-of select="$flag"/>In ed. Hinzufügung keine weitere ed. Auszeichnung erlaubt/sinnvoll (Ausnahme: Il.parv.Quint.1-14)</report>
		</rule>
	</pattern>
	<pattern id="seg.milestone">
		<!--Noch nicht ganz sauber, eigentlich müssten noch die @n-Werte verglichen werden und sichergestellt sein, dass es Milestones im lat. UND gr. gibt (sofern vorhanden) -> in 2. Phase verfeinern-->
		<rule context="tei:seg[@xml:lang[contains(., 'grc')]][tei:milestone]">
			<let name="n" value="tei:milestone/@n"/>
			<assert test="parent::tei:l[tei:seg[@xml:lang = 'de'][tei:milestone]]" role="error"><value-of select="$flag"/>Zum gr. Milestone ("<value-of select="$n"/>") kein Äquivalent im dt. Text gefunden</assert>
		</rule>
		<rule context="tei:seg[@xml:lang[contains(., 'cs')]][tei:milestone]">
			<let name="n" value="tei:milestone/@n"/>
			<assert test="parent::tei:l[tei:seg[@xml:lang = 'de'][tei:milestone]]" role="error"><value-of select="$flag"/>Zum cs. Milestone ("<value-of select="$n"/>") kein Äquivalent im dt. Text gefunden</assert>
		</rule>
		<rule context="tei:seg[@xml:lang = 'de'][tei:milestone]">
			<let name="n" value="tei:milestone/@n"/>
			<assert test="parent::tei:l[tei:seg[@xml:lang[contains(., 'grc') or contains(., 'cs')]][tei:milestone]]" role="error"><value-of select="$flag"/>Zum Milestone ("<value-of select="$n"/>") kein Äquivalent im grc./cs. Text gefunden</assert>
		</rule>
	</pattern>
	<pattern id="milestone">
		<rule context="tei:milestone">
			<report test="following-sibling::node()[1][self::text() and matches(., '^\s')]" role="warn"><value-of select="$flag"/>Kein Spatium nach Milestone setzen.</report>
			<assert test="ancestor::tei:ab" role="error"><value-of select="$flag"/>Milestone nur in 'ab' (Prosa) erlaubt (nicht in Gedicht, Head etc.).</assert>
		</rule>
	</pattern>
	<pattern id="lb">
		<rule context="tei:lb">
			<assert test="ancestor::tei:p" role="error"><value-of select="$flag"/>lb nur in 'p' erlaubt.</assert>
		</rule>
	</pattern>
	<pattern id="category">
		<rule context="tei:taxonomy">
			<assert test="tei:category[@n = 'hexameter_type' and @xml:id = 'spondaicGrc']" role="error"><value-of select="$flag"/>category(spondaicGrc) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'hexameter_type' and @xml:id = 'spondaicLat']" role="error"><value-of select="$flag"/>category(spondaicLat) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'verse_structure' and @xml:id = 'versusTetracoli4Grc']" role="error"><value-of select="$flag"/>category(versusTetracoli4Grc) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'verse_structure' and @xml:id = 'versusTetracoli5Grc']" role="error"><value-of select="$flag"/>category(versusTetracoli5Grc) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'verse_structure' and @xml:id = 'versusTetracoliLat']" role="error"><value-of select="$flag"/>category(versusTetracoliLat) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'TH']" role="error"><value-of select="$flag"/>category(TH) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'PH']" role="error"><value-of select="$flag"/>category(PH) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'HH']" role="error"><value-of select="$flag"/>category(HH) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'BD']" role="error"><value-of select="$flag"/>category(BD) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'KTT']" role="error"><value-of select="$flag"/>category(KTT) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'MZ']" role="error"><value-of select="$flag"/>category(MZ) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'caesura' and @xml:id = 'na']" role="error"><value-of select="$flag"/>category(na) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'syllable_length' and @xml:id = 'monosyllabumGrc']" role="error"><value-of select="$flag"/>category(monosyllabumGrc) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'syllable_length' and @xml:id = 'monosyllabumLat']" role="error"><value-of select="$flag"/>category(monosyllabumLat) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'meter' and @xml:id = 'hex']" role="error"><value-of select="$flag"/>category(hex) fehlt oder falsches @n</assert>
			<assert test="tei:category[@n = 'meter' and @xml:id = 'prose']" role="error"><value-of select="$flag"/>category(prose) fehlt oder falsches @n</assert>
		</rule>
	</pattern>
	<pattern id="potentialVersusTetracoli">
		<!--Einheiten, die schon VersusTetracoli-Flag haben ausschließen-->
		<rule context="tei:TEI[not(descendant::tei:change[@type = 'hasVersusTetracoli'])]//tei:lg//tei:seg[@type = 'mainText' or @type = 'translationOfMainText'][not(@xml:lang = ('de', 'cs', 'la'))][not(@function)][not(@met = 'prose')][not(ancestor::tei:l[@ana[contains(., '#versusTetracoli')]])]">
			<let name="string" value="normalize-space(string-join(descendant::text()[not(parent::tei:reg or parent::tei:distinct)], ''))"/>
			<report test="count(tokenize(normalize-space($string), '\s+')) = 4" role="info">potentiell versus tetracoli</report>
		</rule>
	</pattern>
	<pattern id="versusTetracoli">
		<rule context="tei:l[matches(@ana, '#versusTetracoli[45]Grc')]">
			<assert test="matches(@ana, '#versusTetracoli4Grc') or matches(@ana, '#versusTetracoli5Grc')" role="error" diagnostics="mJB"><value-of select="$flag"/>versusTetracoli im Gr. muss ausdifferenziert werden in 4 oder 5</assert>
		</rule>
	</pattern>
	<pattern id="versusTetracoliRNG">
		<rule context="tei:seg[@potentialVersusTetracoli]">
			<report test="contains(@xml:lang, 'grc') and parent::tei:l[matches(@ana, 'versusTetracoli[4|5]Grc')]" role="error" diagnostics="mJB"><value-of select="$flag"/>Für JB: @potentialVersusTetracoli [Gr.] löschen, da bereits in l/@ana kodiert.</report>
		</rule>
	</pattern>
	<pattern id="hash">
		<!--Bei allen Attributen, die # erwarten, prüfen: 
		a) Hash vorhanden
		b) Doppelte Hash melden
		-->
		<!--Achtung: nach QMTrans alles prüfen, sonst nur Meta (weil die Hash erst in der QM gesetzt werden)-->
		<rule context="$QMTrans//tei:*/@*[local-name() = 'ana' or local-name() = 'corresp' or local-name() = 'next' or local-name() = 'prev' or local-name() = 'ref' or local-name() = 'target' or local-name() = 'who' or local-name() = 'sameAs' or local-name() = 'resp']">
			<report test="string() and not(matches(., '(http|na)')) and not(matches(., '#'))" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>In diesem Attribut wird ein Hash (#) erwartet [oder 'http...|na'].</report>
			<report test="string() and matches(., '##')" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>Doppelten Hash gefunden (##).</report>
		</rule>
	</pattern>
	<pattern id="metadataMetrics">
		<rule context="tei:list[@xml:id = 'metadataMetrics']">
			<assert test="tei:item[@type = 'metVerse']" role="error"><value-of select="$flag"/>item[metVerse] fehlt.</assert>
			<assert test="tei:list[@n]" role="error"><value-of select="$flag"/>list[@n=metricsListGrc] fehlt.</assert>
			<report test="tei:item[@type[not(matches(., 'metVerse'))]]" role="error"><value-of select="$flag"/>Direkt in metadata-list nur item[metVerse] erlaubt, alle anderen Angaben in list[metricsListGrc] schachteln</report>
		</rule>
	</pattern>
	<!--..........................................-->
	<!--Spezielle Regeln für die Register-->
	<!--..........................................-->
	<pattern id="bibl.att.id">
		<rule context="tei:bibl">
			<report test="contains(@xml:id, '/')" role="error"><value-of select="$flag"/>Mehrere Autoren in der ID durch "_" trennen, nicht durch "/".</report>
			<report test="matches(@xml:id, '[äöüß\(\)]')" role="error"><value-of select="$flag"/>In der ID keine Umlaute, Klammern etc. verwenden.</report>
			<report test="matches(@xml:id, '[A-Z]')" role="error"><value-of select="$flag"/>In der ID keine Großbuchstaben verwenden.</report>
			<report test="matches(tei:expan, '#')" role="error"><value-of select="$flag"/>In der bibl. Angabe fehlen noch Angaben ("#" gefunden).</report>
		</rule>
	</pattern>
	<pattern id="expan">
		<rule context="tei:TEI[@xml:id = 'bibliography']//tei:expan">
			<assert test="ends-with(., '.')" role="warn"><value-of select="$flag"/>Bitte prüfen: Vollständige Bibl. Angabe mit Punkt beenden.</assert>
			<report test="tei:*" role="error"><value-of select="$flag"/>In vollst. Bibl.Ang. (expan) nur Text erlaubt.</report>
		</rule>
	</pattern>
	<pattern id="abbr">
		<rule context="tei:abbr">
			<report test="ancestor::tei:TEI[@xml:id = 'bibliography'] and not(tei:name and tei:date)" role="error"><value-of select="$flag"/>In abbr in Bibliographie müssen name und date gegeben sein.</report>
			<report test="ancestor::tei:TEI[@xml:id = 'lists'] and not(@n)" role="error"><value-of select="$flag"/>In abbr in Lists muss @n gegeben sein.</report>
			<report test="ancestor::tei:TEI[@xml:id = 'lists'] and not(string(@n))" role="error"><value-of select="$flag"/>@n ist leer (abbr in Lists).</report>
			<report test="@n and not(ancestor::tei:TEI[@xml:id = 'lists'])" role="error"><value-of select="$flag"/>@n nur bei abbr in Lists erlaubt.</report>
		</rule>
	</pattern>
	<pattern id="gnd">
		<rule context="tei:seg[@type = 'gnd'][text()]">
			<assert test="matches(., '^[0-9A-Z-]*$')" role="error"><value-of select="$flag"/>Fehler im GND-Format (nur Zahlen, Buchstaben oder Trennstrich verwenden; keine Leerzeichen, Fragezeichen etc.).</assert>
		</rule>
	</pattern>
	<pattern id="itemRegister">
		<rule context="tei:item">
			<let name="id" value="@xml:id"/>
			<!--<report test="not(ancestor::tei:seg[@type = 'references'] or ancestor::tei:TEI[@xml:id = 'lists'] or ancestor::tei:TEI[@xml:id = 'quoteInternal'] or ancestor::tei:div[@type = 'listIndexReferences']) and not(string(@type) and string(@subtype))" role="error">Type oder Subtype fehlen in item.</report>-->
			<report test="matches(@xml:id, '[äöüß\(\)]')" role="error"><value-of select="$flag"/>In der ID keine Umlaute, Klammern etc. verwenden.</report>
			<report test="@type = 'person' and @subtype = 'none' and not(matches(@xml:id, 'inder|mauren'))" role="error"><value-of select="$flag"/>Bei Personen den @subtype präzise angeben, "none (NA)" ist nicht erlaubt. [Einzige Ausnahme "inder|mauren"]</report>
			<report test="(@type = 'place' or @type = 'subject') and not(@subtype = 'none')" role="error"><value-of select="$flag"/>Bei Geographica/Sachverhalt nur @subtype=none ("NA") erlaubt.</report>
			<!--Inder-Ausnahme erstmal als Workaround, weil noch keine generische Vorgabe für Volksgruppen (da zeitlich schwer/unmöglich einzuordnen)-->
			<report test="count(/tei:TEI//tei:item[@xml:id = $id]) &gt; 1" role="error"><value-of select="$flag"/>ID (<value-of select="$id"/>) mehrmals vergeben.</report>
		</rule>
	</pattern>
	<pattern id="segRegister">
		<rule context="tei:seg[@type = 'label'][not(ancestor::tei:seg[@type = 'references'])]">
			<assert test="string()"><value-of select="$flag"/>Label darf nicht leer sein.</assert>
		</rule>
		<rule context="tei:seg[@type = 'label'][ancestor::tei:seg[@type = 'references']]">
			<assert test="string(@sameAs)"><value-of select="$flag"/>Kurztitel fehlt.</assert>
		</rule>
		<rule context="tei:seg[@type = 'desc']">
			<report test="matches(text(), '\-\d')" role="warn" sqf:fix="replaceMinus"><value-of select="$flag"/>Minus gefunden zwischen Zahlen, z.B. Lebensdaten (sollte ein Bis-Strich sein) - QUICKFIX</report>
		</rule>
	</pattern>
	<pattern id="num">
		<rule context="tei:num">
			<assert test="string()"><value-of select="$flag"/>Num darf nicht leer sein.</assert>
		</rule>
	</pattern>
	<pattern id="ptr">
		<rule context="tei:ptr">
			<report test="not(ancestor::tei:TEI[@xml:id = 'lists']) and (string() or tei:*)" role="error"><value-of select="$flag"/>Ptr muss immer leer sein (außer in Lists).</report>
			<report test="ancestor::tei:TEI[@xml:id = 'lists'] and tei:*[not(self::tei:quote)]" role="error"><value-of select="$flag"/>In ptr in Lists nur quote erlaubt.</report>
			<report test="not(ancestor::tei:list[@xml:id = 'sources']) and @type = 'external'" role="error"><value-of select="$flag"/>Bei ptr nur @type='verse' erlaubt (nicht 'external'; außer in list[sources]).</report>
			<report test="ancestor::tei:list[@xml:id = 'sources'] and not(@type = 'external')" role="error"><value-of select="$flag"/>Bei ptr innerhalb von list[sources] nur @type='external' erlaubt (nicht 'verse').</report>
			<report test="@n and not(ancestor::tei:TEI[@xml:id = 'fulltextIndex'])" role="error"><value-of select="$flag"/>Ptr/@n nur im Vollwortindex erlaubt.</report>
			<report test="@n = ''" role="error"><value-of select="$flag"/>Ptr/@n leer.</report>
		</rule>
	</pattern>
	<!--Register ENDE-->
	<!--..........................................-->
	<!--Spezielle Regeln für Similienanmerkungen nach automatisierte Auszeichnung der Autorenstellen-->
	<!--..........................................-->
	<!--dupliziert(!) aus scripts/SimiliaNote/similia.sch -->
	<pattern id="refSeg">
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external'][@subtype = 'similia']">
			<assert test="tei:seg[@type = 'simQualifier']" role="error" diagnostics="mJB"><value-of select="$flag"/>seg[simQualifier] fehlt</assert>
			<assert test="tei:seg[@type = 'simNumber']" role="error" diagnostics="mJB"><value-of select="$flag"/>seg[simNumber] fehlt</assert>
			<assert test="(tei:seg[@type = 'simAuthor'] and tei:seg[@type = 'simTitle']) or tei:seg[@type = 'simAuthorSingle'] or tei:seg[@type = 'simTitleSingle']" role="error" diagnostics="mJB"><value-of select="$flag"/>einer von seg[author|title|Single] fehlt/ist zu viel</assert>
			<report test="tei:seg[@type = 'simAuthorSingle' or @type = 'simTitleSingle'] and tei:seg[@type = 'simAuth' or @type = 'simTitle']" role="error" diagnostics="mJB"><value-of select="$flag"/>title|auth gleichzeitig mit titleSingle|authSingle gefunden.</report>
			<report test="tei:seg[@type = 'simNumber' and not(preceding-sibling::tei:seg[text()]) and matches(., '^ ')] and preceding-sibling::node()[1][matches(., ';$')]" role="warn" diagnostics="mJB"><value-of select="$flag"/>seg[simNumber] beginnt mit Spatium, vorangehende seg sind leer, und dem ref vorangehend ist kein Spatium. workbench/jennifer/cleanupWhitespaceBetweenRefSim.xsl anwenden. </report>
		</rule>
	</pattern>
	<pattern id="segN">
		<rule context="$PublTrans//tei:note[@type = 'similia']/tei:ref[@subtype = 'similia']">
			<report test="tei:seg[@type = 'simQualifier']/@n[not(string(.))]"><value-of select="$flag"/>Bitte Qualifier auswählen.</report>
			<report test="tei:seg[not(@type = 'simQualifier')]/@n[not(string(.))]" diagnostics="mJB"><value-of select="$flag"/>Leeres @n</report>
		</rule>
	</pattern>
	<pattern id="simNumberAllowedCharacters">
		<rule context="tei:seg[@type = 'simNumber'][matches(@n, '\d+[a-z]')]">
			<report test="matches(@n, '[^a-z–\d,sq\.PGα-ω\s+_]') and not(preceding-sibling::tei:seg[@type = 'simTitle'][@n = 'Mor.'])" role="warn" diagnostics="mJB"><value-of select="$flag"/>Unerlaubtes Zeichen gefunden in seg[@type='simNumber'].</report>
		</rule>
		<rule context="tei:seg[@type = 'simNumber'][not(matches(@n, '\d+[a-z]') or matches(@n, 'undefined'))]">
			<report test="matches(@n, '[^–\d,sq\.PGα-ω\s+_]') and not(preceding-sibling::tei:seg[@type = 'simTitle'][@n = 'Mor.'])" role="warn" diagnostics="mJB"><value-of select="$flag"/>Unerlaubtes Zeichen gefunden in seg[@type='simNumber'].</report>
		</rule>
	</pattern>
	<pattern id="segNExists">
		<rule context="tei:ref[@subtype = 'similia']/tei:seg">
			<assert test="@n" role="error"><value-of select="$flag"/>In ref[simila] fehlt @n.</assert>
		</rule>
	</pattern>
	<pattern id="simQualifierValues">
		<rule context="tei:seg[@type = 'simQualifier'][string(@n)]">
			<let name="values" value="$simQualifier"/>
			<assert test="@n = $values" role="error" diagnostics="mJB"><value-of select="$flag"/>Unerlaubter Wert im Qualifier.</assert>
		</rule>
	</pattern>
	<pattern id="refAstroQualifier">
		<rule context="tei:TEI[descendant::tei:change[@type = 'hasSimila']]//tei:note[@type = 'similia']/tei:ref[@type = 'internal']">
			<assert test="tei:seg[@type = 'simQualifier']" role="error" diagnostics="mJB"><value-of select="$flag"/>In Astroreferenz fehlt Element für den Qualifier.</assert>
			<report test="tei:seg[@type = 'simQualifier']/text()" role="error" diagnostics="mJB"><value-of select="$flag"/>Qualifier in Astroreferenz immer leer lassen (nur @n angeben).</report>
			<assert test="@subtype = 'similia'" role="error"><value-of select="$flag"/>In Astroreferenz fehlt @subtype='similia'.</assert>
		</rule>
	</pattern>
	<pattern id="simSegText">
		<!--Falls Editor nachträglich Änderungen im Text vornimmt, sicherstellen, dass auch die Attributwerte entsprechend geändert werden-->
		<!--Achtung: Zahlen nicht prüfbar-->
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external']/tei:seg[@type = 'simTitle' or @type = 'simTitleSingle'][tei:hi][string()]">
			<let name="att" value="@n"/>
			<let name="text" value="normalize-space(string-join(descendant::text(), ''))"/>
			<!--descendant-text verwenden für Titel, weil es mixed content geben kann, z.B. "2 <hi>Sam.</hi>"-->
			<assert test="$att = $text" role="warn" diagnostics="mJB"><value-of select="$flag"/>Attributwert (<value-of select="$att"/>) und Textinhalt (<value-of select="$text"/>) (in hi) stimmen möglicherweise nicht überein.</assert>
		</rule>
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external']/tei:seg[@type = 'simAuthor' or @type = 'simAuthorSingle' or @type = 'simTitle' or @type = 'simTitleSingle'][string()]">
			<let name="att" value="@n"/>
			<let name="text" value="normalize-space(.)"/>
			<assert test="$att = $text" role="warn" diagnostics="mJB"><value-of select="$flag"/>Attributwert (<value-of select="$att"/>) und Textinhalt (<value-of select="$text"/>) stimmen möglicherweise nicht überein.</assert>
		</rule>
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external']/tei:seg[@type = 'simQualifier'][@n = 'de_re_cf' or @n = 'cf'][string()]">
			<let name="att" value="concat(replace(@n, '_', ' '), '.')"/>
			<let name="text" value="normalize-space(.)"/>
			<assert test="$att = $text" role="warn" diagnostics="mJB"><value-of select="$flag"/>Attributwert (<value-of select="$att"/>) und Textinhalt (<value-of select="$text"/>) (in Qualifier [de re cf./cf.]) stimmen möglicherweise nicht überein.</assert>
		</rule>
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external']/tei:seg[@type = 'simQualifier'][@n = 'sim'][string()]">
			<let name="att" value="replace(@n, 'sim', '~')"/>
			<let name="text" value="normalize-space(.)"/>
			<assert test="$att = $text" role="warn" diagnostics="mJB"><value-of select="$flag"/>Attributwert (<value-of select="$att"/>) und Textinhalt (<value-of select="$text"/>) (in Qualifier [sim]) stimmen möglicherweise nicht überein.</assert>
		</rule>
		<rule context="tei:note[@type = 'similia']/tei:ref[@type = 'external']/tei:seg[@type = 'simQualifier'][@n = 'eq'][string()]">
			<let name="att" value="replace(@n, 'eq', '=')"/>
			<let name="text" value="normalize-space(.)"/>
			<assert test="$att = $text" role="warn" diagnostics="mJB"><value-of select="$flag"/>Attributwert (<value-of select="$att"/>) und Textinhalt (<value-of select="$text"/>) (in Qualifier [eq]) stimmen möglicherweise nicht überein.</assert>
		</rule>
	</pattern>
	<pattern id="simCert">
		<rule context="tei:*[@cert[not(matches(@cert, 'low'))]]">
			<report test="@cert" role="error" diagnostics="mEName mJB"><value-of select="$flag"/>Fehlermeldung "<value-of select="@cert"/>" gefunden.</report>
		</rule>
	</pattern>
	<pattern id="simQuoteMissing">
		<rule context="/tei:TEI[descendant::tei:change[@type = 'hasSimila']]//tei:note[@type = 'similia'][not(matches(., ' nl\.'))][tei:q and tei:ref]">
			<!--vmtl. doppelt, weil das schon über @cert reinkommt, aber zur Sicherheit, falls das nicht geklappt hat-->
			<!--Achtung: potentiell unsauber bei mehreren IDs in @corresp-->
			<!--QMTrans-Flag-Einschränkung, damit Warnung erst kommt, wenn Einheit bereit ist für QM (eigentlich erst NACH 1. QM, aber das geht nicht)-->
			<!--Neologismen-Notes rausnehmen, weil die zwar q haben, aber keine Auszeichnung im Haupttext brauchen ("nl.")-->
			<!--notes mit q aber ohne ref auch rausnehmen (ist selten, aber kommt vor)-->
			<let name="corresp" value="tokenize(substring-after(@corresp, '#'))[1]"/>
			<assert test="/tei:TEI//tei:l[@xml:id = $corresp][descendant::tei:quote]" role="warn" diagnostics="mJB"><value-of select="$flag"/>q kodiert in Similienanm., aber kein quote in zugehörigem Vers.</assert>
		</rule>
	</pattern>
	<pattern id="simQuoteMissingSibling">
		<rule abstract="true" id="quoteMissingSibling">
			<let name="id" value="substring-before(@xml:id, '.')"/>
			<!--(nur generische ID, ohne Versnummer, weil die unterschiedlich sein kann)-->
			<assert test="exists(/tei:TEI//tei:quote[@subtype = $typeSibling][substring-before(@xml:id, '.') = $id])" role="error" diagnostics="mJB"><value-of select="$flag"/>Zu quote[subtype='<value-of select="$typeCurrent"/>'] kein quote[subtype='<value-of select="$typeSibling"/>'] mit gleicher ID gefunden.</assert>
		</rule>
		<rule context="tei:quote[@subtype = 'fragmentedEnd']">
			<let name="typeCurrent" value="'fragmentedEnd'"/>
			<let name="typeSibling" value="'fragmentedStart'"/>
			<extends rule="quoteMissingSibling"/>
		</rule>
		<rule context="tei:quote[@subtype = 'fragmentedStart']">
			<let name="typeCurrent" value="'fragmentedStart'"/>
			<let name="typeSibling" value="'fragmentedEnd'"/>
			<extends rule="quoteMissingSibling"/>
		</rule>
		<rule context="tei:quote[@subtype = 'rangeStart']">
			<let name="typeCurrent" value="'rangeStart'"/>
			<let name="typeSibling" value="'rangeEnd'"/>
			<extends rule="quoteMissingSibling"/>
		</rule>
		<rule context="tei:quote[@subtype = 'rangeEnd']">
			<let name="typeCurrent" value="'rangeEnd'"/>
			<let name="typeSibling" value="'rangeStart'"/>
			<extends rule="quoteMissingSibling"/>
		</rule>
		<!--Middle nicht nötig, weil wenn entweder der zugehörige Start oder End fehlt, wird das über die vorherigen Tests bereits ermittelt-->
	</pattern>
	<pattern id="simNextPrevExists">
		<rule abstract="true" id="nextPrevExists">
			<let name="self" value="name()"/>
			<let name="id" value="substring-after(., '#')"/>
			<assert test="/tei:TEI//tei:quote[@xml:id = $id]" role="error" diagnostics="mJB"><value-of select="$flag"/>Ziel-ID aus @<value-of select="$self"/> (<value-of select="$id"/>) nicht gefunden.</assert>
		</rule>
		<rule context="tei:quote/@next">
			<extends rule="nextPrevExists"/>
		</rule>
		<rule context="tei:quote/@prev">
			<extends rule="nextPrevExists"/>
		</rule>
	</pattern>
	<pattern id="simNextPrevIDFormat">
		<rule abstract="true" id="attFormat">
			<let name="selfName" value="name()"/>
			<let name="selfVal" value="."/>
			<assert test="$selfVal[matches(., '#?q_d\d+e\d+\.\d+-[sme]')]" role="error" diagnostics="mJB"><value-of select="$flag"/>Fehler im quote/@<value-of select="$selfName"/>-Format (<value-of select="$selfVal"/>).</assert>
		</rule>
		<rule context="tei:quote[not(@subtype = 'complete')]/@xml:id">
			<extends rule="attFormat"/>
		</rule>
		<rule context="tei:quote/@next">
			<extends rule="attFormat"/>
		</rule>
		<rule context="tei:quote/@prev">
			<extends rule="attFormat"/>
		</rule>
	</pattern>
	<pattern id="quote">
		<rule context="tei:quote">
			<let name="id" value="@xml:id"/>
			<!--
				fragmented = enthält "..." oder "…"
				range = enthält "-" oder "—" oder "/"
			-->
			<report test="@subtype[contains(., 'range') or contains(., 'fragmented')] and not(@next or @prev)" role="error" diagnostics="mJB"><value-of select="$flag"/>Bei quote[range/fragmented] muss min. einer von @next/@prev stehen.</report>
			<report test="not(ancestor::tei:TEI[@xml:id = 'lists']) and not(@type and @xml:id and @subtype)"><value-of select="$flag"/>Bei quote müssen immer @type, @xml:id und @subtype gegeben sein (außer in Lists).</report>
			<report test="ancestor::tei:TEI[@xml:id = 'lists'] and tei:*"><value-of select="$flag"/>Bei quote in Lists ist nur Text erlaubt.</report>
			<!--<report test="node()[last()][matches(., '\s+$')]" role="warn" diagnostics="mJB mEName">Spatium am Ende gefunden.</report>-->
			<report test="@subtype[contains(., 'fragmented')] and /tei:TEI//tei:note[tei:q][tei:ref[@corresp[contains(., $id)]]]/tei:q[matches(., '\-|—')]" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>quote(fragmented) ausgezeichnet, aber im q ein "-|—" gefunden -> range? (<value-of select="$id"/>)</report>
			<report test="@subtype[contains(., 'fragmented')] and not(/tei:TEI//tei:note[tei:q][tei:ref[@corresp[contains(., $id)]]]/tei:q[matches(., '…|\.{3}')])" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>quote(fragmented) ausgezeichnet, aber im q kein "…|..." gefunden (<value-of select="$id"/>)</report>
			<report test="@subtype[contains(., 'range')] and /tei:TEI//tei:note[tei:q][tei:ref[@corresp[contains(., $id)]]]/tei:q[matches(., '…|\.{3}')]" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>quote(range) ausgezeichnet, aber im q ein "…|..." gefunden -> fragmented? (<value-of select="$id"/>)</report>
			<report test="@subtype[contains(., 'range')] and not(/tei:TEI//tei:note[tei:q][tei:ref[@corresp[contains(., $id)]]]/tei:q[matches(., '\-|/|—')])" role="warn" diagnostics="mJB mEName"><value-of select="$flag"/>quote(range) ausgezeichnet, aber im q kein "-|—" gefunden (<value-of select="$id"/> [Ausnahme, wenn kein q vorhanden und ganzer Vers gemeint])</report>
		</rule>
	</pattern>
	<pattern id="simQuoteComplete">
		<rule context="tei:quote[@subtype = 'complete']">
			<report test="@next" role="error"><value-of select="$flag"/>@next bei quote[complete] nicht erlaubt.</report>
			<report test="@prev" role="error"><value-of select="$flag"/>@prev bei quote[complete] nicht erlaubt.</report>
			<assert test="matches(@xml:id, '^q_[a-z0-9]+$')" role="error"><value-of select="$flag"/>Fehler im Format der @xml:id bei quote[complete] (keine Verszahl und/oder -s/-e erlaubt)</assert>
		</rule>
	</pattern>
	<pattern id="refQuoteCorrespExists">
		<rule context="tei:ref[@subtype = 'similia']">
			<assert test="
					every $corresp in tokenize(@corresp, ' ')
						satisfies exists(key('k-quoteIDHash', $corresp))" role="error" diagnostics="mJB"><value-of select="$flag"/>Min. eine in @corresp referenzierte Quote-ID kann nicht gefunden werden.</assert>
		</rule>
		<rule context="tei:quote[@type = 'similia']">
			<let name="idHash" value="'#' || @xml:id"/>
			<assert test="/tei:TEI//tei:ref[@subtype = 'similia'][contains(@corresp, $idHash)]" role="warn" diagnostics="mJB"><value-of select="$flag"/>quote/@xml:id in keinem ref/@corresp referenziert.</assert>
		</rule>
	</pattern>
	<pattern id="quoteNesting">
		<rule context="tei:quote/tei:quote[@type = 'similia']">
			<let name="idHash" value="'#' || @xml:id"/>
			<assert test="/tei:TEI//tei:note[tei:ref[@subtype = 'similia'][contains(@corresp, $idHash)]]/tei:q[@subtype = 'nesting']" role="warn" diagnostics="mJB"><value-of select="$flag"/>Geschachteltes quote, aber in zugehöriger note/q nicht @subtype='nesting' gesetzt. (<value-of select="$idHash"/>)</assert>
		</rule>
	</pattern>
	<pattern id="fileAutorenstellenAbgleich-N">
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia'][tei:seg[@type = 'simAuthorSingle']]">
			<let name="n" value="tei:seg[@type = 'simAuthorSingle']/@n"/>
			<assert test="$listAuthorSingle/tei:item/tei:seg[@type = 'simAuthorSingle'][@n = $n]" role="error" diagnostics="mJB"><value-of select="$flag"/>Wert in simAuthorSingle/@n (<value-of select="$n"/>) kann in Referenzliste nicht gefunden werden.</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia'][tei:seg[@type = 'simTitleSingle']]">
			<let name="n" value="tei:seg[@type = 'simTitleSingle']/@n"/>
			<assert test="$listTitleSingle/tei:item/tei:seg[@type = 'simTitleSingle'][@n = $n]" role="error" diagnostics="mJB"><value-of select="$flag"/>Wert in simTitleSingle/@n (<value-of select="$n"/>) kann in Referenzliste nicht gefunden werden.</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia'][tei:seg[@type = 'simAuthor'] and tei:seg[@type = 'simTitle']]">
			<let name="nAuthor" value="tei:seg[@type = 'simAuthor']/@n"/>
			<let name="nTitle" value="tei:seg[@type = 'simTitle']/@n"/>
			<assert test="$listAuthorTitle/tei:item[tei:seg[@type = 'simAuthor'][@n = $nAuthor] and tei:seg[@type = 'simTitle'][@n = $nTitle]]" role="error" diagnostics="mJB"><value-of select="$flag"/>Wert in simAuthor|simTitle/@n kann in Referenzliste nicht in dieser Kombination gefunden werden (<value-of select="$nAuthor"/> + <value-of select="$nTitle"/>).</assert>
		</rule>
	</pattern>
	<pattern id="fileAutorenstellenAbgleich-Hi">
		<!--Erstmal generell abgehandelt; Falls es berechtigte Ausnahmen gibt, Abgleich mit uebersichtAutorenstellen.xml, dort kann dezidiert dokumentiert werden, welche Fälle Kursivierung erlauben und welche nicht-->
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']/tei:seg[@type = 'simTitle'][descendant::text()]">
			<assert test="tei:hi[@rend = 'italic']" role="error" diagnostics="mJB"><value-of select="$flag"/>Titel in Similie sollte kursiviert stehen (simTitle).</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']/tei:seg[@type = 'simTitleSingle'][descendant::text()]">
			<assert test="tei:hi[@rend = 'italic']" role="error" diagnostics="mJB"><value-of select="$flag"/>Titel in Similie sollte kursiviert stehen (simTitleSingle).</assert>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']/tei:seg[@type = 'simAuthorSingle'][descendant::text()]">
			<report test="tei:hi[@rend = 'italic']" role="error" diagnostics="mJB"><value-of select="$flag"/>Autor in Similie sollte nicht kursiviert stehen (simAuthorSingle).</report>
		</rule>
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']/tei:seg[@type = 'simAuthor'][descendant::text()]">
			<report test="tei:hi[@rend = 'italic']" role="error" diagnostics="mJB"><value-of select="$flag"/>Autor in Similie sollte nicht kursiviert stehen (simAuthor).</report>
		</rule>
	</pattern>
	<pattern id="xslVariableSimFullTitleExists">
		<rule context="tei:ref[@type = 'external'][@subtype = 'similia']">
			<let name="simAuthor" value="tei:seg[@type = 'simAuthor']/@n"/>
			<let name="simTitle" value="tei:seg[@type = 'simTitle']/@n"/>
			<let name="simAuthorSingle" value="tei:seg[@type = 'simAuthorSingle']/@n"/>
			<let name="simTitleSingle" value="tei:seg[@type = 'simTitleSingle']/@n"/>
			<let name="joined" value="
					if (string($simAuthorSingle)) then
						$simAuthorSingle
					else
						if (string($simTitleSingle)) then
							$simTitleSingle
						else
							($simAuthor || ' ' || $simTitle)"/>
			<assert test="$importVarMapSimilienTitleStyled//xsl:map-entry[translate(@key, &quot;'&quot;, '') = $joined]" role="warn" diagnostics="mJB"><value-of select="$flag"/>Für diese Similie ist in variables.xsl/$mapSimilienTitleStyled kein Volltitel hinterlegt (<value-of select="$joined"/>)</assert>
		</rule>
	</pattern>
	<pattern id="untaggedAstroRef1">
		<rule context="tei:hi">
			<report test="matches(., 'Astr\.') and following-sibling::node()[self::text()[matches(., '^\s*[IVX]+')]]" role="warn"><value-of select="$flag"/>Potentiell unkodierte Astr.-Referenz gefunden (Astr. gefolgt von röm. Zahl).</report>
		</rule>
	</pattern>
	<pattern id="untaggedAstroRef2">
		<rule context="text()">
			<report test="matches(., '[IXV]+\s\d') and not(parent::tei:rs)" role="warn"><value-of select="$flag"/>Potentiell unkodierte Astr.-Referenz gefunden (röm. Zahl gefolgt von arab. Zahl).</report>
		</rule>
	</pattern>
	<pattern id="untaggedAstroRef3">
		<!--</ref>.125-->
		<rule context="tei:ref[@type = 'internal'][following-sibling::node()[1][self::text()]]">
			<report test="matches(following-sibling::node()[1][self::text()], '^\.\s?\d')" role="warn"><value-of select="$flag"/>Potentielle Astr.-Referenz gefunden (Punkt+Zahl nach ref(internal)) -> in ref verschieben.</report>
			<report test="matches(following-sibling::node()[1][self::text()], '^f\.')" role="warn"><value-of select="$flag"/>Potentiell Fehler nach Astr.-Referenz gefunden ("f." nach ref(internal)) -> in ref verschieben.</report>
			<report test="matches(following-sibling::node()[1][self::text()], '^sq\.')" role="warn"><value-of select="$flag"/>Potentiell Fehler nach Astr.-Referenz gefunden ("sq." nach ref(internal)) -> in ref verschieben.</report>
			<report test="matches(following-sibling::node()[1][self::text()], '^(-|‒)\d')" role="warn"><value-of select="$flag"/>Potentiell Fehler nach Astr.-Referenz gefunden (Minus/Trennstrich+Zahl nach ref(internal)) -> in ref verschieben.</report>
		</rule>
	</pattern>
	<!-- Similienanmerkungen ENDE -->
	<pattern id="figDesc">
		<rule context="tei:figDesc">
			<assert test="matches(., '^Abb\. \d+: ')" role="warn"><value-of select="$flag"/>Bildbeschreibung prüfen (Format: "Abb. 0: ")</assert>
			<report test="matches(., '\.\s*$')" role="warn"><value-of select="$flag"/>Bildbeschreibung prüfen (keinen Punkt am Ende setzen)</report>
			<report test="matches(., '\s$')" role="warn"><value-of select="$flag"/>Bildbeschreibung prüfen (kein Spatium am Ende setzen)</report>
		</rule>
	</pattern>
	<pattern id="graphic">
		<rule context="tei:graphic/@url">
			<assert test="matches(., '^svg_[a-zA-Z_]*\.svg$') or matches(., '^[a-zA-Z_]*\.(png|webp)$')" role="warn"><value-of select="$flag"/>URL prüfen (erwartet: "svg_[...].svg" oder "[...].png|webp")</assert>
		</rule>
	</pattern>
	<pattern id="nonLatinCharacter">
		<rule context="tei:*/@xml:id | tei:*/@ref">
			<assert test="not(matches(., '[^#A-Za-z0-9_\-\.]'))" role="warn"><value-of select="$flag"/><value-of select="'@' || name()"/> enthält nicht erlaubte Zeichen (erlaubt nur lat. Buchstaben, Zahl, Unterstrich, Minus)</assert>
		</rule>
	</pattern>
</schema>
