!!! 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 ??? /

Titel Seite
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');