Шаблоны
14.3. Конструкция шаблонов
В данном разделе обсуждается, как шаблон собирается из составляющих его частей, и рассматриваются конкретные теги. Общая конструкция шаблона приведена в листинге 14.8. Это псевдокод, а не XML:
<top> <stuff/> <template> <rule> ... simple or extended rule info goes here ... </rule> ... zero or more further <rule> tags go here ... </template> <stuff/> </top>Листинг 14.8. Базовая конструкция иерархии тегов шаблона
Здесь тегом, названным <top>, может быть любой обычный XUL тег - <top> не реальный тег. Хотя собственно шаблон начинается тегом <template>, некоторые атрибуты шаблонов могут быть добавлены и к тегу <top>. Другой XUL-контент может предшествовать или окружать тег <top>. Типичные кандидаты для тега <top> - это <tree>, <toolbar>, <menulist>, и <listbox>, но <top> может быть и <box> или даже <button>.
Тег, названный здесь <stuff>, тоже может быть обычным XUL тегом, это не реальный тег. Эти теги опциональны и их может быть любое число. Теги между <top> и <template> копируются и генерируются лишь однажды для каждого шаблона и отображаются графически также единожды перед содержанием шаблона.
Тег <template> - реальный XUL тег. Любой XUL-контент внутри этого тега генерируется один раз для каждого решения, найденного запросом. Тег <template> окружает весь контент, который должен повторяться.
Тег <rule> - также реальный XUL-тег. Это единственный контент, разрешенный внутри тега <template>. Может быть один или более тегов <rule>, и предусмотрена также сокращенная запись, позволяющая не писать ни одного. Каждый тег <rule> отвечает за один запрос шаблона, как описывалось раньше, в разделе "Списки запросов". Каждый тег <rule> также содержит контент. Этот контент воспроизводится каждый раз, когда запрос находит решение.
Система шаблонов имеет несколько разных синтаксисов тега <rule>.
Наиболее гибкий и мощный - расширенный синтаксис шаблона. Этот синтаксис требует, чтобы переменные запроса были определены в одном месте, а применялись впоследствии в другом. Такие переменные называются расширенными. Расширенный синтаксис требует, чтобы каждый тег <rule> содержал ряд специальных тегов шаблона как часть его контента.
Удобный и краткий синтаксис - простой синтаксис шаблона. Этот синтаксис реализован для специального, но широко распространенного случая, когда запрос обращается к контейнеру RDF данных. Пример "hello, world" из листингов 14.6 и 14.7 использует простой синтаксис. Переменные в простом синтаксисе называются простыми переменными шаблона. Простой синтаксис требует, чтобы тег <rule> содержал только простой XUL контент. Этот контент может содержать простые переменные. Когда запрос шаблона находит решение, переменная замещается найденными данными факта.
Если шаблон имеет только один тег <rule>, то простой синтаксис имеет еще и краткую запись. Теги <rule> и </rule> можно отбросить. Краткая запись - иной способ записи простого синтаксиса.
См. детальное описание тега <rule>.
14.3.1. Специальные XUL имена
Система XUL шаблонов имеет несколько специальных имен. Переменные шаблонов не используются нигде, кроме как внутри тега <template>.
14.3.1.1. Расширенные переменные шаблонов
Расширенные переменные шаблонов Mozilla - это переменные, используемые для простых (single fact) запросов и гибких комплексных RDF запросов. Такие переменные всегда появляются внутри XML строк.
Расширенные переменные шаблона начинаются со знака вопроса ("?") и могут содержать любые символы. Регистр букв имеет значение. Они заканчиваются либо пробелом, либо знаком шляпки, или циркумфлекса ("^"), либо концом той строки, в которой они нам встретились. Пробел или шляпка не являются частью переменной. Если встречается пробел, он считается первым знаком контента, не относящимся к переменной. Если шляпка, она просто игнорируется.
Следующие имена переменных идентичны. Третий пример содержит XML сущность, означающую пробел.
"?name " "?name^" "?name& #x20;"
Следующие примеры - тоже правильные имена. Мы рекомендуем, однако, всегда использовать значащие имена.
"?name_two" "?nameThree" "?name-four" "?name66" " ?66name" "?$%@$z+"
14.3.1.2. Простые переменные шаблонов
Простая запись для правил (см. тег " <rule> ") имеет свои "переменные". Эти переменные - попросту URI предикатов факта. Такие переменные всегда появляются внутри XML строк.
Простые переменные имеют формат:
rdf:URI
Такие переменные также оканчиваются пробелом (" ") либо шляпкой ("^"), либо заканчиваются вместе с содержащей их строкой. Пробел и шляпка не являются частью переменной. Пробел считается первым символом контента, не являющимся переменой, шляпка просто игнорируется.
Часть простой переменной, являющаяся URI, должна быть валидным URI. Если переменная должна быть обработана содержательно, URI должен соответствовать контексту, в котором используется.
"rdf:urn:test:example:more" "rdf:http://www.test.com/Test#Data"
14.3.1.3. Интерполяция переменных
И расширенные, и простые переменные используются только в значениях XUL атрибутов. Когда контент генерируется шаблоном, переменные замещаются найденными значениями.
Когда запрос находит решение, генерируется контент. Когда это случается, имена переменных в содержащих их строках просто замещаются их значениями. Если при этом переменная не имеет обосновывающего ее значения (это возможно, если используется тег <binding> ), то она замещается строкой длины ноль.
14.3.1.4. Специальные URI и пространства имен
Система шаблонов использует несколько специального вида URI и пространств имен. URI схема "rdf" используется для представления данных, генерируемых самой платформой Mozilla. Вот список URI такого типа, реализованных в настоящее время:
rdf:addressdirectory rdf:bookmarks rdf:charset-menu rdf:files rdf:history rdf:httpindex rdf:internetsearch rdf:ispdefaults rdf:local-store rdf:localsearch rdf:mailnewsfolders rdf:msgaccountmanager rdf:msgfilters rdf:smtp rdf:subscribe rdf:window-mediator
Есть два специальных вида такого типа URI. URI:
rdf:null
означает использование источника данных, не содержащего фактов. Такой источник данных, как правило, получит данные позднее из JavaScript. URI:
rdf:*
специфичная только для Mozilla запись, означающая "соответствует любому предикату". Использование звездочки ("*") навеяно ее применением в CSS2 - in CSS2 она тоже означает "соответствует всему". Этот URI следует рассматривать как специальный случай простой переменной. Он не идентифицирует определенный ресурс. Есть также устаревшая запись для этого случая:
...
Эта запись идентична эллипсису (троеточию), за исключением того, что это не один знак, а три отдельные точки. Такая устаревшая запись означает то же самое, что и rdf:*, но теперь ее не следует использовать.
В таблице 11.3 приведены пространства имен, применяемые Mozilla для работы с фактами RDF. Если шаблон использует внутренние источники данных, эти пространства имен можно задействовать для идентификации предикатов/свойств в этих источниках данных.
В XML часто используют атрибут xmlns, чтобы заменить длинный URL пространства имен коротким алиасом. В системе шаблонов практически всегда следует использовать полный URL, а не алиас. Это не следует из XML стандарта, просто Mozilla так устроена. Если алиас употреблен в значении атрибута, он не будет заменен полным именем средствами самого XML. Значит, обрабатывать эти имена приходится платформе. Mozilla не знает, как определить или расшифровать алиасы xmlns внутри значений атрибутов, поэтому требуется полный URL. Единственное место, где можно использовать алиас xmlns, это атрибут тега <rule>. В этом случае алиас используется как имя атрибута, а не как его значение, и может быть обработан стандартными средствами парсинга XML.