Процессор шаблонов Вход: Выход: Формат файла шаблона Каждая директива процессора шаблонов располагается между признаком начала директивы и признаком конца директивы. Признак начала директивы: <% Признак конца директивы: %> <%Директива%> Выражения <Выражение> := <Константа> | <Имя переменной> | <Унарный оператор> <Выражение> | <Выражение> <Бинарный оператор> <Выражение> | <Функция> ( <Параметры> ) <Константа> := <Число> | <Строка> | <Булевая константа> <Строка> := "(<Символ>)" | '(<Символ>)' <Булевая константа> := TRUE | FALSE <Унарный оператор> := NOT | ! <Бинарный оператор> := AND | OR | || | AND | && | <> | != | == | <= | >= | < | > | + | - | / | * <Функция> := STR | VAL | FILE | EXISTS | RANDOM | VAR | EVAL <Параметры> := <Параметр> (,<Параметр>) <Параметр> := <Выражение> Функции Функция | Описание | STR(Parameter) | Преобразует параметр Parameter к строковому типу | VAL(Parameter) | Преобразует параметр Parameter к числовому типу | FILE(Parameter) | Преобразует параметр Parameter к файловому типу | EXISTS(Parameter) | TRUE, если переменная с именем Parameter определена | FALSE, иначе | RANDOM(A,B) | Возвращает псевдослучайное целое число из диапазона [A,B] | VAR(Parameter) | Возвращает значение переменной с именем Parameter | EVAL(Parameter) | Вычисляет значение выражения Parameter | Пример. Функция EVAL. Шаблон | Данные | Выбери себе: <%Objects EXISTS(EVAL(Exp))%> <%=Objects.INDEX%>. <%=EVAL(Exp)%> <%/%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data anchor="1"> <Exp>Objects.Object</Exp> <Objects> <Object index="1">Велосипед</Object> <Object index="2">Мотоцикл</Object> </Objects> </data> <data anchor="2"> <Exp>VAR("Objects.Object"+Objects.INDEX)</Exp> <Object1>Велосипед</Object1> <Object2>Мотоцикл</Object2> <Object3>Машина</Object3> </data> </xml> | Результат (Набор данных #1) | Выбери себе: 1. Велосипед 2. Мотоцикл | Результат (Набор данных #2) | Выбери себе: 1. Велосипед 2. Мотоцикл 3. Машина | Вставка выражения <%=Expression%> где Expression - выражение. Включение файла <%=FILE(Expression)%> Где результатом вычисления выражения Expression является строка, содержащая имя файла. Блоки При помощи блоков организуются циклы. Формат блока: <%BlockName%> Тело блока <%/%> где BlockName - имя блока. В файле данных должна быть определена переменная с именем BlockName. Значение этой переменной указывает количество повторений тела блока. Пример. Блоки. Шаблон | Данные | <%Object%> Привет с большого <%=Object.Text%>. <%/%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data> <Object>2</Object> <Object> <Text index="1">бодуна</Text> <Text index="2">застолья</Text> </Object> </data> </xml> | Результат | Привет с большого бодуна. Привет с большого застолья. | Блоки могут быть вложенными. Пример. Вложенные блоки. Шаблон | Данные | <%Size%> <%Object%> Привет с <%=Size.Text%> <%=Object.Text%>. <%/%> <%/%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data> <Size>2</Size> <Size> <Text index="1">большого</Text> <Text index="2">маленького</Text> </Size> <Object>2</Object> <Object> <Text index="1">бодуна</Text> <Text index="2">застолья</Text> </Object> </data> </xml> | Результат | Привет с большого бодуна. Привет с большого застолья. Привет с маленького бодуна. Привет с маленького застолья. | Переменная INDEX В каждом блоке определена переменная INDEX строкового типа, которой автоматически присваивается номер текущей итерации цикла. Пример. Переменная INDEX. Шаблон | Данные | Выбери себе: <%Objects%> <%=Objects.INDEX%>. <%=VAR("Object"+Objects.INDEX)%> <%/%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data> <Objects>3</Objects> <Object1>Велосипед</Object1> <Object2>Мотоцикл</Object2> <Object3>Машина</Object3> </data> </xml> | Результат | Выбери себе: 1. Велосипед 2. Мотоцикл 3. Машина | Условные блоки С помощью условных блоков организуются циклы с предусловием (while) (когда количество итераций неизвестно заранее). Формат условного блока: <%BlockName Condition%> Тело блока <%/%> где BlockName - имя блока, Condition - условие. Тело блока повторяется до тех пор, пока выражение Condition имеет значение TRUE. Пример. Условные блоки. Шаблон | Данные | Выбери себе: <%Objects EXISTS(VAR("Objects.Object"+Objects.INDEX))%> <%=Objects.INDEX%>. <%=VAR("Objects.Object"+Objects.INDEX)%> <%/%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data anchor="1"> <Objects> <Object1>Велосипед</Object1> <Object2>Мотоцикл</Object2> </Objects> </data> <data anchor="2"> <Objects> <Object1>Велосипед</Object1> <Object2>Мотоцикл</Object2> <Object3>Машина</Object3> </Objects> </data> </xml> | Результат (Набор данных #1) | Выбери себе: 1. Велосипед 2. Мотоцикл | Результат (Набор данных #2) | Выбери себе: 1. Велосипед 2. Мотоцикл 3. Машина | Условный оператор С помощью условного оператора осуществляются ветвления. Формат условного оператора: <%IF Condition%> TrueText [ <%ELSE%> FalseText ] <%/%> где Condition - булевое выражение. Если значение выражения Condition - истина (TRUE), то процессором обрабатывается TrueText, иначе (FALSE) - если присутствует директива ELSE, то процессором обрабатывается FalseText. Пример. Условный оператор. Шаблон | Данные | Начало <%IF EXISTS(Include)%> <%=FILE(Include)%> <%/%> Конец | <?xml version="1.0" encoding="windows-1251"?> <xml> <data anchor="1"> <Include>text.txt</Include> </data> <data anchor="2"> </data> </xml> | Файл text.txt | Привет с большого бодуна. | Результат (Набор данных #1) | Начало Привет с большого бодуна. Конец | Результат (Набор данных #2) | Начало Конец | Пример. Условный оператор с частью ELSE. Шаблон | Данные | Начало <%IF EXISTS(Include)%> <%=FILE(Include)%> <%ELSE%> Кина не будет <%/%> Конец | <?xml version="1.0" encoding="windows-1251"?> <xml> <data anchor="1"> <Include>text.txt</Include> </data> <data anchor="2"> </data> </xml> | Файл text.txt | Привет с большого бодуна. | Результат (Набор данных #1) | Начало Привет с большого бодуна. Конец | Результат (Набор данных #2) | Начало Кина не будет Конец | Блок PRE Формат: <%PRE%>Text<%/%> Внутри блока PRE удаление невидимых символов не производится даже при задании опции процессора /i. То же относится и к включаемым внутрь этого блока файлам. Формат файла данных Данные представляются в формате XML. <xml> <data> Общие данные для всех наборов </data> <data anchor="1"> Набор данных #1 </data> ... <data anchor="i"> Набор данных #i </data> </xml> Файл данных должен содержать корневой тег. Файл данных может содержать более одного набора данных. Каждый набор данных содержится внутри тега data. Атрибут anchor тега data определяет номер набора данных. Внутри тега data с пустым значением атрибута anchor находятся общие для всех наборов данные. Пример. Использование простых переменных. Шаблон | Данные | Привет с <%=Size%> <%=Object%>. | <?xml version="1.0" encoding="windows-1251"?> <xml> <data> <Size>большого</Size> <Object>бодуна</Object> </data> </xml> | Результат | Привет с большого бодуна. | Переменная может иметь значение, состоящее из нескольких строк. Пример. Использование мультистроковых значений. Шаблон | Данные | <%=Text%> | <?xml version="1.0" encoding="windows-1251"?> <xml> <data> <Text><![CDATA[Столько строк, сколько надо.]]></Text> </data> </xml> | Результат | Столько строк, сколько надо. | Пример. Использование наборов данных. Шаблон | Данные | Привет с <%=Size%> <%=Object%>. | <?xml version="1.0" encoding="windows-1251"?> <xml> <data anchor="1"> <Size>большого</Size> <Object>бодуна</Object> </data> <data anchor="2"> <Size>маленького</Size> <Object>застолья</Object> </data> </xml> | Результат (Набор данных #1) | Привет с большого бодуна. | Результат (Набор данных #2) | Привет с маленького застолья. | |