# Template Attribute Language

Die Template Attribute Language (TAL, sinngemäß übersetzt: „Attributbasierte Schablonensprache“) ist eine Templatesprache zur Generierung von HTML- und XML- (und damit auch XHTML-) Seiten. Sie verfolgt das Ziel, die Zusammenarbeit von Designern und Programmierern zu erleichtern, indem sowohl die Templates als auch die Ergebnisseiten gültige Dokumente ihrer Auszeichnungssprache sind. Die Templates können deshalb mit Designwerkzeugen bearbeitet werden, die von TAL nichts wissen, aber die ihnen unbekannten Attribute unbehelligt lassen.
Die TAL entstand im Rahmen des Web-Anwendungsservers Zope; dort wird in der Regel von Zope Page Templates gesprochen.
TAL abstrahiert völlig von der eingesetzten Programmiersprache; lediglich die eingesetzte Sprache für die Ausdrucksauswertung (in der Regel TALES) kann implementierungsabhängig sprachspezifische Ausdrücke erlauben, meist in Python.

## Überblick

TAL-Templates werden erstellt als Ergebnisdokumente, bei denen die variablen Inhalte durch spezielle Attribute übersteuert werden; Programmcode außerhalb von Elementen, wie z. B. in PHP oder JSP, ist nicht nötig. Im folgenden Beispiel würde das Element <h1>
von einem üblichen HTML-Editor als
behandelt, während die Anwendung des Templates durch den Application-Server
ergibt. Die Angabe eines konstanten Strings ist natürlich ein in der Praxis eher vernachlässigbarer Fall; die möglichen Attributwerte werden von der TAL Expression Syntax (TALES) definiert. So können in den vorhandenen Python-Implementierungen beispielsweise Python-Ausdrücke verwendet werden.
Wenn XML-Dokumente generiert werden sollen, ist es wichtig, den XML-Namespace einzutragen (xmlns:tal="http://xml.zope.org/namespaces/tal").

### Makros

Mit Hilfe der METAL (Macro Expansion TAL) ist es möglich, Code über Template-Grenzen hinweg wiederzuverwenden.

### Internationalisierung

Mit Hilfe der i18n-Attribute (siehe i18n TAL) können lokalisierte Seiten generiert werden.

## Attribute

Es werden folgende Attribute erkannt, denen im Normalfall das Präfix tal: vorangestellt werden muss:

### define

    erzeugt innerhalb des durch das Element definierten Blocks gültige, lokale Variablen

### condition

    entscheidet, ob das Element erzeugt wird

### repeat

    erzeugt eine Schleifenvariable, mit der über eine Sequenz iteriert wird, z. B. um eine Auswahlliste oder eine Tabelle zu erzeugen

### content

    ersetzt den Inhalt des Elements

### replace

    ersetzt das Element (und ist deshalb nicht gemeinsam mit content oder attributes einsetzbar)

### attributes

    ersetzt die angegebenen Attribute (z. B. könnten mit tal:attributes="name name; id name" Name- und ID-Attribut eines Eingabefelds mit Hilfe der Variablen „name“ definiert werden)

### omit-tag

    erlaubt, das Tag dynamisch fortzulassen und nur den Inhalt darzustellen

### on-error

    wird ausgeführt, wenn ein Fehler auftritt, und funktioniert dann wie „content“
Wenn ein Element mehrere TAL-Attribute hat, werden diese (unabhängig von der Reihenfolge ihrer Notierung) in der oben angegebenen (logisch naheliegenden) Reihenfolge ausgewertet; die Reihenfolge der Variablen-Definitionen innerhalb eines „define“-Attributs ist hingegen signifikant, sodass eine Variable in späteren Zuweisungen in demselben define-Attribut verwendet werden kann.
Wenn es kein Element gibt, das sich als Träger der TAL-Attribute anbietet, können auch spezielle TAL-Tags verwendet werden; in diesem Fall ist das Präfix tal: optional. Beispiel:
Der Code innerhalb des <tal:if>-Elements wird dabei verwendet, wenn beispielsweise die im Kontext (was immer das für den verwendeten Application-Server bedeutet, beispielsweise ein Objekt) definierte Variable „itemlist“ true ist, im Falle einer Liste also mindestens ein Element enthält. Der Bezeichner nach dem Doppelpunkt ist dabei beliebig; er muss lediglich bei öffnendem und schließendem Tag gleich sein.

## Verwendung

TAL/TALES/METAL werden von folgenden Projekten verwendet:
* Web-Anwendungsserver Zope
* Roundup (Bugtracker)

## Andere Implementierungen

Neben der ursprünglichen Zope-Implementierung gibt es (ohne Anspruch auf Vollständigkeit) die nachfolgend aufgeführten:

### Java

* JPT: Java Page Templates (christophermrossi.com)
* JavaZPT (javazpt.sourceforge.net)

### JavaScript

* Distal (http://code.google.com/p/distal)
* DomTal (https://github.com/drslump/DomTal)

### Perl

* PETAL, die Perl Template Attribute Language (search.cpan.org)
* Template-TAL (search.cpan.org)

### PHP

* PHPTAL, die PHP Inkarnation von TAL (https://phptal.org/)

### Python

* SimpleTAL (owlfish.com TAL-guide)
* OpenTAL (savannah.nongnu.org)
* ZPT (zpt.sourceforge.net – eine Standalone-Version der Zope Page Templates)
* Chameleon (https://chameleon.readthedocs.io)

### XSL

* XSLTAL, transformiert TAL mittels XSL in XSLT (http://wiki.flux-cms.org/display/FLX/Templates+XSLTAL)