!!! Listing 1: register.html
XML-Register
XML-Zeitschriftenregister
!!! Listing 2: Register-DTD <--------- raus
!!! Listing 3:
Scharfes Fernsehbild durch Videoeingang
Heimfernseher als µC-Monitor
Gerd E. Neumann
18
Praxistip
Gestochen scharfes Bild
Video-Ausgang für ZX 81 und Jupiter ACE
C. Persson/A. Burgwitz
22
Praxistip
Spectaculum a la carte
Computertechnik prägte die IFA 1983
Gerd E. Neumann
24
Report
!!! Listing 4: onload.js
function makeProc(url)
{
try
{
var myXSL = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
myXSL.async = false;
myXSL.load(url);
var myTemplate=new ActiveXObject("MSXML2.XSLTemplate");
myTemplate.stylesheet = myXSL.documentElement;
var myProc = myTemplate.createProcessor;
myProc.input = daten.XMLDocument;
return myProc;
}
catch (exception)
{
register.document.open();
register.document.write(myXSL && myXSL.parseError.errorCode ? reportParseError( myXSL.parseError ) : reportRuntimeError(exception, url) );
register.document.close();
return null;
}
}
function window_onload()
{
if (daten.parseError.errorCode != 0)
{
result = reportParseError(daten.parseError,"inhalt.xml");
register.document.open();
register.document.write( result );
register.document.close();
return;
}
RegisterProc = makeProc("register.xsl");
HeftProc = makeProc("heft.xsl");
ArtikelProc = makeProc("artikel.xsl");
SearchProc = makeProc("search.xsl");
if ( RegisterProc == null || HeftProc == null || ArtikelProc == null || SearchProc == null )
return;
show_register();
}
!!! Listing 5: error.js
// Parse error formatting function
function reportParseError(error)
{
var s = "";
for (var i=1; i" +
"" + error.reason +
"
";
if (error.line > 0)
r += "" +
"at line " + error.line + ", character " + error.linepos +
"\n" + error.srcText +
"\n" + s + "^" +
"";
return r;
}
// Runtime error formatting function.
function reportRuntimeError(exception, url)
{
return "XSL Runtime Error at " + url + "" +
"" + exception.description + "
";
}
!!! Listing 6: transform.js
// Die XSL-Prozessoren für die verschiedenen Ansichten deklarieren
var RegisterProc;
var HeftProc;
var ArtikelProc;
function show_register()
{
RegisterProc.transform();
register.document.open();
register.document.write(RegisterProc.output);
register.document.close();
}
function show_heft(z,j,h)
{
HeftProc.addParameter("zeitschrift",z);
HeftProc.addParameter("jahr",j);
HeftProc.addParameter("heft",h);
HeftProc.transform();
heft.document.open();
heft.document.write(HeftProc.output);
heft.document.close();
}
function show_artikel(id)
{
ArtikelProc.addParameter("id",id);
ArtikelProc.transform();
artikel.document.open();
artikel.document.write(ArtikelProc.output);
artikel.document.close();
}
function search_artikel(string)
{
SearchProc.addParameter("string",string);
SearchProc.transform();
artikel.document.open();
artikel.document.write(SearchProc.output);
artikel.document.close();
}
!!! Listing 7: register.xsl
c't
iX
|
javascript:top.show_heft('','',)
|
!!! Listing 8: heft.xsl
Heft
c't
iX
???
/
javascript:top.show_artikel()
|
|
!!! Listing 9: artikel.xsl
Artikel Heft
c't
iX
???
/,
Seite
Autor: |
|
Titel: |
|
Untertitel: |
|
Schlagworte: |
|
!!! Listing 10: search.xsl
!!! Listing 11: convert.pl
use strict;
use Win32::OLE;
# encoding wandelt den DOS-Zeichensatz der
# Registerdatei in den ANSI-Zeichensatz um
sub encoding {
my $str = shift;
$str =~ tr/\x02\x04/\x82\x84/; # Da sind die 8. Bits verschwunden...
$str =~ tr/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x83\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xAE\xAC\xBD\xBC\xA1\xAB\xBB\xA6\xA6\xA6\xA6\xA6\xC1\xC2\xC0\xA9\xA6\xA6\x2B\x2B\xA2\xA5\x2B\x2B\x2D\x2D\x2B\x2D\x2B\xE3\xC3\x2B\x2B\x2D\x2D\xA6\x2D\x2B\xA4\xF0\xD0\xCA\xCB\xC8\x69\xCD\xCE\xCF\x2B\x2B\xA6\x5F\xA6\xCC\xAF\xD3\xDF\xD4\xD2\xF5\xD5\xB5\xFE\xDE\xDA\xDB\xD9\xFD\xDD\xAF\xB4\xAD\xB1\x3D\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\xA6\xA0/;
return $str;
}
# ein leeres DOMDocument anlegen
# und den Wurzelknoten erzeugen
my $xmldoc = Win32::OLE->new('Msxml2.DOMDocument') or die "Kann DOMDocument nicht anlegen.\n";
my $pi = $xmldoc->createProcessingInstruction('xml', 'version="1.0" encoding="ISO-8859-1"');
$xmldoc->appendChild( $pi );
my $xmlregister = $xmldoc->createElement('register');
$xmldoc->appendChild( $xmlregister );
my $id=0;
# Datensaetze aus der Registerdatei einlesen
# Zeichensatz konvertieren
# bei numerischen Angaben Leerzeichen wegwerfen.
open( INHALT, ' ) {
chomp( $titel ); $titel = encoding( $titel );
my $untertitel = ; chomp( $untertitel ); $untertitel = encoding( $untertitel );
my $autor = ; chomp( $autor ); $autor = encoding( $autor );
; # Redakteur
my $seite = ; chomp( $seite ); $seite *= 1;
my $ausgabe = ; chomp( $ausgabe ); $ausgabe *= 1;
my $jahrgang = ; chomp( $jahrgang ); $jahrgang = encoding( $jahrgang );
; # Querverweise
my $schlagwort = ; chomp( $schlagwort ); $schlagwort = encoding( $schlagwort );
my ($zeitschrift,$jahr) = ( $jahrgang =~ /^(.)(\d+)/ );
# nachschauen, ob das Heft bereits eingetragen ist
my $xmlausgabe = $xmlregister->selectSingleNode("jahrgang[\@jahr='$jahr' and \@zeitschrift='$zeitschrift']/heft[\@nr='$ausgabe']");
if ( !$xmlausgabe ) {
# Ein neues Heft hat begonnen. Neuen ausgabe-Knoten mit Attributen einfuegen
# ggf. neuen Jahrgang anlegen.
print "$zeitschrift$jahr/$ausgabe\n";
my $xmljahrgang = $xmlregister->selectSingleNode("jahrgang[\@jahr='$jahr' and \@zeitschrift='$zeitschrift']");
if ( !$xmljahrgang ) {
# einen neuen Jahrgang anlegen
$xmljahrgang = $xmldoc->createElement('jahrgang');
$xmljahrgang->SetAttribute( 'jahr', $jahr );
$xmljahrgang->SetAttribute( 'zeitschrift', $zeitschrift );
$xmlregister->appendChild( $xmljahrgang );
}
$xmlausgabe = $xmldoc->createElement('heft');
$xmlausgabe->SetAttribute( 'nr', $ausgabe );
$xmljahrgang->appendChild( $xmlausgabe );
}
# nun den artikel-Knoten aufbauen
my ($xmlartikel,$xmltext,$xmltextnode);
$xmlartikel = $xmldoc->createElement('artikel');
$xmlartikel->SetAttribute( 'id', $id++ );
$xmlausgabe->appendChild( $xmlartikel );
$xmltext = $xmldoc->createElement('titel');
$xmlartikel->appendChild( $xmltext );
$xmltextnode = $xmldoc->createTextNode( $titel );
$xmltext->appendChild( $xmltextnode );
$xmltext = $xmldoc->createElement('untertitel');
$xmlartikel->appendChild( $xmltext );
$xmltextnode = $xmldoc->createTextNode( $untertitel );
$xmltext->appendChild( $xmltextnode );
$xmltext = $xmldoc->createElement('autor');
$xmlartikel->appendChild( $xmltext );
$xmltextnode = $xmldoc->createTextNode( $autor );
$xmltext->appendChild( $xmltextnode );
$xmltext = $xmldoc->createElement('seite');
$xmlartikel->appendChild( $xmltext );
$xmltextnode = $xmldoc->createTextNode( $seite );
$xmltext->appendChild( $xmltextnode );
$xmltext = $xmldoc->createElement('schlagwort');
$xmlartikel->appendChild( $xmltext );
$xmltextnode = $xmldoc->createTextNode( $schlagwort );
$xmltext->appendChild( $xmltextnode );
# ein Zeilenvorschub, damit XML-Datei im Editor lesbar ist
$xmltextnode = $xmldoc->createTextNode( "\n" );
$xmlausgabe->appendChild( $xmltextnode );
}
# und das DOMDocument auf Platte schreiben
$xmldoc->save('inhalt.xml');