XHTML-Schemata für FrontPage 2003 und Visual Studio .NET

XML-Schemata für XHTML 1.0 ermöglichen in FrontPage 2003 und Visual Studio .NET Quellcode-Bearbeitung mit IntelliSense-Unterstützung sowie eine Validierung des Quellcodes.

FrontPage 2003 und Visual Studio .NET können XML-Schemata auswerten, um einem Benutzer die Erstellung von gültigen Instanzdokumenten zu erleichtern. Dank IntelliSense werden kontextsensitiv erlaubte Elemente, Attribute oder Attributwerte eingeblendet. Das W3C hat vor einiger Zeit Schemata für die drei XHTML-1.0-Varianten Strict, Transitional und Frameset veröffentlicht. Leider weisen diese Schemata Charakteristika auf, die FrontPage und Visual Studio nicht richtig interpretieren können. (Word 2003 kann sie erstaunlicherweise verarbeiten, aber ich weiß nicht, wozu sie dort gut sein könnten.) Ich habe sie deshalb per XSLT mit den Klassen des System.Xml.Schema-Namensraums des .NET-Frameworks in eine äquivalente Form transformiert, die von den beiden Programmen interpretiert werden kann. Die transformierten Schemata sind zum Download Download verfügbar. Das XSLT-Stylesheet selbst ist jetzt ebenfalls im Archiv enthalten, ferner eine Batch-Datei, für deren Ausführung Sie lediglich msxsl.exe benötigen.

Die Schemata sind nun „flach“ organisiert, indem bspw. Verweise auf Attributgruppen oder Typen aufgelöst wurden. Am Beispiel des table-Elements läßt sich die Transformation gut demonstrieren:

Original-Schema

<xs:element name="table">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" ref="caption"/>
      <xs:choice>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="col"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="colgroup"/>
      </xs:choice>
      <xs:element minOccurs="0" ref="thead"/>
      <xs:element minOccurs="0" ref="tfoot"/>
      <xs:choice>
        <xs:element maxOccurs="unbounded" ref="tbody"/>
        <xs:element maxOccurs="unbounded" ref="tr"/>
      </xs:choice>
    </xs:sequence>
    <xs:attributeGroup ref="attrs"/>
    <xs:attribute name="summary" type="Text"/>
    <xs:attribute name="width" type="Length"/>
    <xs:attribute name="border" type="Pixels"/>
    <xs:attribute name="frame" type="TFrame"/>
    <xs:attribute name="rules" type="TRules"/>
    <xs:attribute name="cellspacing" type="Length"/>
    <xs:attribute name="cellpadding" type="Length"/>
  </xs:complexType>
</xs:element>

Transformiertes Schema

<xs:element name="table">
  <xs:complexType>
    <xs:choice>
      <xs:element ref="caption" />
      <xs:element ref="col" />
      <xs:element ref="colgroup" />
      <xs:element ref="thead" />
      <xs:element ref="tfoot" />
      <xs:element ref="tbody" />
      <xs:element ref="tr" />
    </xs:choice>
    <xs:attribute name="id" />
    <xs:attribute name="class" />
    <xs:attribute name="style" />
    <xs:attribute name="title" />
    <xs:attribute name="lang">
      <xs:simpleType>
        <xs:restriction>
          <xs:enumeration value="en" />
          <xs:enumeration value="de" />
          <xs:enumeration value="de-DE" />
          <xs:enumeration value="de-AT" />
          <xs:enumeration value="de-CH" />
          <xs:enumeration value="fr" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="dir">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="ltr" />
          <xs:enumeration value="rtl" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="onclick" />
    <xs:attribute name="ondblclick" />
    <xs:attribute name="onmousedown" />
    <xs:attribute name="onmouseup" />
    <xs:attribute name="onmouseover" />
    <xs:attribute name="onmousemove" />
    <xs:attribute name="onmouseout" />
    <xs:attribute name="onkeypress" />
    <xs:attribute name="onkeydown" />
    <xs:attribute name="onkeyup" />
    <xs:attribute name="summary" />
    <xs:attribute name="width" />
    <xs:attribute name="border" />
    <xs:attribute name="frame">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="void" />
          <xs:enumeration value="above" />
          <xs:enumeration value="below" />
          <xs:enumeration value="hsides" />
          <xs:enumeration value="lhs" />
          <xs:enumeration value="rhs" />
          <xs:enumeration value="vsides" />
          <xs:enumeration value="box" />
          <xs:enumeration value="border" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="rules">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="none" />
          <xs:enumeration value="groups" />
          <xs:enumeration value="rows" />
          <xs:enumeration value="cols" />
          <xs:enumeration value="all" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="cellspacing" />
    <xs:attribute name="cellpadding" />
  </xs:complexType>
