vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Anhang A

Antworten auf die Fragen

A.1 Mögliche Lösung für die Übung des 1. Tages

<uebung -Tag="1">
<name>Devan Shepherd</name>
<adresse>irgendeine Strasse 123 </adresse>
<email>ich@wieimmer.com</email>
<dob monat="August" jahr="1958" -Tag="11"/>
</uebung>

A.2 Mögliche Lösung für die Übung des 2. Tages

Die Instanz, die in Listing 2.4 dargestellt wird, hat mehrere ernsthafte Fehler. Dazu gehören die folgenden:

Wenn diese Fehler berichtigt werden, sodass der Code wie in Listing A.1 aussieht, wird das Dokument wohl geformt.

Listing A.1: Eine Lösung für die Übung des 2. Tages

 1: <?xml version="1.0"?>
2: <musik>
3: <cd nummer="432">
4: <titel>Das Beste von Van Morrison</titel>
5: <kuenstler>Van Morrison</kuenstler>
6: <stuecke gesamt="20" />
7: </cd>
8: <cd nummer="97">
9: <titel>HeartBreaker</titel>
10: <untertitel>Sechzehn Klassiker</untertitel>
11: <kuenstler>Pat Benatar</kuenstler>
12: <stuecke gesamt="16" />
13: </cd>
14: </musik>

A.3 Mögliche Lösung für die Übung des 3. Tages

Abbildung A.1 zeigt ein mögliches Baumdiagramm für die MCML.

Abbildung A.1:  Eine mögliche Lösung für die Übung des 3. Tages:  Ein Baumdiagramm für die Music Collection Markup Language (MCML)

Der Inhalt oder die Bedienerregeln, die auf MCML angewendet werden können, sind folgende:

A.4 Mögliche Lösung für die Übung des 4. Tages

Listing A.2 zeigt eine DTD, die zum Validieren der MCML-Instanz verwendet werden kann.

Listing A.2: Die MCML-DTD - cd.dtd

