David Maus M. A.

Digital Humanities Publishing

Today I Learned: Schematron in RelaxNG/Compact einbetten

David Maus, 18.10.2017 · Permalink

Die Syntax für Annotationen in der kompakten Syntax von RelaxNG ist etwas gewöhnungsbedürftig, erlaubt aber das Einbinden von Schematron-Regeln, mit denen weitergehende Restriktionen geprüft werden können.

internalEntity =   [      s:pattern [         s:rule [            context = "*[@rdf:about]" s:assert [               test = "matches(@rdf:about, '^http://([^.]+\.)?hab\.de')"               "Verwende <owl:sameAs> für Statements zu Entitäten, die nicht unter der Kontrolle der HAB liegen."            ]         ]      ]   ]attribute rdf:about { xsd:anyURI } & Label+

Im Kopf der Grammatik müssen die Schematron-Namensraumbindungen vorgenommen werden, da Trang sie nicht automatisch ergänzt.

[   s:ns [ prefix = "rdf" uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" ]   s:ns [ prefix = "owl" uri = "http://www.w3.org/2002/07/owl#" ]]

Und merke:

Darstellung von Planetensymbolen in der Edition des Diariums von Herzog August dem Jüngeren

David Maus, 09.10.2017 · Permalink

In der Digitalen Edition des Diariums von Herzog August dem Jüngeren sollen die für die Wochentage verwendeten Planetensymbole in der Onlinepublikation dargestellt werden. Die für die Anzeigqe verwendete Schriftart Junicode definiert allerdings keine Glyphen für die betreffenden Zeichen. Ob und wie die Planetensymbole dargestellt werden, wird damit vom Browser abhängig. Ein aktueller Firefox unter Windows verwendet zum Beispiel eine Schriftart, in der es keine fett geschnittenen Glyphen für die Zeichen U+2642 und U+2640 gibt. Der Browser fällt in diesem Fall auf den regulären Schnitt zurück, wodurch die Darstellung der Symbole uneinheitlich wirkt.

Planetensymbole in Firefox 38

Um eine einheitliche Darstellung der Symbole zu erreichen werden die Glyphen der betreffenden Zeichen aus einer anderen Schriftart entnommen. Als Schriftart wird die von George Douros erstellte Schriftart Symbola ausgewählt. Sie ist frei verfügbar und enthält sowohl fett als auch regulär geschnittene Planetensymbole.

Da nur ein Bruchteil der in der Schriftart definierten Zeichen benötigt wird und die Schriftart mit ca. 1.1 Megabyte verhältnismäßig groß ist, wird als erstes eine Schriftartendatei erzeugt, die nur Glyphen des Unicodeblocks Miscellaneous Symbols (U+2600–U+26FF) enthält.

Block mit U+2600–U+26FF erzeugen
pyftsubset Symbola.ttf --unicodes=2600-26FF --output-file=Symbola-26xx.ttf

Die so erstellte Schriftartendatei wird anschließend in das für Webschriftarten übliche WOFF-Format konvertiert.

Schriftartendatei in WOFF konvertieren
cat > metadata.xml<metadata version="1.0">  <credits>    <credit name="George Douros" url="http://users.teilar.gr/~g1951d/" role="creator"/>  </credits>  <description>    This font is a subset of the complete Symbola font. It only contains glyphs from the Unicode block    Miscellaneous Symbols, range U+2600-26FF.  </description></metadata>^Dsfnt2woff -m metadata.xml Symbola-26xx.ttf

Ideal wäre es, wenn der Browser die Schriftart nur für die Zeichen aus Block Miscellaneous Symbols verwendet. Die aktuelle CSS-Spezifikation der Schriftartenunterstützung, CSS Fonts Module Level 3, behandelt dieses Anwendungsszenario in Abschnitt 4.6 unter der Überschrift "Using character ranges to define composite fonts". Dort wird es wie folgt beschrieben:

Multiple @font-face rules with different unicode ranges for the same family and style descriptor values can be used to create composite fonts that mix the glyphs from different fonts for different scripts. This can be used to combine fonts that only contain glyphs for a single script (e.g. Latin, Greek, Cyrillic) or it can be used by authors as a way of segmenting a font into fonts for commonly used characters and less frequently used characters. Since the user agent will only pull down the fonts it needs this helps reduce page bandwidth.

If the unicode ranges overlap for a set of @font-face rules with the same family and style descriptor values, the rules are ordered in the reverse order they were defined; the last rule defined is the first to be checked for a given character.

Allerdings: Die für das Zusammensetzen von Schriftarten verwendete CSS-Eigenschaft unicode-range wird nicht von allen Browsern unterstützt. Insbesondere Firefox beachtetet diese Angaben standardmäßig erst seit Version 44, zuvor mussten sie ausdrücklich in den Experteneinstellungen eingeschaltet werden. Um größtmögliche Kompatibilität zu gewährleisten, wird die Schriftart daher über eine CSS-Klasse zugewiesen.

Schriftart per CSS-Klasse zuweisen
@font-face {  font-family: Symbole;  src: url(http://diglib.hab.de/rules/fonts/Symbola-26xx.woff) format("woff");}.symbol {  font-family: Symbole;}

Und voilà: Die Planetensymbole werden einheitlich dargestellt.

Planetensymbole in Schriftart Symbola

Today I Learned: The different uses of p:input in XProc 1.0

David Maus, 01.04.2017 · Permalink

Update 2017-09-16: Turns out that I am not the only one who struggles (a little bit, compared to the rest of XProc) with using one and the same name for different things. After a short discussion in Aachen we agreed to rename p:input to p:with-input when it is used as document input port connection.

XProc 1.0 uses p:input for three distinct purposes:

The following examples illustrate the distinction between a document input port declaration and a document input port connection.

<p:declare-step version="1.0" xmlns:p="http://www.w3.org/ns/xproc">  <p:sink>    <p:input port="source">      <p:inline>        <foobar/>      </p:inline>    </p:input>  </p:sink></p:declare-step>

The pipeline has a single step p:sink whose source input port is connected to a p:inline that provides an inline document. The p:input acts as a document input port connection.

<p:declare-step version="1.0" name="main" xmlns:p="http://www.w3.org/ns/xproc">  <p:input port="source">    <p:inline>      <foobar/>    </p:inline>  </p:input>  <p:sink>    <p:input port="source">      <p:pipe step="main" port="source"/>    </p:input>  </p:sink></p:declare-step>

Here we have two p:input elements. The first is a document input port declaration with a default connection to an inline document provider. The second input is a document input port connection and connects the source input port of the p:sink to the pipeline's declared input port, i.e. the first p:input. Observe that this required the pipeline to have a name to specify the connection target in p:pipe.

One practical difference between the two is, that the inlined document is fixed in the first case, while it can be overridden in the second. It might also be worth noting that there are two other pipeline elements that as document input port connection, p:iteration-source and p:viewport-source.

Sarsaparilla

David Maus, 19.08.2017 · Permalink

Sarsaparilla

Today I Learned: The second argument to document() (XSLT 1.0)

David Maus, 31.07.2017 · Permalink

When accessing documents with document() I can provide a node set as second argument. If the first argument is a relative URI reference, then the base URL of the first node of this node set is used to resolve it. Otherwise the processor uses the stylesheet's base URL if the first argument is a string or the first argument's base URL if it is a node.

In the diary of Augustus the Younger we annotate places and persons with a reference to a central registry file. The registry contains a link to an authority record and a standardized name of the entity.

<div xml:id="E1601-04-03">  <head>    <date when="1601-04-03">den 3 Aprilis <c>♀</c> </date>  </head>  <p>    H<ex>err</ex> <rs ref="register.xml#Julius_Ernst_Br-Db" type="person">Juli<ex>us</ex>    kommen</rs>; die Pfe<ex>rde</ex> nach <rs ref="register.xml#Warpke" type="place">warpke</rs>    geschickett.  </p></div>

And in the registry file:

<person xml:id="Julius_Ernst_Br-Db">  <idno type="URI">http://d-nb.info/gnd/121123553</idno>  <persName type="display">Julius Ernst, Braunschweig-Lüneburg, Herzog</persName></person>

I wanted the name to be displayed to the user once the mouse pointer hovers over the reference. I knew that I had to dereference the value of the ref attribute and put the display name in a HTML title attribute. I did not know to which base URL relative URI references are resolved: the stylesheet's, the documents', or maybe even the processor's current working directory.

Reading up on this in my trustworthy Kay Kay, Michael. XSLT: Programmer’s Reference. Birmingham: Wrox Press, 2000 I got the whole story. If document() is called with one argument and the argument is a string, the stylesheet's base URL is used to resolve a relative URI reference. If the argument is a node, the node's base URL is used. Use the second argument to provide a node whose base URL should be used instead.

For me this meant: Simply use document(@ref) without worries, since the relative URI reference is resolved with the ref attribute's base URI.

Im Nachgang zur XML Prague 2017: Schematron

David Maus, 15.02.2017 · Permalink

Still und leise wurde bereits Anfang 2016 der ISO-Standard ISO-19757-3 aka ISO Schematron aktualisiert. Auf dem Schematron Users Meetup wurden die wesentlichen Neuerungen kurz umrissen. Neben der expliziten (normativen) Definition der Abfragesprache XSLT2 wurden die Möglichkeiten verbessert, menschen- und maschinenlesbare Berichte zu erstellen. Für komplexere Validierungsszenarien können nun im pattern-Element innerhalb eines documents-Attribut IRIs der Dokumente angegeben werden, für die in der pattern definierten Regeln geprüft werden.

Von praktischem Interesse für größere Editionsprojekte dürfte das von Nico Kutscherauer entwickelte Schematron Quickfix (SQF) sein. SQF ist eine in Schematron eingebettete Sprache, mit der interaktive Korrekturmöglichkeiten für Validierungsfehler beschrieben werden. Mit Hilfe von XML-Editoren wie <oXygen/>, die SQF nativ unterstützen, könnte die Dateneingabe oder Datenkorrektur bequemer gestaltet werden, wenn Bearbeiter eine Fehlerkorrektur auf Knopfdruck veranlassen können. Einrichtung und Anwendung von SQF setzt allerdings qualifiziertes Personal in angemessenen Umfang voraus, lohnte sich daher erst in größeren Projekten.

Zu guter Letzt wurde noch wichtige Aufklärungsarbeit über das Schemtron-Maskottchen geleistet. Es ist nicht etwa ein Hase oder Kaninchen, sondern eine Mischung aus einem Bilby und einem Bettong, zwei australischen Beuteltieren.

Folien Werkstattgespräch 15. Dezember 2016

David Maus, 28.01.2017 · Permalink

Meine Folien vom Werkstattgespräch zum Wolfenbütteler Katalog der Lutherdrucke nun auch online. Die Folien sind mit Eric Meyers exzellentem Simple Standards-Based Slide Show System (S5) herstellt. Die Navigation erfolgt mit Hilfe der Cursor-Tasten.

FYI: Calling Bullshit, A course to teach you how to think critically

David Maus, 18.01.2017 · Permalink

callingbullshit.org/

The world is awash in bullshit. Politicians are unconstrained by facts. Science is conducted by press release. So-called higher education often rewards bullshit over analytic thought. Startup culture has elevated bullshit to high art. Advertisers wink conspiratorially and invite us to join them in seeing through all the bullshit, then take advantage of our lowered guard to bombard us with second-order bullshit. The majority of administrative activity, whether in private business or the public sphere, often seems to be little more than a sophisticated exercise in the combinatorial reassembly of bullshit.

Our aim in this course is to teach you how to think critically about the data and models that constitute evidence in the social and natural sciences.

Welche Möglichkeiten gibt es, ein XML Dokument mit einem Schema zu verknüpfen?

David Maus, 15.01.2017 · Permalink

Wenn es um das Validieren von XML-Dokumenten geht, gibt es nicht nur verschiedene Schematechnologien, sondern auch verschiedene Mechanismen, ein einzelnes XML-Dokument (Dokumentinstanz) mit Schemadateien zu verknüpfen.

Die untenstehenden Mechanismen beruhen alle darauf, die Verknüpfung eines Dokumentes mit einem oder mehreren Schemata im jeweiligen Dokument festzuhalten. Das ist für sich genommen weder gut noch schlecht, allerdings auch nicht die einzige und nicht immer die beste Variante. Der grundsätzliche Nachteil liegt darin, dass die Verknüpfung zwischen Dokumentinstanz und Schemadatei Teil der Dokumentinstanz ist und eine Änderung der Verknüpfung eine Änderung der Dokumentinstanz erforderlich macht. Eine Änderung der Verknüpfung kann aus verschiedenen Gründen erfolgen:

Während eine Anpassung der Dokumentinstanz bei einem, zwei oder vielleicht auch noch zehn Dokumenten halbwegs handhabbar ist, wird die Sache bei mehreren dutzend oder gar hunderten von XML-Dokumenten zu einer echten Herausforderung.

Hinzu kommt, dass nur die Verknüpfung über xml-model sowohl die gleichzeitige Verwendung verschiedener Schemadateien, als auch die gleichzeitige Verwendung verschiedener Schematechnologien erlaubt. Die Verwendung der Document Type Declaration ebenso wie die Verwendung der Schema Locating Hints bindet an die jeweils unterstützte Technologie.

Lange Rede, kurzer Sinn: Wenn ich die Verknüpfung von Dokumentinstanz und Schema in das Dokument einbetten muss, dann bevorzuge ich xml-model, weil sie mir die größte Flexibilität hinsichtlich der Schematechnologien lässt.

Wenn ich es frei entscheiden kann, dann definiere ich die Verknüpfung außerhalb der Dokumentinstanz.

Document Type Declaration

Document Type Declaration
Schematechnologien Document Type Declaration
Mehrere Schemadateien Nein
Beispiel <!DOCTYPE TEI SYSTEM "http://example.com/tei-transcript.dtd">
Literatur

W3C XML Schema

W3C XML Schema
Schematechnologien W3C XML Schema
Mehrere Schemadateien Bedingt
Anmerkung Die Schema Locating Hints verknüpfen je einen XML Namensraum mit je einem Schema
Beispiel <TEI xmlns="http://www.tei-c.org/ns/1.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://www.tei-c.org/ns/1.0 http://example.com/tei-transcript.xsd">  …</TEI>
Literatur

xml-model Processing Instruction

xml-model Processing Instruction
Schematechnologien Document Type Defintion, W3C XML Schema, RelaxNG, Schematron, …
Mehrere Schemadateien Ja
Beispiel <?xml-model href="http://example.com/tei-transcript.rnc" type="application/relax-ng-compact-syntax"?><?xml-model href="http://example.com/tei-transcript.sch" schematypens="http://purl.oclc.org/dsdl/schematron"?>
Literatur

Schritte gruppieren mit p:group

David Maus, 06.01.2017 · Permalink

p:group ist ein zusammengesetzer Schritt (compound step) mit dessen Hilfe sich andere Schritte zu einer Subpipeline zusammenfassen lassen. Innerhalb von p:group können Ausgabeports definiert werden, mit denen (Zwischen-)Ergebnisse der Subpipeline nach außen geleitet werden können.

Verwendung von p:group
<p:group name="subpipeline" xmlns:p="http://www.w3.org/ns/xproc">  <p:output port="result">    <p:pipe step="last-step" port="result"/>  </p:output>  <p:output port="other">    <p:pipe step="intermediate-step" port="result"/>  </p:output></p:group>