</xs:element>

Änderungen und Erweiterungen

Folgende Änderungen wurden vorgenommen:

Installation

FrontPage 2003

Um die Schemata in FrontPage 2003 zu benutzen, müssen sie einfach in den Ordner %CommonProgramFiles%\Microsoft Shared\OFFICE11\SCHEMAS\HTML entpackt werden, danach muß FrontPage neu gestartet werden. Das gewünschte Schema kann dann unter Extras Seitenoptionen… (Dokument)erstellung Schemaversion ausgewählt werden. FrontPage 2003 unterstützt leider kein XHTML, man erhält also zunächst HTML 4.01. Mit dem Befehl XML-Formatierungsregeln anwenden kann man daraus aber leicht XHTML erzeugen. Die Namensraum-Deklaration müssen Sie selbst erstellen, FrontPage beachtet das targetNamespace-Attribut des Schemas nicht.

Außerdem empfiehlt es sich, Extras Seitenoptionen… IntelliSense HTML-Attributwertangaben zu aktivieren.

Visual Studio .NET

Die Schemata sind für FrontPage 2003 optimiert. Für die Verwendung in Visual Studio .NET müssen sie leicht modifiziert werden. Anders als in FrontPage können die XHTML-Schemata hier sowohl für HTML- als auch für XML-Dokumente verwendet werden. Sie können die Schemata in ein Projekt importieren oder zentral in den Verzeichnissen \Common7\Packages\schemas\html bzw. \Common7\Packages\schemas\xml des Installationsverzeichnisses ablegen, so daß sie allen Projekten zur Verfügung stehen.

In .html-Dateien unterstützt Visual Studio XHTML nicht. Bei Änderungen in der Entwurfsansicht wird bspw. <br /> zu <br> geändert, die Erstellung von wohlgeformten XHTML-Dokumenten wird so praktisch unmöglich. Allerdings unterscheiden sich XHTML 1.0 und HTML 4.01 im Vokabular nicht. Sie können deshalb folgende Änderungen an den Schemata in \Common7\Packages\schemas\html vornehmen, um HTML-4.01-Dokumente zu erstellen, aus denen mein Tidy-Filter dann zur Laufzeit XHTML erzeugen kann:

targetNamespace="http://www.w3.org/TR/REC-html40"
vs:friendlyname="HTML 4.01 Strict"
vs:iscasesensitive="false"
vs:implicitclosure="true"
vs:requireattributequotes="false"
xmlns="http://www.w3.org/TR/REC-html40"

In .xml-Dateien funktionieren die Schemata besser, bspw. wird die Namensraum-Deklaration automatisch erstellt und man hat die Garantie, daß Visual Studio nicht den Quellcode ändert. In den Schemata in \Common7\Packages\schemas\xml ändern Sie dazu vs:ishtmlschema="true" in vs:ishtmlschema="false". Andererseits fehlt die HTML-Entwurfsansicht.

Es erweist sich als nachteilig, daß die drei XHTML-Varianten denselben Namensraum http://www.w3.org/1999/xhtml bevölkern, denn Visual Studio bildet offenbar von Schemata mit demselben Ziel-Namensraum die Vereinigungsmenge. Ich persönlich benötige ohnehin nur die Strict-Variante; wer mehr als ein Schema gleichzeitig verwenden möchte, muß sich wohl etwas einfallen lassen.

FrontPage 2000 und 2002

Auch der Microsoft Script Editor, der in FrontPage 2000 und 2002 enthalten ist, kann prinzipiell XML-Schemata verarbeiten und für IntelliSense verwenden. Mit den hier vorgestellten Schemata funktioniert das aber nur sehr unzuverlässig, teilweise werden falsche Elemente und Attribute vorgeschlagen, passende dafür unterschlagen, und es gab sogar Abstürze.

Bekannte Probleme