<!ELEMENT musik     ( cd+ ) >
<!ELEMENT cd ( kuenstler | untertitel | titel | stuecke )* >
<!ELEMENT kuenstler ( #PCDATA ) >
<!ELEMENT untertitel ( #PCDATA ) >
<!ELEMENT titel ( #PCDATA ) >
<!ELEMENT stuecke EMPTY >
<!ATTLIST cd
nummer NMTOKEN #REQUIRED >
<!ATTLIST stuecke
gesamt NMTOKEN #REQUIRED >

A.5 Mögliche Lösung für die Übung des 5. Tages

Listing A.3 zeigt ein XDR-Schema, das zum Validieren der MCML-Instanz verwendet werden kann.

Listing A.3: Ein XDR-Schema für die MCM-Sprache

 1: <?xml version="1.0" encoding="UTF-8"?>
2: <Schema
3: name="Schema ohne Titel"
4: xmlns="urn:schemas-microsoft-com:xml-data"
5: xmlns:dt="urn:schemas-microsoft-com:datatypes">
6: <ElementType name="musik" model="closed" content="eltOnly" order="seq">
7: <Element type="cd" minOccurs="1" maxOccurs="*"/>
8: </ElementType>
9: <ElementType name="cd" model="closed" content="eltOnly" order="one">
10: <AttributeType name="nummer" dt:type="string" required="yes"/>
11: <attribute type="nummer"/>
12: <group minOccurs="0" maxOccurs="*" order="one">
13: <Element type="kuenstler" minOccurs="1" maxOccurs="1"/>
14: <Element type="untertitel" minOccurs="1" maxOccurs="1"/>
15: <Element type="titel" minOccurs="1" maxOccurs="1"/>
16: <Element type="stuecke" minOccurs="1" maxOccurs="1"/>
17: </group>
18: </ElementType>
19: <ElementType name="kuenstler" model="closed"
content="textOnly" dt:type="string"/>
20: <ElementType name="untertitel" model="closed"
content="textOnly" dt:type="string"/>
21: <ElementType name="titel" model="closed"
content="textOnly" dt:type="string"/>
22: <ElementType name="stuecke" model="closed"
content="empty">
23: <AttributeType name="gesamt" dt:type="number"
required="yes"/>
24: <attribute type="gesamt"/>
25: </ElementType>
26: </Schema>

A.6 Mögliche Lösung für die Übung des 6. Tages

Listing A.4 zeigt ein XSD-Schema, das zum Validieren der MCML-Instanz verwendet werden kann.

Listing A.4: Ein XSD-Schema für die MCM-Sprache

 1: <?xml version="1.0" encoding="UTF-8"?>
2: <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
3: <xsd:element name="kuenstler" type="xsd:string"/>
4: <xsd:complexType name="cdTyp">
5: <xsd:sequence>
6: <xsd:element ref="titel"/>
7: <xsd:element ref="untertitel" minOccurs="0"/>
8: <xsd:element ref="kuenstler"/>
9: <xsd:element name="stuecke" type="stueckTyp"/>
10: </xsd:sequence>
11: <xsd:attribute name="nummer" use="required">
12: <xsd:simpleType>
13: <xsd:restriction base="xsd:NMTOKEN">
14: <xsd:enumeration value="432"/>
15: <xsd:enumeration value="97"/>
16: </xsd:restriction>
17: </xsd:simpleType>
18: </xsd:attribute>
19: </xsd:complexType>
20: <xsd:element name="musik">
21: <xsd:complexType>
22: <xsd:sequence>
23: <xsd:element name="cd" type="cdTyp"
maxOccurs="unbounded"/>
24: </xsd:sequence>
25: </xsd:complexType>
26: </xsd:element>
27: <xsd:element name="untertitel" type="xsd:string"/>
28: <xsd:element name="titel" type="xsd:string"/>
29: <xsd:complexType name="stueckTyp">
30: <xsd:attribute name="gesamt" use="required">
31: <xsd:simpleType>
32: <xsd:restriction base="xsd:NMTOKEN">
33: <xsd:enumeration value="16"/>
34: <xsd:enumeration value="20"/>
35: </xsd:restriction>
36: </xsd:simpleType>
37: </xsd:attribute>
38: </xsd:complexType>
39: </xsd:schema>

A.7 Mögliche Lösung für die Übung des 7. Tages

Listing A.5 zeigt das MCML-XML-Dokument mit den erforderlichen Veränderungen in jedem cd-Element. Listing A.6 gibt eine DTD an, die das XML-Dokument validiert und eine Entity für die Ersetzung eines Textstrings definiert.

Listing A.5: Die MCML-Instanz mit einer Entity-Ersetzung - cd07.xml

 1: <?xml version="1.0"?>
2: <!-- listing 7.3 - cd07.xml-->
3:
4: <!DOCTYPE musik SYSTEM "cd01.dtd">
5: <musik>
6: <cd nummer="432">
7: <titel>Das Beste von Van Morrison</titel>
8: <kuenstler>Van Morrison</kuenstler>
9: <stuecke gesamt="20"/>
10: <style>&style;</style>
11: </cd>
12: <cd number="97">
13: <titel>HeartBreaker</titel>
14: <untertitel>Sechzehn Klassiker</untertitel>
15: <kuenstler>Pat Benatar</kuenstler>
16: <stuecke gesamt="16"/>
17: <style>&style;</style>
18: </cd>
19: </musik>

Listing A.6: Eine DTD für die MCML-Instanz mit einer Entity-Deklaration - cd01.dtd

 1: <!-- listing 7.4 - cd01.dtd-->
2:
3: <!ELEMENT musik (cd+)>
4: <!ELEMENT cd (kuenstler | untertitel | titel | stuecke | style)*>
5: <!ELEMENT kuenstler (#PCDATA)>
6: <!ELEMENT untertitel (#PCDATA)>
7: <!ELEMENT titel (#PCDATA)>
8: <!ELEMENT stuecke EMPTY>
9: <!ELEMENT style (#PCDATA)>
10: <!ATTLIST cd
11: nummer NMTOKEN #REQUIRED
12: >
13: <!ATTLIST stuecke
14: gesamt NMTOKEN #REQUIRED
15: >
16: <!ENTITY style "Diese CD ist eine Zusammenstellung
17: der Top-Hits des Kuenstlers und charakteristisch fuer
18: den Stil, den wir inzwischen geniessen koennen."
19: >

A.8 Mögliche Lösung für die Übung des 8. Tages

Listing A.7 zeigt eine mögliche Lösung für die Übung. Der neue Namensraum wird in Zeile 5 mit der URI urn:meineoldies:LPs deklariert. Die Zeilen 17-21 zeigen die neue Datenklasse einschließlich des Namensraum-Präfixes vinyl.

Listing A.7: MCML mit einem vinyl-Namensraum - cd08.xml

 1: <?xml version="1.0"?>
2: <!-- Listing 8.7 - cd08.xml -->
3:
4: <musik
5: xmlns:vinyl="urn:meineoldies:LPs">
6: <cd nummer="432">
7: <titel>Das Beste von Van Morrison</titel>
8: <kuenstler>Van Morrison</kuenstler>
9: <stuecke gesamt="20"/>
10: </cd>
11: <cd nummer="97">
12: <titel>HeartBreaker</titel>
13: <untertitel>Sechzehn Klassiker</untertitel>
14: <kuenstler>Pat Benatar</kuenstler>
15: <stuecke gesamt="16"/>
16: </cd>
17: <vinyl:platte nummer="105">
18: <vinyl:titel>King of Blue</vinyl:titel>
19: <vinyl:kuenstler>Miles Davis</vinyl:kuenstler>
20: <vinyl:stuecke gesamt="11"/>
21: </vinyl:platte>
22: </musik>

A.9 Mögliche Lösung für die Übung des 9. Tages

Problem

Mögliche Lösung

Alle Elemente auswählen, die dem Wurzelknoten
untergeordnet sind

//*

Alle Stückeelemente auswählen, die ein gesamt-Attribut mit dem Wert 16 enthalten

//stuecke [@gesamt="16"]

Alle Elemente auswählen, die den Buchstaben i in ihrem Namen haben

//*contains (name(),"i")]

Alle Elemente auswählen, die Namen mit mehr als elf
Zeichen haben

//*[string-length(name()>11]

Alle gleichrangigen Verwandten des ersten cd-Elements auswählen

/musik/cd/following-sibling::*

Tabelle A.1: Mögliche Lösungen 

A.10 Mögliche Lösung für die Übung des 10. Tages

Listing A.8 zeigt ein mögliches Resultat. Sie brauchen ein Dokument mit dem Namen regal.xml, um diesen einfachen Link aufzulösen.

Listing A.8: Mögliche Lösung für die Übung des 10. Tages - cd10.xml

 1: <?xml version="1.0"?>
2: <!-- Listing 10.9 - cd10.xml -->
3:
4: <musik
5: xmlns:vinyl="urn:meineoldies:LPs"
6: xmlns:xlink="http://www.w3.org/1999/xlink">
7: <cd nummer="432" xlink:type="simple"
8: xlink:href="regal.xml"
9: xlink:show="replace"
10: xlink:actuate="onRequest">
11: <titel>Das Beste von Van Morrison</titel>
12: <kuenstler>Van Morrison</kuenstler>
13: <stuecke gesamt="20"/>
14: </cd>
15: <cd nummer="97">
16: <titel>HeartBreaker</titel>
17: <untertitel>Sechzehn Klassiker</untertitel>
18: <kuenstler>Pat Benatar</kuenstler>
19: <stuecke gesamt="16"/>
20: </cd>
21: <vinyl:platte nummer="105">
22: <vinyl:titel>King of Blue</vinyl:titel>
23: <vinyl:kuenstler>Miles Davis</vinyl:kuenstler>
24: <vinyl:stuecke gesamt="11"/>
25: </vinyl:platte>
26: </musik>

Listing A.9 zeigt ein XML-Dokument, auf das durch die Aktivierung eines einfachen Links zugegriffen wird.

Listing A.9: Ein Dokument am Ende eines CD-XLinks - regal.xml

1: <?xml version="1.0"?>
2: <!-- Listing 10.10 - regal.xml -->
3:
4: <regal>
5: Diese CD steht im dritten Regal
6: </regal>

A.11 Mögliche Lösung für die Übung des 12. Tages

Listing A.10 zeigt Code, der die Elemente titel und kuenstler für die erste CD in Ihrer Sammlung zurückgibt.

Listing A.10: Ein DOM-Script für die MCML - DOM_12a.html

 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2: <!-- Tag 12 Übung 1 - DOM_12a.html -->
3:
4: <html>
5: <head>
6: <title>DOM Scripting</title>
7: </head>
8: <body>
9: <script language="javascript">
10: <!--
11:
12: var oMeinedinge = new ActiveXObject("Microsoft.XMLDOM")
13: oMeinedinge.async="false"
14: oMeinedinge.load("cd12.xml")
15:
16:
17: document.write
18: ("Titel:")
19: document.write
20: (oMeinedinge.getElementsByTagName("titel").item(0).text)
21:
22: document.write
23: ("<br/>Kuenstler:")
24: document.write
25: (oMeinedinge.getElementsByTagName("kuenstler").item(0).text)
26:
27:
28: -->
29: </script>
30:
31: </body>
32: </html>

Ein Script, das in Zeile 9 anfängt, ist im <body>-Abschnitt (Zeilen 8-31) einer HTML-Seite enthalten. Die Zeile 9 deklariert die Scriptsprache (language="javascript") mit einem language-Attribut für das script-Element. Zeile 10 beginnt einen Kommentar, der sich so auswirkt, dass das gesamte Script vor älteren Browsern versteckt wird, die kein JavaScript unterstützen. Die Zeilen 12-14 erzeugen das Dokumentobjekt und die Schritte zum Laden von XML. Die Zeilen 17-18 drucken den Text für das titel-Element auf dem Bildschirm aus. Zeile 20 wählt den Text (text) aus, den das erste (item(0)) titel-Element (getElementsByTagName("titel")) im Objekt enthält, welches das Dokument (oMeinedinge) beinhaltet. Auf ähnliche Weise wählt Zeile 25 den Text des ersten kuenstler-Elements im XML-Dokument aus. Die Zeilen 28-30 beenden den Kommentar sowie die script- und body-Abschnitte.

Um die zweiten titel- und kuenstler-Elemente aus dem XML-Dokument auswählen zu können, müssen Sie die Zahl der item()-Methoden in den Zeilen 20 und 25 auf 1 setzen. Der fertige Code sieht so aus:

Listing A.11: Ein DOM-Script für MCML - DOM_12b.html

 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2: <!-- Tag 12 Übung 1 - DOM_12b.html -->
3:
4: <html>
5: <head>
6: <title>DOM Scripting</title>
7: </head>
8: <body>
9: <script language="javascript">
10: <!--
11:
12: var oMeinedinge = new ActiveXObject("Microsoft.XMLDOM")
13: oMeinedinge.async="false"
14: oMeinedinge.load("cd12.xml")
15:
16:
17: document.write
18: ("Titel:")
19: document.write
20: (oMeinedinge.getElementsByTagName("titel").item(1).text)
21:
22: document.write
23: ("<br/>Kuenstler:")
24: document.write
25: (oMeinedinge.getElementsByTagName("kuenstler").item(1).text)
26:
27:
28: -->
29: </script>
30:
31: </body>
32: </html>

Die Werte, die in den Zeilen 20 und 25 an die item()-Methoden weitergegeben werden, sind auf 1 gesetzt, um die zweite Instanz eines jeden Elements auszuwählen. Der text-Inhalt der ausgewählten Punkte wird auf den Bildschirm zurückgegeben.

A.12 Mögliche Lösung für die Übung des 13. Tages

Sie müssen den Validier-Wert in Zeile 27 von Listing 13.2 auf true abändern und die Instanz erneut kompilieren.

27:         saxFactory.setValidating( true );

Da Sie den Namen der Klasse auf EList2.java ändern, müssen Sie auf den Referenzen die Klassennamen in den Zeilen 14, 19 und 31 ändern, damit das Programm korrekt kompiliert werden kann.

Damit Sie Validierfehler beim Auftreten auffangen können, müssen Sie die error- Methode der HandlerBase-Klasse überschreiben und den Prozessor zwingen, anzuhalten und einen Fehler zu melden, statt mit der Verarbeitung der restlichen Dokumentinstanz fortzufahren.

Die beiden neuen Methoden sind folgende:

 1:    public void error( SAXParseException minor ) 
2: throws SAXParseException
3: {
4: throw minor;
5: }
6: public void warning( SAXParseException warn )
7: throws SAXParseException
8: {
9: System.err.println( "Warnung: " + warn.getMessage() );
10: }

Die erste neue Methode (Zeilen 1-5) wirft alle geringfügigen Parsing-Fehler auf, damit die Beseitiger der Fehler sie in der main-Methode auffangen können. Die zweite Methode (Zeilen 6-10) gibt alle Warnmeldungen an, die der SAX-Parser erzeugt.

Wenn Sie diese Änderungen kompilieren und Ihr CD-XML-Dokument modifizieren, indem Sie ein neues leeres Element in der Nähe des Instanzendes einfügen, sieht das zu erwartende Resultat in etwa so aus:

Name des Dokuments: datei:C:/SAX/cd13_schlecht.xml
SAX Event - Dokumentanfang
SAX Event - Element Start: musik
SAX Event - Element Start: cd
SAX Event - Attribute: nummer="432"
SAX Event - Element Start: titel
SAX Event - Zeichen: Das Beste von Van Morrison
SAX Event - Element Ende: titel
SAX Event - Element Start: kuenstler
SAX Event - Zeichen: Van Morrison
SAX Event - Element Ende: kuenstler
SAX Event - Element Start: stuecke
SAX Event - Attribute: gesamt="20"
SAX Event - Element Ende: stuecke
SAX Event - Element Ende: cd
SAX Event - Element Start: cd
SAX Event - Attribute: nummer="97"
SAX Event - Element Start: titel
SAX Event - Zeichen: HeartBreaker
SAX Event - Element Ende: titel
SAX Event - Element Start: untertitel
SAX Event - Zeichen: Sechzehn Klassiker
SAX Event - Element Ende: untertitel
SAX Event - Element Start: kuenstler
SAX Event - Zeichen: Pat Benatar
SAX Event - Element Ende: kuenstler
SAX Event - Element Start: stuecke
SAX Event - Attribute: gesamt="16"
SAX Event - Element Ende: stuecke
SAX Event - Element Ende: cd
Parsing Fehler: Element "musik" erlaubt kein "empty" hier.

Der Fehler (ein neues leeres Element, das von der zugeordneten DTD nicht genehmigt wird) wird in der letzten Zeile gemeldet und der Parser beendet die Verarbeitung.

Beachten Sie, dass der Prozessor keine überflüssigen Zeichen-Events auffängt. Das ist deshalb der Fall, weil die DTD dazu dient, die Zeichendaten zu definieren, und weil Leerzeichen, die ignoriert werden, nicht gemeldet werden können.

A.13 Mögliche Lösung für die Übung des 14. Tages

Sie können die Effekte in Abbildung 14.3 mit mehreren Methoden erreichen. Eine mögliche CSS-Datei, die diese Herausforderung löst, wird in Listing A.12 gezeigt.

Listing A.12: Eine mögliche Lösung für die Übung des 14. Tages

 1: /* Uebung, Tag 14, cd14.css */
2:
3: musik
4: { display:block;
5: font-size:14pt;
6: padding:60px;
7: border-style:solid;
8: background-color:#999966;
9: background-image:URL(http://www.samspublishing.com/images/samslogo.gif);
10: background-repeat:no-repeat}
11:
12: titel, kuenstler
13: { display:block}
14:
15: cd
16: { display:block;
17: padding:20px;
18: border-style:double;
19: border-width:thick;
20: width:75%;
21: margin:20px;
22: background-color:#99cc99}

Die Zeilen 3-10 stellen einen Regelsatz für das Wurzelelement musik bereit. Der Inhalt des musik-Elements wird in Blöcken mit vorangehenden und nachfolgenden Zeilenvorschüben (Zeile 4) angezeigt. Die Größe des Textinhalts ist auf 14 Punkte gesetzt (Zeile 5). Zwischen der inneren Grenzlinie und den äußeren Kanten der inneren Kästchen (Zeile 6) liegen 60 Pixel Füllmenge. Die äußere Grenzlinie wird als durchgezogene Linie dargestellt (Zeile 7). Die Hintergrundfarbe ist auf HEX 999966 gesetzt, was der Farbgebung im SAMS-Logo entspricht (Zeile 8). Auf die Grafik wird im Web unter der angegebenen URL zugegriffen (Zeile 9). Die Eigenschaft background-repeat ist auf no-repeat gesetzt (Zeile 10), um zu vermeiden, dass die Grafik über die gesamte Oberfläche des äußeren Kästchens gekachelt wird. Die Zeilen 12-13 stellen einen Zeilenvorschub zwischen dem Inhalt des titel- und des kuenstler-Elements sicher. Der Inhalt des cd-Elements wird durch den Regelsatz in den Zeilen 15-22 stilisiert. Um einen Leerraum zwischen den Wörtern und jedem der inneren Kästchen zu garantieren, wird als Füllbereich (padding) 20 Pixel Leerraum angegeben (Zeile 17). Die inneren Kästchen werden durch eine dicke doppelte Linie begrenzt (Zeilen 18-19). Zeile 20 richtet eine Leerraum-Beziehung von 75% zwischen dem äußeren und den inneren Kästchen ein. Die Hintergrundfarbe für die inneren Kästchen wird in Zeile 22 auf HEX 99cc99 gesetzt.

A.14 Mögliche Lösung für die Übung des 15. Tages

Die einfachste Art, eine Merkpunktliste zu erstellen, ist es, ein fo:list-block-Element einzurichten, das Listenpunkte enthält. Das Label definiert den Merkpunkt und der Rumpf liefert die Textdaten, die neben dem Merkpunkt abgelegt sind. Listing A.13, cd15.fo, zeigt eine Möglichkeit, wie der gewünschte Effekt erreicht werden kann.

Listing A.13: Mögliche Lösungen für die Übung des 15. Tages

 1: <?xml version="1.0"?>
2: <!-- Tag 15 Herausforderung - cd15.fo -->
3:
4: <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
5:
6: <fo:layout-master-set>
7: <fo:simple-page-master master-name="CD">
8: <fo:region-body margin-left="1.5in"
9: margin-right="1.5in" margin-top="1in"/>
10: </fo:simple-page-master>
11: </fo:layout-master-set>
12:
13: <fo:page-sequence master-name="CD">
14: <fo:flow flow-name="xsl-region-body">
15:
16: <fo:block
17: text-align="center"
18: font-size="28pt"
19: font-family="sans-serif"
20: font-weight="bold"
21: color="blau">CD-Titel
22: </fo:block>
23:
24: <fo:list-block>
25:
26: <fo:list-item>
27:
28: <fo:list-item-label>
29: <fo:block>*</fo:block>
30: </fo:list-item-label>
31:
32: <fo:list-item-body>
33: <fo:block start-indent=".25in">
34: Das Beste von Van Morrison</fo:block>
35: </fo:list-item-body>
36:
37: </fo:list-item>
38: <fo:list-item>
39:
40: <fo:list-item-label>
41: <fo:block>*</fo:block>
42: </fo:list-item-label>
43:
44: <fo:list-item-body>
45: <fo:block start-indent=".25in">
46: HeartBreaker</fo:block>
47: </fo:list-item-body>
48:
49: </fo:list-item>
50:
51: </fo:list-block>
52:
53: </fo:flow>
54: </fo:page-sequence>
55:
56: </fo:root>

Das fo:list-block-Element beginnt in Zeile 24. Jedes Listenpunktelement (fo:list-item) enthält zwei abgeleitete Elemente: fo:list-item-label und fo:list-item-body. Die fo:list-item-label-Elemente definieren die Blöcke, die die Merkpunkte (Sternchen) enthalten. Die fo:list-item-body-Elemente enthalten die Titel der CDs. Bei den fo:list-item-body-Elementen gibt es ein start-indent-Attribut, das einen Leerraum zwischen Merkpunkt und Rumpf des Listenpunkts lässt.

Abbildung A.2 zeigt das Resultat einer Interpretation dieses Codes mit FOP.

Abbildung A.2:  XSL-FO-Listenpunkte

A.15 Mögliche Lösung für die Übung des 16. Tages

Eine Möglichkeit, diese Übung zu lösen, ist, zwei Schablonen zu schreiben. Die erste Schablone bearbeitet die typischen HTML-Tags. Diese Schablone passt auf das Wurzelelement (musik) oder den Wurzelknoten (/). Die zweite Schablone passt auf das cd- Element und verwendet das xsl:nummer-Element mit einem xsl:apply-templates, das auf das zu zählende Element (titel) gerichtet ist. Listing A.14 zeigt die vollständige Auflistung.

Listing A.14: Mögliche Lösung für die Übung des 16. Tages - cd16.html

 1: <?xml version="1.0"?>
2: <!-- Tag 16 - Uebung - cd16.xsl -->
3:
4: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
5: version="1.0">
6:
7: <xsl:template match="musik">
8: <HTML>
9: <HEAD>
10: <TITLE>CD-Sammlung</TITLE>
11: </HEAD>
12: <BODY>
13: <xsl:apply-templates/>
14: </BODY>
15: </HTML>
16: </xsl:template>
17:
18: <xsl:template match="cd">
19: <xsl:nummer/>. <xsl:apply-templates select="titel"/><br/>
20: </xsl:template>
21:
22:
23: </xsl:stylesheet>

Die Zeilen 16-18 enthalten die Schablone, die die Elementzählung durchführt. Diese Schablone passt auf das cd-Element (Zeile 18). Das xsl:nummer-Element wird bei jeder Ausführung der Schablone sequenziell inkrementiert. Da die Schablone jedes cd-Element durchläuft, zählt diese Aktion die CDs. Nur das titel-Element wird dank select (Zeile 19) bei der Zählung im Ausgabebaum eingeschlossen.

A.16 Mögliche Lösung für die Übung des 17. Tages

Eine mögliche Lösung liegt in der Anwendung des XML-DSO-Applets. Listing A.15 zeigt den Code, der die Aufgabe auf diese Art erfüllt.

Listing A.15: Mögliche Lösung für die Übung des 17. Tages

 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2: "http://www.w3.org/TR/html4/loose.dtd">
3: <!-- listing 17.7 cd17.html -->
4:
5: <HTML>
6: <HEAD>
7: <TITLE>XML Dateninsel</TITLE>
8: </HEAD>
9:
10: <BODY>
11: <applet code="com.ms.xml.dso.XMLDSO.class"
12: width="100%" height="50" id="CDs">
13: <PARAM NAME="url" VALUE="cd17.xml">
14: </applet>
15: <H1>Meine Nachrichten</H1>
16: <TABLE id="table" border="6" width="100%"
17: datasrc="#CDs" summary="Nachrichten">
18: <THEAD style="background-color: aqua">
19: <TH>Titel</TH>
20: <TH>Kuenstler</TH>
21: </THEAD>
22: <TR valign="top" align="center">
23: <TD><SPAN datafld="titel"/></TD>
24: <TD><SPAN datafld="kuenstler"/></TD>
25: </TR>
26: </TABLE>
27: </BODY>
28: </HTML>

A.17 Mögliche Lösung für die Übung des 21. Tages

Beginnen Sie mit der Erstellung einer Dateninsel für das Dokument wein_notiz.xml. Sie erinnern sich sicher vom 17. Tag her daran, dass die Syntax so aussieht:

<XML ID="oMyDSOObjectName" SRC="meineQuelle.xml"/>

Ermitteln Sie den Suchstring der Anwender, indem Sie eine Eingabeschaltfläche einrichten, auf der Sie die Zeichen sammeln. Speichern Sie den eingegebenen String in einer Variablen, die Sie in eine Suchfunktion einspeisen können. Verwenden Sie VBScript oder JavaScript, um den Inhalt des winzer-Elements aus dem wein_notiz.xml- Dokument zu durchsuchen und geben Sie die gesamte Aufzeichnung an eine neue Variable zurück, wenn ein Treffer erzielt wird. Formatieren Sie die Ausgabe der Variablen. Eine mögliche Suchfunktion in JavaScript sieht wie folgt aus:

function fSearchNotes ()
{
strWinzer = SearchText.value.toUpperCase();
if (strWinzer == "")
{
strSearchResult.innerHTML = "&ltBitte geben Sie "
+ "einen Suchstring in das "
+ "Feld 'Titel' ein.&gt";
return;
}

oWeinNotizDSO.recordset.moveFirst();

RSSearchResultOutput = "";
while (!oWeinNotizDSO.recordset.EOF)
{
RSstrWinzer = oWeinNotizDSO.recordset("winzer").value;

if (RSstrWinzer.toUpperCase().indexOf(strWinzer)
>=0)
RSSearchResultOutput += "<P><B>"
+ oWeinNotizDSO.recordset("winzer")
+ "</B>, "
+ oWeinNotizDSO.recordset("region")
+ ", <I>"
+ oWeinNotizDSO.recordset("typ")
+ "</I>, "
+ oWeinNotizDSO.recordset("jahrgang")
+ ", <BR/>"
+ oWeinNotizDSO.recordset("notiz")
+ "</P>";

oWeinNotizDSO.recordset.moveNext();
}

if (RSSearchResultOutput == "")
strSearchResult.innerHTML = "&ltEs konnten keine Wein"
+ "-Notizen gefunden werden&gt";
else
strSearchResult.innerHTML = RSSearchResultOutput;
}

Listing A.16 zeigt eine vollständige Seite.

Listing A.16: Eine Suchfunktion für die Online-Anwendung Wein-Notiz, die eine XML-Dateninsel verwendet - wein_suche.html

 1: <!DOCTYPE XHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2: "http://www.w3.org/TR/html4/loose.dtd">
3:
4: <!-- Tag 21 Uebung - wein_suche.html -->
5:
6: <HTML>
7:
8: <HEAD>
9:
10: <TITLE>Wein-Suchmaschine</TITLE>
11: <LINK rel = "stylesheet" type = "text/css"
12: href = "wein_notiz.css"/>
13:
14: </HEAD>
15:
16: <BODY>
17:
18: <XML ID="oWeinNotizDSO" SRC="wein_notiz.xml"/>
19:
20: <H1>Online-Weinnotizen</H1>
21: <H3>Suche nach Notizen des Winzers/Marke</H3>
22:
23: Zeichen des Herstellers/Namen des Winzers eingeben: <BR/>
24: <INPUT TYPE="TEXT" ID="SearchText" SIZE="50">&nbsp
25: <BUTTON ONCLICK='fSearchNotes()'>Suchen</BUTTON>
26: <HR>
27: Ergebnisse:<P>
28: <DIV ID=strSearchResult></DIV>
29:
30: <SCRIPT LANGUAGE="JavaScript">
31: function fSearchNotes ()
32: {
33: strWinzer = SearchText.value.toUpperCase();
34: if (strWinzer == "")
35: {
36: strSearchResult.innerHTML = "&ltGeben Sie einen"
37: + "Suchstring in das Feld"
38: + "'Hersteller/Name des Winzers' ein.&gt";
39: return;
40: }
41:
42: oWeinNotizDSO.recordset.moveFirst();
43:
44: RSSearchResultOutput = "";
45: while (!oWeinNotizDSO.recordset.EOF)
46: {
47: RSstrWinzer = oWeinNotizDSO.recordset("winzer").value;
48:
49: if (RSstrWinzer.toUpperCase().indexOf(strWinzer)
50: >=0)
51: RSSearchResultOutput += "<P><B>"
52: + oWeinNotizDSO.recordset("winzer")
53: + "</B>, "
54: + oWeinNotizDSO.recordset("region")
55: + ", <I>"
56: + oWeinNotizDSO.recordset("typ")
57: + "</I>, "
58: + oWeinNotizDSO.recordset("jahrgang")
59: + ", <BR/>"
60: + oWeinNotizDSO.recordset("notiz")
61: + "</P>";
62:
63: oWeinNotizDSO.recordset.moveNext();
64: }
65:
66: if (RSSearchResultOutput == "")
67: strSearchResult.innerHTML = "&ltEs konnten keine Wein-"
68: + "Notizen gefunden werden.&gt";
69: else
70: strSearchResult.innerHTML = RSSearchResultOutput;
71: }
72: </SCRIPT>
73: <UL>
74: <LI><A HREF="index.html">Zurueck zur Homepage</A></LI>
75: </UL>
76:
77: </BODY>
78:
79: </HTML>

Die Zeile 18 richtet eine Dateninsel für HTML ein, die das wein_notiz.xml-Dokument als Quelle anbindet. Die Zeilen 23-25 erzeugen ein Dateneingabefeld für den Anwender, in das er einen Suchstring eingeben kann. Der eingegebene String heißt SearchText. Wenn der Anwender den String verknüpft, wird die Funktion fSearchNotes() aufgerufen (Zeile 31). Die Suchfunktion fragt den Inhalt des winzer-Elements ab (Zeile 47) und gibt die gesamte Aufzeichnung als Eintragssatz zurück (Zeile 44), wenn ein Treffer für den String SearchText erzielt wird. Der resultierende String wird formatiert (Zeilen 51-61) und als Ausgabe an den Browser geschickt. Wenn der Anwender keine Zeichen eingibt, bevor er das Formular verknüpft, ergeben die Zeilen 34-40 eine Fehlermeldung. Wenn die Suche keine Einträge zurückgibt, melden die Zeilen 66-68 einen Fehler. Zeile 74 bietet eine Methode für den Anwender, auf die Homepage der Anwendung zurückzugehen.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH