Типове обекти
Съдържание
Задача. Визуално покажете колко добри са обектите в XSLT.
Същностите са различни. Според предназначението си те се делят на два вида: обикновени (обща същност) и параметрични (параметрична същност).
Обикновени същества
Да започнем с обичайните - това са обекти, които съхраняват някакъв постоянен текст. Най-простият пример е обикновен обект, съдържащ непрекъсващ интервал.
За да използвате който и да е обект, той първо трябва да бъде дефиниран. Синтаксисът за дефиниране на обикновен обект е:
Този формат е еднакъв за обекти както с външна, така и с вътрешна връзка, т.е. не зависи от това дали обектът е дефиниран в отделен файл или директно в кода на XSL шаблона.
След като сме дефинирали обикновен обект, можем да го използваме. Как да направите това, всички отдавна знаят:
Интересно свойство на обектите е, че те могат да участват в значението на други обекти:
Тук обаче е важно да не се увличате и да се уверите, че обектите не се отнасят един към друг (за да няма циклични зависимости). Въпреки че в този случай трансформаторът, разбира се, ще съобщи, че е открил цикъл и ще ви помоли да спрете хулиганството.
Сега нека си припомним как се дефинира същността на неразривното пространство:
В допълнение към препратките към символи има обекти, които XML процесорът винаги трябва да разбира, независимо дали са дефинирани или не. Това са XML служебни символи:
- по-малко
- > Повече ▼
- & амперсанд
- ' единичен цитат
- “ двоен кавичка
Следователно, ако напишем XSL библиотека и искаме да използваме един от петте посочени обекта в нея, тогава можем да направим това без никакъв страх. Препратките към символи също могат да се използват по същия начин, разбира се.
Посочен начин за определянеобщи субекти:
не е единственият. Факт е, че така се дефинират вътрешните обикновени субекти. А има и външни (външни) обикновени обекти, които се отнасят до външен файл. Те са полезни в ситуация, в която искате да пъхнете в обект не просто текст, а цяла част от XML. Те се дефинират така:
Всяко маркиране може да бъде във външен файл. Помислете за това на примера на отделен файл с авторски права.
На изхода получаваме:
За съжаление в ежедневната работа този вид образувание е малко полезно. Дори не знам кой може да има нужда от такива извращения, защото ние, като имаме XSL, решаваме такива задачи (когато искаме да използваме едно и също маркиране няколко пъти), като подчертаваме прост шаблон с име. Накратко, тук споменах външни обикновени обекти само за пълнота.
Сега мисля, че е ясно защо в първата част на статията, когато описвах как да свързвам обекти, използвах дългосрочния термин „субекти с външна / вътрешна връзка“, а не само „външни / вътрешни обекти“. Тъй като външните / вътрешните единици са отделни неща със собствено значение.
Още веднъж, за да няма каша в главата ми. Обектите могат да бъдат свързани към XML документ по три начина: вътрешен (в рамките на XML документа), външен (в отделен файл) и комбиниран. Самите обекти също могат да бъдат външни и вътрешни - вътрешните съхраняват прост текст, а външните се отнасят към отделен файл, който може да съдържа всякакви сложни маркировки.
Параметрични обекти
Нека да преминем към параметричните обекти. Това са обекти, които освен обикновен текст или маркиране могат да съдържат и кода на други обекти. По-конкретно, те могат да съдържат DTD код (припомнете си, че обектите са част от езика DTD). Параметрични обектисъщо са вътрешни и външни.
Да започнем с външните, тъй като те представляват най-голям интерес. Външните параметрични обекти се дефинират, както следва:
Обръщаме внимание на знака за процент преди името на обекта - той просто отличава обикновените обекти от параметричните. Файлът, посочен от параметричен обект, може да съхранява дефиниции на други обекти:
След това можем да свържем обекти, съхранени във външен файл (посочен от параметричен обект) към XML документа:
%ent; е използването на предварително дефиниран параметричен обект и е същото като да напишете съдържанието на файла entities.dtd на същото място и да свържете обектите от този файл по този начин. И така, форматът за използване на параметричен обект е:
Всичко е същото като при обикновените обекти, само вместо амперсанд се използва процент.
Защо се нуждаем от параметрични обекти, ако можем да свържем външен файл с обекти по обичайния начин? Да, последният пример наистина е еквивалентен на външната връзка, която вече направихме:
Но сокът се крие във факта, че с помощта на този вид обекти можем да включим повече от един файл, което не е възможно при нормална външна връзка. Тоест следното е напълно законно:
Доста полезно нещо, особено ако проектът е голям, има много XSL и има любители на използването на обекти. Нека си представим, че проектът има сто XSL файла (цифрата е съвсем реална) и, да речем, пет от тях отговарят за определен раздел на сайта, например за продуктова карта. Много е възможно всички тези пет XSL файла да искат да използват едни и същи обекти в своя код, така че би било хубаво да поставите всички такива общи обекти във външен файл. Имаме такъв файл - entities.dtd, в неговсички глобални обекти на проекта се съхраняват. Но поставянето в него на обекти, свързани само с нашата продуктова карта, не е много добро.
Кой в такава ситуация може да задоволи страстта ни към ред? Разбира се, параметрични външни обекти. Създаваме файл entitiesproductcard.dtd, поставяме всички обичайни обекти на продуктовата карта в него и го свързваме (заедно с глобалния entities.dtd) с помощта на параметричен обект.
Когато сравнявахме обекти с променливи, имахме пример с различни видове продукти и различни оформления. Нека пренапишем този пример, като изтеглим обектите, които съхраняват типове продукти във външен файл.
С този подход все още можем да използваме както глобални обекти от entities.dtd, така и повече локални обекти от entitiesproductcard.dtd. Тази опция за свързване на обекти може да бъде пренаписана отново по-компактно с помощта на комбиниран метод:
Усложнявам задачата. Възможно е един от петте XSL файла, отговорни за нашата продуктова карта, да иска да има частен обект, който другите не трябва да виждат. Няма съмнение, можем да направим и това, защото никой не е отменил обикновените обекти с вътрешна връзка:
Този пример добре илюстрира някаква йерархия от обекти: глобални? партида (пет XSL-файла на продуктовата карта) ? местен. Отново ще направя уговорка, подобни усложнения носят своите дивиденти само когато проектът е наистина голям, има много обекти и е необходимо тяхното специално каталогизиране.
Тъй като говорим за йерархия, бих искал да добавя два цента за припокриващите се обекти. Същността не може да бъде пренебрегната. Това означава, че стойността на даден обект се взема от първата му намерена дефиниция. Помислете за пример.
Това означава, че е взета стойността на първия намерен обект &suchnost във файла ent_global.dtd. Носъщностите са коварни, така че има уловка. Ако използвате комбинирана връзка:
тогава получаваме различен резултат:
Това предполага, че първо се обработват обекти с вътрешна връзка, а след това с външна.
Ужас. Разбира се, нормален човек няма да напише така, но веднага ще определи обикновен субект без никакви параметрични. Ако говорим за реална употреба, тогава вътрешните параметрични обекти се използват широко в кода на HTML doctypes (те са написани само на езика DTD). Да кажем, че параметричният обект %coreattrs; , чиято стойност е някакъв DTD код:
Този код ни казва, че основните HTML атрибути са id, class, style и title, че техните типове стойност са такива и такива и че присъствието на тези атрибути не е задължително. Очевидно този обект е направен, за да се използва много пъти в кода на doctype за определяне на атрибутите, които може да има един HTML елемент.
Но ние няма да пишем doctypes. Просто си струва да знаете, че има такъв „звяр“ - вътрешни параметрични единици. Изведнъж утре ще се обадят на читателя и ще му предложат да работи в W3C. И ако това се случи, той със сигурност трябва да знае формата на такива обекти:
Нека обобщим субектите като цяло. Те биват обикновени и параметрични, външни и вътрешни. Най-полезните от гледна точка на XSL са обикновените вътрешни и параметричните външни. Обектите могат да бъдат свързани към XML документ по три начина: външен, вътрешен и комбиниран. Ако искате да съхранявате обикновен текст за повторна употреба в XSL код, обектите изглеждат по-добре от променливите.