Обекти и как да ги свържете
![]() | Задача. | ![]() |
![]() | ![]() |
В студийните XSL често използваме обекти (те също са обекти или „субекти“). Къде щяхме да бъдем без тях, защото се опитваме да не забравяме за типографията - или трябва да поставите неразделен интервал, или тире -. Но не само типографията ограничава полезността на обектите. Тази полза ще бъде обсъдена в тази статия.
Първо, нека да разберем как да свързваме обекти към Има три опции за свързване (никой не припада): външни, вътрешни и комбинирани.
Да започнем с по-позната връзка - външна. Изглежда като:
Този запис често присъства в началото на XSL файлове:
След това трансформаторът ще се опита да изтегли този файл и ако не успее, ще даде грешка при анализа на шаблона. Това поведение е различно от това, което се случва при дефиниране на пространство от имена, където URI е просто уникален идентификатор, който не изисква никакви файлове да бъдат изтеглени.
Трябва да кажа, че всички тези правила за свързване се отнасят не толкова до обекти, колкото до езика DTD (Definition Type на документа), специален език, с който можете да опишете структурата.Обектите са само малка част от този език, но от всички DTD обектите са намерили широко приложение в XSL, така че ние фокусираме вниманието си изключително върху тях.
Бележка към собственика
DTD с външна връзка се разделят на два подвида: частни, за които знае тесен кръг от хора (споменатите entities.dtd), и публични, публични, за които знае целият свят (HTML doctype).
Посоченият синтаксис се прилага само за частни DTD.
Като включим файл с обекти, можем да ги използваме. Например втипографски цели:
Ползите от аутсорсинг на обекти са известни от дълго време - това ви позволява да съхранявате в един и същ файл entities.dtd всички глобални обекти, които може да са ви необходими в различни XSL файлове.
Обикновено този entities.dtd декларира много различни обекти, които се използват в целия проект. Дефиницията на, да речем, неразривно пространство изглежда така:
Вторият начин за свързване на обекти е вътрешно свързване. Прави се така:
Нека пренапишем последния пример с помощта на вътрешно съединение:
Този метод е удобен в случаите, когато имаме само един XSL файл и не искаме да създаваме отделен файл с обекти. Например, когато пишем XSL библиотека, която използва някакъв вид обект, и не искаме да носим два файла със себе си. След това, като използвате такава вътрешна връзка, можете да декларирате обекти директно в кода на този единичен XSL файл.
И накрая, последният, най-интересен начин е комбиниран. Той се крие във факта, че можем едновременно да свързваме обекти с външен файл и да дефинираме нови директно в XSL шаблона. Комбинираният формат на връзка е както следва:
Тази връзка е полезна, когато имаме нужда от обекти от глобалния entities.dtd и в същото време искаме да дефинираме някои константи, които са необходими само в текущия XSL файл (например CSS класове, които се използват на няколко места).
Нека разгледаме такава ситуация на пример за кошница в магазина. Трябва да е HTML таблица със заглавен ред и няколко реда за артикулите в количката:
Тази таблица има две колони - името на продукта и неговата цена. CSS класовете за тези колони се появяват на две места, в заглавката на таблицата и в тялото, така че преместих тези класове в отделни вътрешни обекти &CLASS_TITLE; И&CLASS_COST;. Но в същото време използвах обекта &content, дефиниран в entities.dtd. Този обект съхранява XPath до елемента входяща кутия, който съдържа данни за текущата страница, включително списъка с продукти в количката.
И сега най-„вкусното“ място - обекти с вътрешна връзка не се виждат никъде освен текущия XSL файл. Тоест, ако сме написали шаблон, дефинирайки обектите, от които се нуждаем вътре в него, и някой е импортирал нашия шаблон, тогава нашите обекти няма да се намесят под краката му. Освен това импортиращ шаблон в себе си може да дефинира обект със същото име като нашето. В този случай няма да възникне конфликт на имена, всеки ще използва свой собствен обект, дефиниран в своя XSL файл.
Основен шаблон main.xsl:
Шаблон за импортиране import.xsl:
Изпълнението на основния шаблон ще даде резултат:
Това поведение е характерно не само за вътрешната връзка на субектите, но и за външната връзка. Следователно общото правило е, че обектите са видими само в XSL файла, към който са свързани, и в никой друг. Това е разбираемо, защото „субект“ е термин, който се отнася не само за XSL, но като цяло за XML, който не знае нищо за каквито и да е импортирани шаблони. Просто има отделен (в нашия случай това е XSL шаблон), към който е свързан DTD.