Пособие XML и XSLT - Факультет прикладной математики

реклама
ÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ
Ôàêóëüòåò ïðèêëàäíîé ìàòåìàòèêè ïðîöåññîâ óïðàâëåíèÿ
À. Â. ÌÀÒÐÎÑÎÂ
ÒÅÕÍÎËÎÃÈÈ ÐÀÇÐÀÁÎÒÊÈ
ÈÍÒÅÐÍÅÒ-ÏÐÈËÎÆÅÍÈÉ
×ÀÑÒÜ 1
Ó÷åáíîå ïîñîáèå
Ñàíêò-Ïåòåðáóðã
2007
ÓÄÊ 681.3
M34
Ð å ö å í ç å í ò û : ê-ò ôèç.-ìàò. íàóê, äîö. Ô.À. Íîâèêîâ (Ñ.-Ïåòåðá. ãîñ.
ïîëèòåõí. ó-íò); ä-ð ôèç.-ìàò. íàóê, ïðîô. Å.È. Âåðåìåé (Ñ.-Ïåòåðá. ãîñ. ó-íò)
Ïå÷àòàåòñÿ ïî ïîñòàíîâëåíèþ Ðåäàêöèîííî-èçäàòåëüñêîãî ñîâåòà
ôàêóëüòåòà ïðèêëàäíîé ìàòåìàòèêè ïðîöåññîâ óïðàâëåíèÿ
Ñàíêò-Ïåòåðáóðãñêîãî ãîñóäàðñòâåííîãî óíèâåðñèòåòà
M34
Òåõíîëîãèè ðàçðàáîòêè Èíòåðíåò-ïðèëîæåíèé.
×àñòü 1: Ó÷åá. ïîñîáèå / Ìàòðîñîâ À.Â. ÑÏá.: ÑÎËÎ, 2007. 115 ñ.
ISBN 598340062-2
 ó÷åáíîì ïîñîáèè ðàññìàòðèâàþòñÿ ñîâðåìåííûå òåõíîëîãèè
ðàçðàáîòêè Èíòåðíåò-ïðèëîæåíèé.  ïåðâîé ÷àñòè îïèñàí ðàñøèðÿåìûé ÿçûê ðàçìåòêè äîêóìåíòîâ XML äëÿ ñîçäàíèÿ ñòðóêòóðèðîâàííûõ äîêóìåíòîâ, à òàêæå ïðåäñòàâëåíà îáðàáîòêà XMLäîêóìåíòîâ ñ ïîìîùüþ ïðåîáðàçîâàíèé XSLT è íà îñíîâå îáúåêòíîé ìîäåëè DOM íà ñòîðîíå êëèåíòà.
Ïîñîáèå ïðåäíàçíà÷åíî äëÿ ñòóäåíòîâ óíèâåðñèòåòîâ, îáó÷àþùèõñÿ ïî ñïåöèàëüíîñòè èëè íàïðàâëåíèþ ¾Ïðèêëàäíàÿ ìàòåìàòèêà è èíôîðìàòèêà¿ è íàïðàâëåíèþ ¾Èíôîðìàöèîííûå òåõíîëîãèè¿.
Áèáëèîãð. 7 íàçâ. Èë. 21.
Ðàáîòà âûïîëíåíà ïðè ïîääåðæêå Ôåäåðàëüíîãî àãåíòñòâà ïî
îáðàçîâàíèþ â ðàìêàõ Íàöèîíàëüíîãî ïðîåêòà Îáðàçîâàíèå.
Èííîâàöèîííûé ïðîåêò ÑÏáÃÓ Èííîâàöèîííàÿ
îáðàçîâàòåëüíàÿ ñðåäà â êëàññè÷åñêîì óíèâåðñèòåòå,
ÈÎÏ Ïðèêëàäíàÿ ìàòåìàòèêà è èíôîðìàòèêà
c
ISBN 598340062-2
À. Â. Ìàòðîñîâ, 2007
ÃËÀÂÀ 1.
ÐÀÑØÈÐßÅÌÛÉ ßÇÛÊ ÐÀÇÌÅÒÊÈ XML
Ÿ1. Îáðàáîòêà òåêñòà
Îáðàáîòêà òåêñòà îäíà èç äèñöèïëèí èíôîðìàòèêè (íàóêè î êîìïüþòåðàõ, èõ èñïîëüçîâàíèè è ðàçâèòèè), çàíèìàþùàÿñÿ
ðàçðàáîòêîé è ðåàëèçàöèåé êîìïüþòåðíûõ ñèñòåì àâòîìàòèçàöèè
ïðîöåññîâ ñîçäàíèÿ è îïóáëèêîâàíèÿ äîêóìåíòîâ.
Ïåðâîíà÷àëüíî ýòè ñèñòåìû ðàçðàáàòûâàëèñü èñêëþ÷èòåëüíî
äëÿ àâòîìàòèçàöèè ïðîöåññà íàáîðà è ôîðìàòèðîâàíèÿ òåêñòà. Â
íèõ ñîñòàâëÿëñÿ ìàêåò (rendition) áóäóùåãî äîêóìåíòà, äëÿ ÷åãî
íåïîñðåäñòâåííî â ñàì äîêóìåíò âñòàâëÿëèñü êîìàíäû ôîðìàòèðîâàíèÿ åãî ÷àñòåé (ðàçìåòêà ôîðìàòèðîâàíèÿ). Ìàêåò ïðåîáðàçîâûâàëñÿ â âîñïðèíèìàåìîå ÷åëîâåêîì ïðåäñòàâëåíèå äîêóìåíòà
ïîñëå îáðàáîòêè åãî ñïåöèàëüíîé ïðîãðàììîé, êîòîðàÿ ¾ïîíèìàëà¿
èñïîëüçîâàííûé ÿçûê ôîðìàòèðîâàíèÿ. Ïðèìåðàìè ïîäîáíûõ ñèñòåì ÿâëÿþòñÿ tro (îäèí èç ðåäàêòîðîâ UNIX), ñèñòåìû íà áàçå
êîìàíä ôîðìàòèðîâàíèÿ RTF è LATEX.
Íàïðèìåð, ðàçìå÷åííûé êîìàíäàìè LATEX ôðàãìåíò äîêóìåíòà ìîæåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Ýòî ðàçìå÷åííûé
âûäåëåííûå {\it
ñëîâà. Îáðàòèòü
ìîæíî òàêæå åãî
ðàçìåðà}.
äîêóìåíò. Â íåì ìîæíî íàéòè
êóðñèâîì} èëè {\bf ïîëóæèðíûì} øðèôòîì
âíèìàíèå ÷èòàòåëÿ íà êàêîé-ëèáî òåðìèí
{\large âûäåëåíèåì øðèôòîì áîëüøåãî
Ïîñëå îáðàáîòêè åãî êîìïèëÿòîðîì îí áóäåò âûãëÿäåòü êàê
ïðåäñòàâëåíî íà ðèñ. 1.1.1:
Ðèñ. 1.1.1. Òåêñò ôîðìàòà LaTeX ïîñëå îáðàáîòêè òðàíñëÿòîðîì
TeX.
3
Ïîäîáíûé ïîäõîä ê àâòîìàòèçèðîâàííûì ñèñòåìàì îáðàáîòêè
òåêñòà ïîëó÷èë äàëüíåéøåå ðàçâèòèå â MS Word è Adobe PageMaker, ñêðûâ îò ïîëüçîâàòåëÿ ýòàï êîìïèëÿöèè. Ýòè òåêñòîâûå
ïðîöåññîðû, ïîñòðîåíû òàêèì îáðàçîì, ÷òî ïîëüçîâàòåëü íå ââîäèò
ñàìèõ êîìàíä ôîðìàòèðîâàíèÿ â îáðàáàòûâàåìûé òåêñò, íî ïðèìåíÿÿ èõ ê òåêñòó ñðàçó æå âèäèò êîíå÷íûé ðåçóëüòàò â îêíå îòîáðàæåíèÿ ñîîòâåòñòâóþùåé ïðîãðàììû. Ïîäîáíûé ïîäõîä èçâåñòåí
ïîä íàçâàíèåì WYSIWIG (What You See Is What You Get - ×òî
âèäèì, òî è ïîëó÷èì).
Îïèñàííûé ïðîöåññ îòëè÷íî ïîäõîäèò, åñëè åäèíñòâåííàÿ öåëü
ïîëüçîâàòåëÿ íàïå÷àòàòü äîêóìåíò íà êîìïüþòåðå. Íà ñàìîì äåëå ýòî âñåãî ëèøü ìàëàÿ (÷àñòî çàêëþ÷èòåëüíàÿ) ÷àñòü ñèñòåìû
ïîääåðæêè ýëåêòðîííûõ äîêóìåíòîâ, èñòîðèÿ êîòîðîé íà÷àëàñü â
êîíöå 60-õ ãîäîâ ÕÕ ñòîëåòèÿ.
Ðóêîâîäñòâî ôèðìû IBM (òîãäàøíåé çàêîíîäàòåëüíèöå ìîä
â èíôîðìàòèêå) â ñâÿçè ñ îãðîìíûì êîëè÷åñòâîì þðèäè÷åñêèõ äîêóìåíòîâ ïîðó÷èëà ãðóïïå ñâîèõ ñîòðóäíèêîâ (Charles Goldfarb, Ed
Mosher, Ray Lorie) ðàçðàáîòàòü è âíåäðèòü ñèñòåìó õðàíåíèÿ, ïîèñêà, óïðàâëåíèÿ è îïóáëèêîâàíèÿ þðèäè÷åñêèõ äîêóìåíòîâ.
Èññëåäîâàíèÿ ýòîé ãðóïïû ïîçâîëèëè ñôîðìóëèðîâàòü òðåáîâàíèÿ ê ÿçûêó îïèñàíèÿ äîêóìåíòà. ßçûê äîëæåí ïðåäîñòàâëÿòü:
• îáùåå ïðåäñòàâëåíèå äàííûõ ñ ïîìîùüþ ðàçìåòêè
î÷åâèäíî èñïîëüçîâàíèå ðàçíûìè èíñòðóìåíòàìè îáðàáîòêè åäèíîãî ÿçûêà òåêñòîâîãî äîêóìåíòà íà áàçå ðàçìåòêè
• ðàçìåòêà äîëæíà áûòü ðàñøèðÿåìàÿ
÷òîáû ïîääåðæèâàòü áåñ÷èñëåííîå ìíîæåñòâî ðàçíîîáðàçíûõ òèïîâ èíôîðìàöèè (ñëîâàðè)
êîíöåïöèÿ
îáîáùàþùåé ðàçìåòêè (generalized markup),
èñêëþ÷àþùåé ëþáóþ èíôîðìàöèþ îá îòîáðàæåíèè òåêñòà
èíôîðìàöèÿ î ôîðìàòèðîâàíèè ýëåìåíòîâ ðàçìåòêè çà-
äàåòñÿ â îòäåëüíîì ôàéëå, êîòîðûé ìîæåò áûòü ïðèñîåäèíåí ê èñõîäíîìó äîêóìåíòó (òàáëèöû ñòèëåé )
4
äîêóìåíò, íàçûâàåìûé ñïåöèôèêàöèåé
ïðåîáðàçîâàíèÿ,
îïèñûâàåò ïðåîáðàçîâàíèå èñõîäíîãî äîêóìåíòà ê äîêóìåíòó, ñîñòîÿùåìó èç ïîäìíîæåñòâà ýëåìåíòîâ èñõîäíîãî
ñëîâàðÿ èëè âîîáùå äðóãîãî ñëîâàðÿ
• ñîçäàíèå ïðàâèë äëÿ òèïîâ äîêóìåíòîâ
ñóùåñòâîâàíèå ìåõàíèçìà ôîðìàëüíîãî îïèñàíèÿ ïðàâèë, èñïîëüçóåìûõ äîêóìåíòàìè îáùåãî òèïà, à òàêæå
ïðîâåðêè äîêóìåíòà ýòèì ïðàâèëàì (ñåìàíòè÷åñêàÿ ïðîâåðêà)
îñíîâàííàÿ íà ïðàâèëàõ ðàçìåòêà:
Íà ðèñ. 1.1.2 ïîêàçàíà ñõåìà ¾âçàèìîäåéñòâèÿ¿ àáñòðàêòíîãî
äîêóìåíòà, îïèñàíèÿ åãî òèïà è ïðèñîåäèíåííîãî ê íåìó ôàéëà ñî
ñïåöèôèêàöèåé ïðåîáðàçîâàíèÿ. Îñíîâíîå ïðåèìóùåñòâî ïîäîáíîé
ñõåìû çàêëþ÷àåòñÿ â îòäåëåíèè ñîäåðæèìîãî (àáñòðàêòíûé äîêóìåíò) îò åãî ïðåäñòàâëåíèÿ, ïîëó÷àåìîãî ïîñëå âûïîëíåíèÿ âñåõ
ôîðìàòèðóþùèõ (èëè ïðåîáðàçóþùèõ) ïðàâèë èç ôàéëà ñïåöèôèêàöèé ïðåîáðàçîâàíèÿ. Ýòà æå ñõåìà ïðåäïîëàãàåò è ïðîâåðêó äîêóìåíòà íà åãî äåéñòâèòåëüíîñòü ñîîòâåòñòâèå òèïó äîêóìåíòà,
çàäàííîìó ïðàâèëàìè â ôàéëå îïèñàíèÿ òèïà äîêóìåíòà.
Ðèñ. 1.1.2. Ñõåìà îáðàáîòêè ýëåêòðîííîãî äîêóìåíòà.
5
Ÿ2. Íà ïóòè ê XML
 1969 ãîäó ãðóïïà ïîä óïðàâëåíèåì ×àðëüçà Ãîëüäôàðáà
(IBM) ðàçðàáîòàëà ÿçûê, êîòîðûé ñîîòâåòñòâîâàë ïðåäñòàâëåííîìó âûøå ïîäõîäó ê ðàçìåòêå äîêóìåíòà, è íàçâàëà åãî Generalized
Markup Language (GML). Óäèâèòåëüíî, ÷òî àááðåâèàòóðà GML ýòîãî ÿçûêà ñîâïàëà ñ íà÷àëüíûìè áóêâàìè ôàìèëèé îñíîâíûõ åãî
ðàçðàáîò÷èêîâ Goldfarb, Mosher, Lorie.
Äàëüíåéøåå ðàçâèòèå ÿçûêà ñâÿçàíî ñ ðàçðàáîòêîé ×. Ãîëüäôàðáîì (Charles Goldfarb) êîíöåïöèé ¾ïîäòâåðæäàþùåãî ïðàâèëüíîñòü äîêóìåíòà ñèíòàêñè÷åñêîãî àíàëèçàòîðà¿ (¾validating
parser¿) è ïîñëåäóþùèì èõ èñïûòàíèåì íà ïðàêòèêå. Ýòà ðàáîòà
âûïîëíÿëàñü âïëîòü äî 1974 ãîäà, êîòîðûé, ïî óòâåðæäåíèþ ñàìîãî Ãîëüäôàðáà, è ñ÷èòàåòñÿ ãîäîì ðîæäåíèÿ SGML.
C 1978 ïî 1986 ãîäû ïîä åãî ðóêîâîäñòâîì áûë ðàçðàáîòàí
ñòàíäàðò (ISO 8879) ÿçûêà è îí ïîëó÷èë íàçâàíèå Standard Generalized Markup Language (SGML). ßçûê îêàçàëñÿ äîñòàòî÷íî ñëîæíûì
äëÿ åãî èçó÷åíèÿ è ïðèìåíåíèÿ, îäíàêî ïîëó÷èë íåêîòîðîå ðàñïðîñòðàíåíèå ïðè ñîçäàíèè ñèñòåì âåäåíèÿ ðàçëè÷íîé äîêóìåíòàöèè â
áîëüøèõ êîìïàíèÿõ.
 1989 ãîäó Tim Berners-Lee ïðåäëîæèë ñîâìåñòíîå èñïîëüçîâàíèå èíôîðìàöèè â ðàìêàõ CERN â âèäå òåêñòîâûõ äîêóìåíòîâ ñ ãèïåðññûëêàìè, à åãî êîëëåãà Anders Berglund ïîñîâåòîâàë
èñïîëüçîâàòü SGML-ïîäîáíûé ñèíòàêñèñ äëÿ îïèñàíèÿ ïîäîáíûõ
äîêóìåíòîâ.
Èìåÿ ïîä ðóêîé òîëüêî ïðîñòîé ïðèìåð òèïà äîêóìåíòà â ñòàíäàðòå SGML ðàáî÷àÿ ãðóïïà ïîä ðóêîâîäñòâîì Òèìà Áåðíåðñà-Ëè
áûñòðî ðàçðàáîòàëà ÿçûê äëÿ îïèñàíèÿ ãèïåðòåêñòîâûõ äîêóìåíòîâ, êîòîðûé áûë íàçâàí ÿçûêîì ðàçìåòêè ãèïåðòåêñòà (Hypertext
Markup Language HTML)
Ñàìà ãèïåðòåêñòîâàÿ ñèñòåìà äîêóìåíòîâ ñ ïðîòîêîëîì èõ ïåðåäà÷è (HTTP) áûëà íàçâàíà World Wide Web.
Îòìåòèì, ÷òî èìåííî åå ïðîñòîòà, êàê ñ÷èòàþò ìíîãèå ñïåöèàëèñòû, è ïîñëóæèëà ê åå óñïåõó. Äåéñòâèòåëüíî, ïðîñòîòà ÿçûêà
HTML è äðóãèõ ñïåöèôèêàöèé Web ïîçâîëÿåò ïðîãðàììèñòàì äîñòàòî÷íî áûñòðî ñòðîèòü öåëûå ñèñòåìû è äàæå èíñòðóìåíòû äëÿ
ðàáîòû â ñðåäå Web.
6
HTML, êàê ïðèëîæåíèå SGML (ïîñëåäíèé, ïî-ñóùåñòâó, ÿâëÿåòñÿ ìåòàÿçûêîì), ïðîäåìîíñòðèðîâàë ñèëüíûå ñòîðîíû SGML:
• çà íåáîëüøèìè èñêëþ÷åíèÿìè òèïû ýëåìåíòîâ ÿâëÿþòñÿ
îáîáùàþùèìè è îïèñàòåëüíûìè (íàãëÿäíûìè), à íå ôîðìàòèðóþùèìè êîíñòðóêöèÿìè, êàê â TeX èëè MS Word (äîêóìåíò ìîæíî îòîáðàçèòü íà òåêñòîâîì ýêðàíå, íà ãðàôè÷åñêîì
ïîëüçîâàòåëüñêîì èíòåðôåéñå è äàæå ïðî÷åñòü ÷åðåç çâóêîâûå óñòðîéñòâà äëÿ ñëàáîâèäÿùèõ)
• äëÿ ðàçìåòêè äîêóìåíòà èñïîëüçîâàëîñü ïðåäëîæåííîå â
SGML ñîãëàøåíèå îá óãëîâûõ ñêîáêàõ, ÷òî ïîçâîëÿëî ñîçäàâàòü åãî â ëþáîì òåêñòîâîì ðåäàêòîðå èëè ïðîöåññîðå, à òàêæå â ëþáîé ñóùåñòâóþùåé êîìïüþòåðíîé ñèñòåìå
Îäíàêî HTML ïîêàçàë è ñâîè ñëàáûå ñòîðîíû:
• èñïîëüçîâàë ôèêñèðîâàííîå ÷èñëî òèïîâ ýëåìåíòîâ
• íå ÿâëÿëñÿ ðàñøèðÿåìûì (íîâûå òèïû äîêóìåíòîâ ñîçäàâàòü
íåëüçÿ)
• òî÷íîå îïðåäåëåíèå áûëî äàíî òîëüêî ïî ïðîøåñòâèè íåñêîëüêèõ ëåò ïîñëå èçîáðåòåíèÿ (DTD) (óæå ñóùåñòâîâàëî îãðîìíîå ÷èñëî äîêóìåíòîâ, íå ñîîòâåòñòâîâàâøèõ òî÷íîìó îïðåäåëåíèþ)
HTML
íåîôèöèàëüíî
ñòàë
ðàñøèðÿòüñÿ
ôèðìàìèïðîèçâîäèòåëÿìè ïðîãðàìì ïðîñìîòðà Èíòåðíåòà (è ÷àñòî çà
ñ÷åò ôîðìàòèðóþùèõ ýëåìåíòîâ, íàïðèìåð, <center> â Netscape),
÷òî ïðèâîäèëî ê íåñîâìåñòèìîñòè äîêóìåíòîâ è íàðóøåíèþ çîëîòîãî ïðàâèëà ñòàíäàðòèçàöèè ñëåäóéòå ñòàíäàðòó, è ïðîáëåì íå
âîçíèêíåò.
 ñâÿçè ñ îïàñíîñòüþ ïîÿâëåíèÿ áîëüøîãî ìíîãîîáðàçèÿ ôîðìàòèðóþùèõ ýëåìåíòîâ, è, êàê ñëåäñòâèå, ïîòåðè èíòåðîïåðàáåëüíîñòè â ñðåäå Web êîíñîðöèóì WWW (îðãàíèçàöèÿ, âçÿâøàÿ íà
ñåáÿ îòâåòñòâåííîñòü çà ñîáëþäåíèå îïðåäåëåííûõ ïðàâèë ïðè ðàáîòå â ñðåäå Web) ïðåäïðèíÿë îïðåäåëåííûå äåéñòâèÿ äëÿ åå âîññòàíîâëåíèÿ:
• Çàèìñòâîâàòü èç GML ñîãëàøåíèå î ïðèñîåäèíåíèè ê äîêóìåíòó ïðàâèë ôîðìàòèðîâàíèÿ ÷åðåç òàáëèöû ñòèëåé (CSS).
7
• Áûë èçîáðåòåí ïðîñòîé ìåõàíèçì äîáàâëåíèÿ àáñòðàêöèé ê
HTML, íî íå áûë ïðåäëîæåí ìåõàíèçì äëÿ îãðàíè÷åíèÿ îáëàñòè èõ èñïîëüçîâàíèÿ (ýòî âñå ðàâíî ðåàëèçîâûâàëî äâà èç
òðåõ ïðèíöèïîâ GML).
• Áûëî ðåøåíî ðàçðàáîòàòü ïîäìíîæåñòâî ÿçûêà SGML, êîòîðûé ñîåäèíÿë áû îñíîâíûå äîñòîèíñòâà SGML è áûë áû ïðîñò
â èñïîëüçîâàíèè, ÷òîáû óäîâëåòâîðèòü ñëîæèâøåéñÿ â Web
ýòèêå. Òàê ïîÿâèëñÿ eXtensible Markup Language (XML).
Ÿ3. Ïðîñòîé XML-äîêóìåíò
Ðàññìîòðèì ïðîñòîé, íî òèïè÷íûé, äîêóìåíò XML è íà åãî
îñíîâå ïîçíàêîìèìñÿ ñî ñòðóêòóðîé è íà÷àëàìè ñèíòàêñèñà äîêóìåíòà XML:
<?xml version="1.0" encoding="windows-1251"?>
<DOCUMENT>
<GREETING>Hello From XML</GREETING>
<MESSAGE>
Äîáðî ïîæàëîâàòü â ìèð XML.
</MESSAGE>
</DOCUMENT>
Ñàìûì ïåðâûì ýëåìåíòîì ÿâëÿåòñÿ xml-îáúÿâëåíèå, â êîòîðîì â ñîîòâåòñòâóþùèõ àòðèáóòàõ çàäàåòñÿ âåðñèÿ ÿçûêà XML, èñïîëüçîâàííàÿ â äîêóìåíòå äëÿ åãî ðàçìåòêè, à òàêæå êîäèðîâêà
ñèìâîëîâ â äîêóìåíòå. Êîäèðîâêà ìîæåò áûòü ascii, utf-8, utf-16 èëè
èíàÿ, ïîíèìàåìàÿ ïðîöåññîðîì (ïðîãðàììîé îáðàáîòêè) XML.
Äàëåå çàäàåòñÿ êîðíåâîé ýëåìåíò (â íàøåì ñëó÷àå
<DOCUMENT>), ñîäåðæèìîå êîòîðîãî è õðàíèò âñþ ñòðóêòóðó
äîêóìåíòà, çàäàâàåìóþ ýëåìåíòàìè XML. Êàæäûé ýëåìåíò
XML (è êîðíåâîé òàêæå) ñîñòîèò èç òðåõ ÷àñòåé: íà÷àëüíîãî
òåãà (íàïðèìåð, <DOCUMENT>), çàâåðøàþùåãî òåãà (</DOCUMENT>) è
ñîäåðæèìîãî, ðàñïîëàãàþùåãîñÿ ìåæäó äâóìÿ óêàçàííûìè òåãàìè.
Áðàóçåð îòîáðàæàåò äîêóìåíò XML â âèäå äåðåâà ñ ðàñêðûâàþùèìèñÿ (è çàêðûâàþùèìèñÿ) âåòâÿìè. Íà ðèñ. 1.3.1 ïîêàçàíî
îòîáðàæåíèå íàøåãî ïðîñòîãî äîêóìåíòà â Internet Explorer 6.0.
8
Ðèñ. 1.3.1. Îòîáðàæåíèå XML äîêóìåíòà â îêíå áðàóçåðà IE 6.0.
Äëÿ îòîáðàæåíèÿ äîêóìåíòà XML áðàóçåð èñïîëüçóåò çàðàíåå
ñîçäàííóþ òàáëèöó ñòèëåé CSS. Îäíàêî íè÷òî íå ìåøàåò ïîäêëþ÷èòü èíóþ òàáëèöó ñòèëåé äëÿ îòîáðàæåíèÿ äîêóìåíòà â äðóãîì
âèäå.
Äëÿ ýòîãî â ñèíòàêñèñå XML ïðåäóñìîòðåíà èíñòðóêöèÿ ïî
îáðàáîòêå <?...?> (Processing Instruction PI), êîòîðàÿ ñîîáùàåò
ïðîöåññîðó XML, ÷òî ñëåäóåò ñäåëàòü ñ äîêóìåíòîì.
Èíñòðóêöèÿ ïî îáðàáîòêå
<?xml-stylesheet type="text/css" href="xml01.css"?>
ïîäêëþ÷àåò óêàçàííóþ àòðèáóòîì href âíåøíþþ òàáëèöó ñòèëåé
ñ ïðàâèëàìè îòîáðàæåíèÿ ýëåìåíòîâ XML äîêóìåíòà.
Ïóñòü ôàéë xml01.css ñîäåðæèò ñëåäóþùèå ïðàâèëà êàñêàäíûõ òàáëèö ñòèëåé:
GREETING {display: block;
font-size: 36pt;
color: #FF0000;
text-align: center;}
MESSAGE {display: block;
font-size: 18pt;
color: #000000;}
9
Òåïåðü áðàóçåð îòîáðàçèò íàø äîêóìåíò XML òàê, êàê ïîêàçàíî íà ðèñ. 1.3.2.
Ðèñ. 1.3.2. Îòîáðàæåíèå XML äîêóìåíòà ñ ïðèñîåäèíåííîé
òàáëèöåé ñòèëåé.
Ëþáîé XML-äîêóìåíò ÿâëÿåòñÿ õîðîøî ñôîðìèðîâàííûì
(well-formed) (ôîðìàëüíî êîððåêòíûì, ñèíòàêñè÷åñêè êîððåêòíûì). Ýòî îçíà÷àåò, ÷òî XML-äîêóìåíò äîëæåí óäîâëåòâîðÿòü âñåì
ñèíòàêñè÷åñêèì ïðàâèëàì è îãðàíè÷åíèÿì, ââåäåííûì â ñïåöèôèêàöèè ÿçûêà XML, ðàçðàáîòàííîé êîíñîðöèóìîì WWW. Ïîñëåäíÿÿ ðåäàêöèÿ ñïåöèôèêàöèè ÿçûêà XML âåðñèè 1.0 íàõîäèòñÿ ïî
àäðåñó http://www.w3.org/TR/2004/REC-xml-20040204.
Åñëè ðàçìå÷åííûé òåêñòîâûé äîêóìåíò íå óäîâëåòâîðÿåò âñåì
ïðàâèëàì è îãðàíè÷åíèÿì ÿçûêà XML, òî áðàóçåð îòîáðàæàåò
îøèáêè ñèíòàêñèñà, à íå äîêóìåíò. Íàïðèìåð, åñëè çàêðûâàþùèé
òåã ýëåìåíòà <MESSAGE> çàäàòü êàê </MESSAGES> íå â ñîîòâåòñòâèè
â ïðàâèëàìè ÿçûêà XML, òî áðàóçåð îòîáðàçèò îøèáêó (ðèñ. 1.3.3).
XML-äîêóìåíò äîïîëíèòåëüíî ìîæåò ïðîéòè ïðîâåðêó íà ñîîòâåòñòâèå îïðåäåëåííîìó òèïó äîêóìåíòà, çàäàâàåìîìó ñ ïîìîùüþ DTD èëè XML-ñõåìû, è ïî ðåçóëüòàòàì ýòîé ïðîâåðêè ñòàòü
äåéñòâèòåëüíûì (ñåìàíòè÷åñêè êîððåêòíûì) èëè íåò.
Äîáàâèì îïðåäåëåíèå òèïà äîêóìåíòà DTD ê íàøåìó ïðîñòîìó äîêóìåíòó XML ñðàçó æå ïîñëå xml-îáúÿâëåíèÿ:
10
Ðèñ. 1.3.3. Îòîáðàæåíèå ñèíòàêñè÷åñêè íåêîððåêòíîãî òåêñòîâîãî
äîêóìåíòà.
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (GREETING, MESSAGE)>
<!ELEMENT GREETING (#PCDATA)>
<!ELEMENT MESSAGE (#PCDATA)>
]>
Ê ñîæàëåíèþ íè îäèí áðàóçåð àâòîìàòè÷åñêè íå âûïîëíÿåò
ïðîâåðêó äåéñòâèòåëüíîñòè XML-äîêóìåíòà, îäíàêî ýòó ïðîöåäóðó ìîæíî âûïîëíèòü ïðîãðàììíûì ñïîñîáîì. Ñëåäóþùèé HTMLäîêóìåíò ñî âñòðîåííûì ñöåíàðèåì JavaScript âûïîëíèò ïðîâåðêó
íà äåéñòâèòåëüíîñòü íàøåãî äîêóìåíòà XML â áðàóçåðå MS Internet
Explorer è îòîáðàçèò îøèáêè åãî íåñîîòâåòñòâèÿ òèïó äîêóìåíòà:
<HTML>
<HEAD>
<TITLE>
Ïðîâåðêà äåéñòâèòåëüíîñòè XML-äîêóìåíòîâ
</TITLE>
<META http-equiv="content-type"
CONTENT="text/html; CHARSET=Windows-1251">
<SCRIPT LANGUAGE="JavaScript">
var xmldoc
11
function loadDocument(file)
{
xml.innerText = ""
xmldoc = new ActiveXObject("MSXML2.DOMDocument.5.0")
xmldoc.onreadystatechange = stateChangeHandler
xmldoc.load(file)
}
function stateChangeHandler()
{
if(xmldoc.readyState == 4){
var errorString = xmldoc.parseError.srcText
errorString = xmldoc.parseError.srcText.
replace(/\</g, "<")
errorString = errorString.replace(/\>/g, ">")
if(xmldoc.parseError.errorCode != 0) {
messageDIV.innerHTML =
"Ïðîáëåìà â äîêóìåíòå " +
xmldoc.parseError.url +
", ñòðîêà " + xmldoc.parseError.line +
", ïîçèöèÿ " + xmldoc.parseError.linepos +
":<BR>Èñòî÷íèê îøèáêè: " + errorString +
"<BR>Ïðè÷èíà îøèáêè: " +
xmldoc.parseError.reason +
"<BR>" + "Îøèáêà: " +
xmldoc.parseError.errorCode
}else {
messageDIV.innerHTML =
"Ñòàòóñ: äîêóìåíò äåéñòâèòåëüíûé"
xml.innerText = xmldoc.xml;
}
}
}
</SCRIPT>
</HEAD>
<BODY ONLOAD="loadDocument('1.xml')">
<CENTER>
<H1>
Ïðîâåðêà äîêóìåíòà íà äåéñòâèòåëüíîñòü<br>
12
(ñîîòâåòñòâèå DTD)
</H1>
</CENTER>
<DIV ID="messageDIV"></DIV>
</CENTER>
<div id=xml></div>
</BODY>
</HTML>
Ýòîò äîêóìåíò HTML îòîáðàæàåò èñõîäíûé òåêñò äîêóìåíòà
XML, åñëè îí ÿâëÿåòñÿ äåéñòâèòåëüíûì (ðèñ. 1.3.4), è îøèáêó â
ñëó÷àå åãî íåñîîòâåòñòâèÿ òèïó äîêóìåíòà (ðèñ. 1.3.5).  ïîñëåäíåì ñëó÷àå âìåñòî ýëåìåíòà <MESSAGE> â äîêóìåíòå çàäàí ýëåìåíò
<MESSAGES>.
Ðèñ. 1.3.4. Îòîáðàæåíèå äåéñòâèòåëüíîãî XML-äîêóìåíòà.
Çàìåòèì, ÷òî ïðåäñòàâëåííûé ñöåíàðèé îòëàâëèâàåò è ñèíòàêñè÷åñêèå îøèáêè äîêóìåíòà XML.
Çàãðóçèâ ñ ïîìîùüþ ñöåíàðèÿ JavaScript äîêóìåíò XML åãî
ìîæíî íå òîëüêî ïðîñòî îòîáðàçèòü íà ñòðàíèöå HTML, íî ñ ïîìîùüþ îáúåêòíîé ìîäåëè XML-DOM ìîæíî èçâëå÷ü äàííûå èç ëþáî13
Ðèñ. 1.3.5. Îòîáðàæåíèå îøèáêè äëÿ íåäåéñòâèòåëüíîãî
XML-äîêóìåíòà.
ãî ñîñòàâëÿþùåãî åãî ýëåìåíòà. Ïðèâîäèìûé íèæå ñöåíàðèé îòîáðàæàåò ñîäåðæèìîå ïåðâîãî ýëåìåíòà <GREETING> (â MS Internet
Explorer):
<HTML>
<HEAD>
<TITLE>
Ïîèñê çíà÷åíèé ýëåìåíòîâ â äîêóìåíòîâ XML
</TITLE>
<META http-equiv="content-type"
CONTENT="text/html; CHARSET=Windows-1251">
<SCRIPT LANGUAGE="JavaScript">
function getData(){
xmldoc = new ActiveXObject("MSXML2.DOMDocument.5.0")
xmldoc.async=false
xmldoc.load("1.xml")
nodeDoc = xmldoc.documentElement;
nodeGreeting = nodeDoc.
getElementsByTagName("GREETING")[0];
outputMessage = nodeGreeting.nodeName+": " +
nodeGreeting.childNodes[0].nodeValue;
14
message.innerHTML+=outputMessage+"<br>"; }
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<H1>Ïîèñê çíà÷åíèé ýëåìåíòîâ â äîêóìåíòîâ XML</H1>
<DIV ID="message"></DIV>
<P><INPUT TYPE="BUTTON"
VALUE="Ïîëó÷èòü Greeting" ONCLICK="getData()">
</CENTER>
</BODY>
</HTML>
Ðåçóëüòàò ðàáîòû ñöåíàðèÿ ïîñëå ùåë÷êà íà êíîïêå ìîæíî
óâèäåòü íà ðèñ. 1.3.6.
Ðèñ. 1.3.6. Îòîáðàæåíèå ñîäåðæèìîãî ïåðâîãî ýëåìåíòà
<GREETING>.
Ÿ4. Èçâåñòíûå ñëîâàðè XML
Ê íàñòîÿùåìó âðåìåíè ðàçðàáîòàíî ìíîãî ñëîâàðåé (ÿçûêîâ)
XML äëÿ ïðåäñòàâëåíèÿ äàííûõ îïðåäåëåííîãî âèäà. Â ýòîì ïàðàãðàôå ìû ïîçíàêîìèìñÿ ñ äâóìÿ ñëîâàðÿìè, ïîääåðæêà êîòîðûõ
ðåàëèçîâàíà â IE 6.0.
15
ßçûê ðàçìåòêè MathML
Êîíñîðöèóìîì WWW áûë ðàçðàáîòàí ñïåöèàëüíûé ñëîâàðü
äëÿ ðàçìåòêè ìàòåìàòè÷åñêèõ ôîðìóë. Ñïåöèôèêàöèþ ýòîãî ÿçûêà
ìîæíî íàéòè ïî àäðåñó http://www.w3.org/Math/.
Áðàóçåð IE íå ïîääåðæèâàåò íàïðÿìóþ îáðàáîòêó ñëîâàðÿ
MathML. Îäíàêî ñóùåñòâóåò ñâîáîäíî ðàñïðîñòðàíÿåìàÿ ïðîãðàììà MathPlayer, êîòîðàÿ ïîñëå óñòàíîâêè íà êîìïüþòåðå ïîëüçîâàòåëÿ ïîçâîëÿåò ïðîñìàòðèâàòü âñòðîåííóþ â HTML-äîêóìåíò ðàçìåòêó MathML. Åå ìîæíî çàãðóçèòü ñ ñàéòà ðàçðàáîò÷èêà ïî àäðåñó: http://www.dessci.com/en/products/mathplayer.
Ïðîãðàììà ïðîñìîòðà óñòàíàâëèâàåòñÿ êàê COM-ñåðâåð. Äëÿ
îáðàùåíèÿ ê íåé ñëåäóåò ñ ïîìîùüþ ýëåìåíòà <OBJECT> ñîçäàòü
ýêçåìïëÿð ñåðâåðà, óêàçàâ èäåíòèôèêàòîð åãî êëàññà è ñ ïîìîùüþ
ñïåöèàëüíîé èíñòðóêöèè <?IMPORT...?> èìïîðòèðîâàòü ïðîñòðàíñòâî èìåí, íåîáõîäèìîå äëÿ ðàáîòû ýòîãî COM-ñåðâåðà:
<HTML XMLNS:m="http://www.w3.org/1998/Math/MathML">
<HEAD>
<OBJECT ID=MathPlayer
CLASSID="clsid:32F66A20-7614-11D4-BD11-00104BD3F987">
</OBJECT>
<?IMPORT NAMESPACE="m" IMPLEMENTATION="#MathPlayer" ?>
</HEAD>
<BODY>
<p>Óðàâíåíèå:
<m:math>
<m:msup><m:mi>x</m:mi><m:mn>2</m:mn></m:msup>
<m:mo>+</m:mo> <m:mn>9</m:mn> <m:mi>x</m:mi>
<m:mo>+</m:mo> <m:mn>9</m:mn>
<m:mo>=</m:mo> <m:mn>0</m:mn>
</m:math>
</p>
<p>Åùå îäíî óðàâíåíèå:
<m:math>
<m:mrow>
<m:mrow>
<m:mn>3</m:mn>
<m:mo>⁢</m:mo>
16
<m:msup> <m:mi>Z</m:mi> <m:mn>2</m:mn> </m:msup>
<m:mo>-</m:mo>
<m:mrow>
<m:mn>6</m:mn>
<m:mo>⁢</m:mo>
<m:mi>Z</m:mi>
</m:mrow>
<m:mo>+</m:mo>
<m:mn>12</m:mn>
</m:mrow>
<m:mo>=</m:mo>
<m:mn>0</m:mn>
</m:mrow>
</m:math>
</p>
</BODY>
</HTML>
Ðåçóëüòàò îòîáðàæåíèÿ óðàâíåíèé â îêíå áðàóçåðà ìîæíî óâèäåòü íà ðèñ. 1.4.1.
Ðèñ. 1.4.1. Îòîáðàæåíèå ìàòåìàòè÷åñêèõ ôîðìóë.
Vector Markup Language
<HTML xmlns:v="urn:schemas-microsoft-com:vml">
<HEAD>
<TITLE>
17
Using Vector Markup Language
</TITLE>
<STYLE>
v\:* {behavior: url(#default#VML);}
</STYLE>
</HEAD>
<BODY>
<CENTER>
<H1>
Èñïîëüçîâàíèå ÿçûêà VML
</H1>
</CENTER>
<P>
<v:oval STYLE='width:100pt; height:75pt'
fillcolor="yellow"> </v:oval>
<v:rect STYLE='width:100pt; height:75pt'
fillcolor="blue"
strokecolor="red" STROKEWEIGHT="2pt"/>
</P>
<P>
<v:polyline
POINTS="20pt,55pt,100pt,-10pt,180pt,65pt,260pt,25pt"
strokecolor="red" STROKEWEIGHT="2pt"/>
</P>
</BODY>
</HTML>
Ðåçóëüòàò îòîáðàæåíèÿ îâàëà, ïðÿìîóãîëüíèêà è ïîëèëèíèè â
îêíå áðàóçåðà IE 6.0 ìîæíî óâèäåòü íà ðèñ. 1.4.2.
Ÿ5. Ëîãè÷åñêàÿ è ôèçè÷åñêàÿ ñòðóêòóðû
Ñàìàÿ ïåðâàÿ ðàçðàáîòàííàÿ Êîíñîðöèóìîì WWW ðåêîìåíäàöèÿ ïî ÿçûêó XML äàòèðóåòñÿ 1998 ãîäîì. Îíà ïåðåñìàòðèâàëàñü â 2000 ãîäó è ïîñëåäíåé ÿâëÿåòñÿ Extensible Markup Language
(XML) 1.0 (Third Edition) W3C Recommendation 04 February 2004.
 ñîîòâåòñòâèè ñ ýòîé ðåêîìåíäàöèåé è áóäåò âåñòèñü èçëîæåíèå â
äàëüíåéøåì.
18
Ðèñ. 1.4.2. Îòîáðàæåíèå ìàòåìàòè÷åñêèõ ôîðìóë.
Îáúåêò
äàííûõ
ÿâëÿåòñÿ
XMLäîêóìåíòîì, åñëè îí ôîðìàëüíî-êîððåêòåí â ñîîòâåòñòâèè ñî
Îïðåäåëåíèå 1.5.1.
ñïåöèôèêàöèåé êîíñîðöèóìà WWW.
Ôîðìàëüíî-êîððåêòíûé XML-äîêóìåíò ÌÎÆÅÒ áûòü äåéåñëè îí óäîâëåòâîðÿåò äîïîëíèòåëüíûì îãðàíè÷åíèÿì, ñâÿçàííûì ñî ñòðóêòóðîé è ñîäåðæèìûì èñïîëüçóåìûõ
ýëåìåíòîâ XML.
Êàæäûé XML-äîêóìåíò èìååò ëîãè÷åñêóþ è ôèçè÷åñêóþ
ñòðóêòóðû.
Ôèçè÷åñêè XML-äîêóìåíò ñîñòîèò èç ñóùíîñòåé, êîòîðûå
ñàìè ìîãóò ññûëàòüñÿ íà äðóãèå ñóùíîñòè. Ñóùíîñòü ìîæåò ñîäåðæàòü ëèáî òåêñòîâûå, ëèáî äâîè÷íûå äàííûå. Ïîä âíåøíåé ñóùíîñòüþ ìîæåì ìûñëèòü ôàéë, ñîäåðæàùèé óêàçàííûå äàííûå.
Ñóùíîñòü îïðåäåëÿåò íåêèé óíèâåðñàëüíûé ñïîñîá ññûëîê íà
åäèíèöó õðàíèìûõ äàííûõ â XML-äîêóìåíòå. Êàæäàÿ ñóùíîñòü
èäåíòèôèöèðóåòñÿ â äîêóìåíòå ñâîèì èìåíåì.
Âñå ñóùíîñòè äîêóìåíòà âûñòðàèâàþòñÿ â íåêîòîðóþ äðåâîâèäíóþ ñòðóêòóðó, îáðàçóåìóþ â ñîîòâåòñòâèè ñ èõ âëîæåííîñòüþ
äðóã â äðóãà.
Êîðíåâàÿ ñóùíîñòü, èëè ñóùíîñòü äîêóìåíòà, ýòî òà ñóùñòâèòåëüíûì ,
19
íîñòü, êîòîðàÿ ñëóæèò êîðíåì äåðåâà ñóùíîñòåé. Îíà ïåðåäàåòñÿ
ñèíòàêñè÷åñêîìó àíàëèçàòîðó è íå èìååò èìåíè.
Ëîãè÷åñêè äîêóìåíò XML ñîñòîèò èç îáúÿâëåíèé, ýëåìåíòîâ, êîììåíòàðèåâ, ñèìâîëüíûõ ññûëîê è èíñòðóêöèé ïî îáðàáîòêå, êîòîðûå ÿâíûì îáðàçîì óêàçûâàþòñÿ â äîêóìåíòå ñ ïîìîùüþ
ðàçìåòêè.
Ÿ6. Êîìïîíåíòû XML-äîêóìåíòà
òû:
Äëÿ ðàçìåòêè äîêóìåíòà èñïîëüçóþòñÿ ñëåäóþùèå êîìïîíåí-
• íà÷àëüíûé òåã ýëåìåíòà (<name [attr="value"]>);
• êîíå÷íûé òåã ýëåìåíòà (</name>);
• òåã ïóñòîãî ýëåìåíòà (<empty [attr="value"] />);
• ññûëêà íà ñóùíîñòü (&èìÿ;);
• ññûëêà íà ñèìâîë (&#äåñÿò_öèôðû; èëè &#xøåñòíàä_öèôðû;);
• êîììåíòàðèé (íèæå ïðèâåäåíî îïðåäåëåíèå èç ðåêîìåíäàöèè
WWW-Êîíñîðöèóìà)
'<!--' ((Char - '-') | ('-' (Char - '-')))*'-->'
• ñåêöèÿ CDATA (<![CDATA[...]]>);
• îáúÿâëåíèå òèïà XML-äîêóìåíòà (<!DOCTYPE>);
• èíñòðóêöèÿ ïî îáðàáîòêå (<?èìÿ ñèìâ_äàííûå?>) (èìÿ íå ðàâíî xml);
• îáúÿâëåíèå xml (<?xml ...?>).
Íå îòíîñÿùèéñÿ ê ðàçìåòêå òåêñò íàçûâàåòñÿ ñèìâîëüíûìè
äàííûìè.
Ïðîáåëüíûå ñèìâîëû
(ïðîáåë, âîçâðàò êàðåòêè, ïåðåâîä ñòðîêè è òàáóëÿöèÿ) â îáëàñòè ñîäåðæèìîãî ýëåìåíòà XML ðåãóëèðóþòñÿ àòðèáóòîì xml:space, ïðèíèìàþùèì îäíî èç äâóõ çíà÷åíèé:
20
default èëè preserve. Ýòîò àòðèáóò ìîæåò çàäàâàòüñÿ ó ëþáîãî
ýëåìåíòà XML, ïðè÷åì äëÿ äåéñòâèòåëüíîãî äîêóìåíòà åãî ñëåäóåò îïðåäåëèòü â îïèñàíèè ñîîòâåòñòâóþùåãî ýëåìåíòà â DTD èëè
XML-ñõåìå.
Ÿ7. Ôîðìàëüíàÿ êîððåêòíîñòü
Îïðåäåëåíèå 1.7.1. Òåêñòîâûé îáúåêò
ðåêòíûì XML-äîêóìåíòîì, åñëè:
ÿâëÿåòñÿ ôîðìàëüíî êîð-
1. Ðàññìàòðèâàåìûé êàê öåëîå, îí ñîîòâåòñòâóåò ïðîäóêöèè
(ïðàâèëó) document.
2. Ñîîòâåòñòâóåò âñåì îãðàíè÷åíèÿì ôîðìàëüíîé êîððåêòíîñòè,
îïðåäåëåííûì â ñïåöèôèêàöèè.
3. Êàæäàÿ èç ðàçîáðàííûõ ñóùíîñòåé, ÿâíî èëè êîñâåííî ññûëàåìàÿ â äîêóìåíòå, ÿâëÿåòñÿ ôîðìàëüíî êîððåêòíîé.
Ðàññìîòðèì ïåðâîå óñëîâèå ôîðìàëüíîé êîððåêòíîñòè. Â ðåêîìåíäàöèÿõ ýòî ïðàâèëî ñ èñïîëüçîâàíèåì ðàñøèðåííîé íîòàöèè
ÁÍÔ âûãëÿäèò ñëåäóþùèì îáðàçîì:
document ::= prolog element Misc*
Ïðîëîã ñîñòîèò èç:
• íåîáÿçàòåëüíîãî
xml-îáúÿâëåíèÿ
<?xml version="1.0"
encoding="utf-8|utf-16" standalone="yes|no"?>
• íåîáÿçàòåëüíîãî áëîêà èíñòðóêöèé ïî îáðàáîòêå, êîììåíòàðèåâ è ïðîïóñêîâ
• íåîáÿçàòåëüíîãî îáúÿâëåíèÿ òèïà äîêóìåíòà <!DOCTYPE>, çà
êîòîðûì ìîæåò ñëåäîâàòü íåîáÿçàòåëüíûé áëîê èíñòðóêöèé
ïî îáðàáîòêå, êîììåíòàðèåâ è ïðîïóñêîâ
Çà ïðîëîãîì ñëåäóåò îäèí êîðíåâîé ýëåìåíò, êîòîðûé ìîæåò âêëþ÷àòü îáû÷íûé òåêñò, äðóãèå ýëåìåíòû, ñèìâîëüíûå ññûëêè, ññûëêè íà ñóùíîñòè, êîììåíòàðèè, èíñòðóêöèè ïî îáðàáîòêå è
ñåêöèè ñèìâîëüíûõ íåðàçìå÷åííûõ äàííûõ (<![CDATA[...]]>)
21
Çàâåðøàåò äîêóìåíò íåîáÿçàòåëüíûé áëîê èíñòðóêöèé ïî îáðàáîòêå, êîììåíòàðèåâ è ïðîïóñêîâ.
Îãðàíè÷åíèÿ ôîðìàëüíîé êîððåêòíîñòè ïî-ñóùåñòâó îïðåäåëÿþò ñèíòàêñè÷åñêèå ïðàâèëà ÿçûêà XML, êîòîðûì äîëæåí ñëåäîâàòü ëþáîé XML-äîêóìåíò.
Ðàçîáðàííàÿ ñóùíîñòü ôîðìàëüíî êîððåêòíà, åñëè åå ñîäåðæèìîå ñîîòâåòñòâóåò ïðîäóêöèè
content:= CharData? ((element | Reference |
CDSect | PI | Comment) CharData?)*
Ãîâîðÿ ðóññêèì ÿçûêîì, ôîðìàëüíî êîððåêòíàÿ ñóùíîñòü ïîñëå åå ðàçáîðêè ìîæåò ñîäåðæàòü: îáû÷íûé òåêñò, ýëåìåíòû, ñèìâîëüíûå ññûëêè, ññûëêè íà ñóùíîñòè, êîììåíòàðèè, èíñòðóêöèè ïî
îáðàáîòêå è ñåêöèè ñèìâîëüíûõ íåðàçìå÷åííûõ äàííûõ. Ýòî îçíà÷àåò, ÷òî êîãäà â äîêóìåíò âñòàâëåíî ñîäåðæèìîå âñåõ ðàçîáðàííûõ ñóùíîñòåé, òî åãî ëîãè÷åñêàÿ è ôèçè÷åñêàÿ ñòðóêòóðû äîëæíû
îñòàâàòüñÿ ïðàâèëüíî âëîæåííûìè. Ïðèìåð ôîðìàëüíî êîððåêòíîãî XML-äîêóìåíòà:
<?xml version = "1.0" standalone="yes"?>
<DOCUMENT>
<CUSTOMER>
<NAME>
<LAST_NAME>Smith</LAST_NAME>
<FIRST_NAME>Sam</FIRST_NAME>
</NAME>
<ORDER DATE="October 15, 2003">
<ITEM>
<PRODUCT>Tomatoes</PRODUCT>
<NUMBER>8</NUMBER>
<PRICE>$1.25</PRICE>
</ITEM>
<ITEM>
<PRODUCT>Oranges</PRODUCT>
<NUMBER>24</NUMBER>
<PRICE>$4.98</PRICE>
</ITEM>
</ORDER>
22
</CUSTOMER>
</DOCUMENT>
Ýëåìåíòû è àòðèáóòû
Äëÿ çàäàíèÿ (ðàçìåòêè) ýëåìåíòîâ â äîêóìåíòå èñïîëüçóþòñÿ
òåãè çàêëþ÷åííûå â óãëîâûå ñêîáêè èäåíòèôèêàòîðû, êîòîðûå
èìåíóþò ýëåìåíòû XML. Ïðàâèëî çàäàíèÿ èìåí ýëåìåíòîâ ïîõîæå
íà ïðàâèëî çàäàíèÿ èäåíòèôèêàòîðîâ ïðàêòè÷åñêè â ëþáîì ÿçûêå ïðîãðàììèðîâàíèÿ: èìÿ ýëåìåíòà íà÷èíàåòñÿ ñ áóêâû, ñèìâîëà
ïîä÷åðêèâàíèÿ èëè äâîåòî÷èÿ, à äàëåå ìîãóò èäòè áóêâû, öèôðû,
ñèìâîë ïîä÷åðêèâàíèÿ, äåôèñ, òî÷êà èëè äâîåòî÷èå.
Îäíàêî äâîåòî÷èå â èìåíè ýëåìåíòà ëó÷øå íå èñïîëüçîâàòü,
òàê êàê îíî ïðèìåíÿåòñÿ äëÿ îòäåëåíèÿ ïðîñòðàíñòâà èìåí.
ßçûê XML ÷óâñòâèòåëåí ê ðåãèñòðó, ïîýòîìó ýòîò ôàêò ñëåäóåò ó÷èòûâàòü ïðè çàäàíèè è èñïîëüçîâàíèè èìåí ýëåìåíòîâ.
Ýëåìåíò XML ñîçäàåòñÿ çàäàíèåì íà÷àëüíîãî è êîíå÷íîãî òåãà
(èìåíà â íèõ îäèíàêîâûå!), ìåæäó êîòîðûìè ðàñïîëàãàåòñÿ ñîäåðæèìîå ýëåìåíòà:
<GREETING>HELLO</GREETING>
Ñîäåðæèìîå ýëåìåíòà ñîîòâåòñòâóåò ïðàâèëó content:
content ::= CharData? ((element | Reference |
CDSect | PI | Comment) CharData?)*
Ïóñòîé ýëåìåíò ýëåìåíò áåç ñîäåðæèìîãî. Çàäàâàòüñÿ îí
ìîæåò êàê ñ ïîìîùüþ òåãà ïóñòîãî ýëåìåíòà
<GREETING TEXT="Hello" />,
òàê è ñ ïîìîùüþ íà÷àëüíîãî è êîíå÷íîãî òåãîâ ñ ïóñòûì ñîäåðæèìûì
<GREETING TEXT="Hello"></GREETING>.
Êîðíåâîé ýëåìåíò åäèíñòâåííûé è ñîäåðæèò âñå îñòàëüíûå
ýëåìåíòû XML-äîêóìåíòà.
Ýëåìåíò ìîæåò èìåòü àòðèáóòû, îïðåäåëÿþùèå äîïîëíèòåëüíûå äàííûå äëÿ ýëåìåíòà. Çàäàþòñÿ àòðèáóòû â âèäå
èìÿ_àòðèáóòà=çíà÷åíèå â íà÷àëüíîì òåãå ýëåìåíòà è îòäåëÿþòñÿ îò
23
èìåíè òåãà è äðóãèõ àòðèáóòîâ îäíèì èëè áîëåå ïðîáåëàìè. Çíà÷åíèå àòðèáóòà çàäàåòñÿ îáÿçàòåëüíî â êàâû÷êàõ ¾"¿ èëè àïîñòðîôàõ ¾'¿:
<GREETING lang="en">HELLO</GREETING>
Ïðàâèëî çàäàíèÿ èìåí àòðèáóòîâ òàêîå æå, ÷òî è äëÿ èìåí ýëåìåíòîâ. Äëÿ îäíîãî ýëåìåíòà èìåíà àòðèáóòîâ íå ìîãóò ïîâòîðÿòüñÿ:
<GREETING lang="us" lang="en">HELLO</GREETING>
Òèï çíà÷åíèé àòðèáóòîâ âñåãäà ñòðîêîâûé, äàæå åñëè çíà÷åíèå
ïðåäñòàâëÿåò ÷èñëî:
<circle x="10.1" y="1.1" radius="17.1" />
Àòðèáóò îáùåãî íàçíà÷åíèÿ xml:lang óêàçûâàåò íà ïðèìåíÿåìûé äëÿ ñîäåðæèìîãî äîêóìåíòà è çíà÷åíèé àòðèáóòîâ ÿçûê.
Ïðàâèëà ïîñòðîåíèÿ ôîðìàëüíî êîððåêòíîé ñòðóêòóðû äîêóìåíòà
• XML-îáúÿâëåíèå äîëæíî áûòü ïåðâîé êîíñòðóêöèåé äîêóìåíòà.
• Íàëè÷èå êîðíåâîãî ýëåìåíòà äîêóìåíòà, âêëþ÷àþùåãî âñå
îñòàëüíûå.
• Íàëè÷èå íà÷àëüíîãî è êîíå÷íîãî òåãà ó ýëåìåíòà ñ ñîäåðæèìûì.
• Èìåíà íà÷àëüíîãî è êîíå÷íîãî òåãà ýëåìåíòà äîëæíû ñîâïàäàòü.
• Ó ïóñòîãî ýëåìåíòà (áåç ñîäåðæèìîãî) ìîæåò îòñóòñòâîâàòü
êîíå÷íûé òåã, íî òîãäà íà÷àëüíûé òåã äîëæåí çàâåðøàòüñÿ
ñèìâîëàìè "/>".
• Êîððåêòíîå âêëàäûâàíèå ýëåìåíòîâ.
• Óíèêàëüíûå èìåíà àòðèáóòîâ â îäíîì ýëåìåíòå.
• Èñïîëüçîâàòü ñèìâîëüíûå ññûëêè äëÿ ñèìâîëîâ, ó÷àñòâóþùèõ â ðàçìåòêå:
24
& äëÿ &
< äëÿ <
> äëÿ >
' äëÿ '
" äëÿ "
• Çàêëþ÷àòü â êàâû÷êè èëè àïîñòðîôû çíà÷åíèÿ àòðèáóòîâ.
ÑÎÂÅÒ Åñëè â ñèìâîëüíûõ äàííûõ ñëèøêîì ìíîãî ñèìâîëîâ ðàçìåòêè, òî èñïîëüçóéòå ñåêöèþ ñèìâîëüíûõ äàííûõ CDATA
(íàïðèìåð, â XHTML â íåé çàäàåòñÿ êîä ñöåíàðèÿ JavaScript).
Ÿ8. Ïðîñòðàíñòâà èìåí XML
×òî äåëàòü, åñëè îïðåäåëåííûå ðàçíûìè ðàçðàáîò÷èêàìè èìåíà òåãîâ ñîâïàäàþò, à ñëîâàðè ñëåäóåò èñïîëüçîâàòü ñîâìåñòíî (íàïðèìåð, XHTML è MathML)?
Ïðîñòðàíñòâà èìåí ðåøàþò ýòó ïðîáëåìó, äîáàâëÿÿ ê èìåíàì
àòðèáóòîâ è òåãîâ óíèêàëüíûé ïðåôèêñ, îòäåëÿåìûé äâîåòî÷èåì.
Ïðîñòðàíñòâî èìåí îïðåäåëÿåòñÿ ñ ïîìîùüþ ñïåöèàëüíîãî
àòðèáóòà xmlns:ïðåôèêñ=óíèêàëüíîå_èìÿ. Îáû÷íî â êà÷åñòâå óíèêàëüíîãî èìåíè äëÿ ïðîñòðàíñòâà èìåí èñïîëüçóåòñÿ URN (URL
èëè URI):
<book:library xmlns:book="http:/www.apmath.spbu.ru">
<book:book>
<book:title>
Real World XML
</book:title>
</book:book>
</book:library>
Ïîçâîëèòåëüíî ñîâìåùåíèå íåñêîëüêèõ ïðîñòðàíñòâ èìåí, èñïîëüçóåìûõ äëÿ ðàçìåòêè äîêóìåíòà XML:
<book:library xmlns:book="http:/www.apmath.spbu.ru"
xmlns:steve="http:/www.star.com/steve">
<book:book>
<book:title>
25
Real World XML
</book:title>
<steve:review steve:ID="100003">
OK
</steve:review>
</book:book>
</book:library>
Ìîæíî îïðåäåëèòü ëîêàëüíîå ïðîñòðàíñòâî èìåí, äåéñòâèå
êîòîðîãî ðàñïðîñòðàíÿåòñÿ òîëüêî íà àòðèáóòû îäíîãî ýëåìåíòà è
åãî ñîäåðæèìîãî. Äëÿ ýòîãî ñëåäóåò â îòêðûâàþùåì òåãå ýëåìåíòà
÷åðåç àòðèáóò xmlns:ïðåôèêñ îïðåäåëèòü ïðîñòðàíñòâî èìåí:
<book:library xmlns:book="http:/www.apmath.spbu.ru">
<book:book>
<book:title>
Real World XML
</book:title>
<steve:review xmlns:steve="http:/www.star.com/steve"
steve:ID="100003">
OK
</steve:review>
</book:book>
</book:library>
Íåëüçÿ äëÿ ïðåôèêñà ïðîñòðàíñòâà èìåí èñïîëüçîâàòü èìÿ, íà÷èíàþùååñÿ ñ ïîñëåäîâàòåëüíîñòè ñèìâîëîâ xml â
ëþáîé êîìáèíàöèè ðåãèñòðîâ.
Çàìå÷àíèå 8.1.
Ìîæíî çàäàòü óìàë÷èâàåìîå ïðîñòðàíñòâî èìåí, äëÿ çàäàíèÿ
ýëåìåíòîâ êîòîðîãî íå òðåáóåòñÿ íèêàêîãî ïðåôèêñà. Òàêîå ïðîñòðàíñòâî èìåí çàäàåòñÿ àòðèáóòîì xmlns áåç ïðåôèêñà (è èìåíà
âñåõ òåãîâ è àòðèáóòîâ ýòîãî ïðîñòðàíñòâà èìåí íå òðåáóþò çàäàíèÿ
ïðåôèêñà):
<library xmlns="http:/www.apmath.spbu.ru"
xmlns:steve="http:/www.star.com/steve">
<book>
<title>
Real World XML
26
</title>
<steve:review steve:ID="100003">
OK
</steve:review>
</book>
</library>
Ÿ9. Îïðåäåëåíèå DTD
Ðàçìåòêà â XML-äîêóìåíòå âûïîëíÿåò ôóíêöèþ îïèñàíèÿ åãî
ëîãè÷åñêîé ñòðóêòóðû âìåñòå ñî ñòðóêòóðîé õðàíåíèÿ èíôîðìàöèè
è ñâÿçûâàíèÿ ïàð èìÿ àòðèáóòà/çíà÷åíèå ñ ëîãè÷åñêîé ñòðóêòóðîé
äîêóìåíòà. ßçûê XML ïðåäîñòàâëÿåò ìåõàíèçì îïèñàíèå òèïà
äîêóìåíòà äëÿ îïðåäåëåíèÿ îãðàíè÷åíèé íà ëîãè÷åñêóþ ñòðóêòóðó äîêóìåíòà è äëÿ ïîääåðæêè èñïîëüçîâàíèÿ ïðåäîïðåäåëåííûõ
åäèíèö õðàíåíèÿ èíôîðìàöèè.
Äîêóìåíò XML ñ÷èòàåòñÿ äåéñòâèòåëüîïèñàíèå òèïà äîêóìåíòà è åñëè äîêóìåíò ñîãëàñóåòñÿ ñî âñåìè îãðàíè÷åíèÿìè, îïðåäåëåííûìè â ýòîì
îïèñàíèè òèïà.
Îïðåäåëåíèå 1.9.1.
íûì, åñëè ñ íèì ñâÿçàíî
Îïèñàíèå òèïà XML-äîêóìåíòà ñîäåðæèò èëè óêàçûâàåò íà
îáúÿâëåíèÿ ðàçìåòêè, êîòîðûå îïðåäåëÿþò ãðàììàòèêó äëÿ öåëîãî
êëàññà äîêóìåíòîâ. Ýòà ãðàììàòèêà èçâåñòíà êàê îïðåäåëåíèå òèïà äîêóìåíòà (DTD Document Type Denition). Îïèñàíèå òèïà
äîêóìåíòà ìîæåò ññûëàòüñÿ íà âíåøíåå ïîäìíîæåñòâî îáúÿâëåíèé
ðàçìåòêè (ñïåöèàëüíûé òèï âíåøíåé ñóùíîñòè) èëè íåïîñðåäñòâåííî îáúÿâëÿòü ðàçìåòêó â ñâîåì âíóòðåííåì ïîäìíîæåñòâå èëè èñïîëüçîâàòü îáà ïîäõîäà. Îïðåäåëåíèå òèïà äîêóìåíòà DTD ñîñòîèò
èç îáîèõ óêàçàííûõ ïîäìíîæåñòâ îáúÿâëåíèé ðàçìåòêè.
Îáúÿâëåíèå ðàçìåòêè ìîæåò áûòü îáúÿâëåíèåì îäíîãî èç ñëåäóþùèõ òèïîâ: îáúÿâëåíèåì òèïà ýëåìåíòà, îáúÿâëåíèåì ñïèñêà
àòðèáóòîâ, îáúÿâëåíèåì ñóùíîñòè èëè îáúÿâëåíèåì íîòàöèè.
Îïðåäåëåíèå òèïà äîêóìåíòà DTD îáúÿâëÿåòñÿ ïîñðåäñòâîì
ýëåìåíòà <!DOCTYPE> îäíîãî èç ïåðå÷èñëåííûõ íèæå âèäîâ, çàäàâàåìîãî ñðàçó æå ïîñëå xml-îáúÿâëåíèÿ äîêóìåíòà:
1. <!DOCTYPE rootname [DTD]>
27
2. <!DOCTYPE rootname SYSTEM URL>
3. <!DOCTYPE rootname SYSTEM URL [DTD]>
4. <!DOCTYPE rootname PUBLIC identifier URL>
5. <!DOCTYPE rootname PUBLIC identifier URL [DTD]>
Âñòðîåííîå â äîêóìåíò XML îïðåäåëåíèå òèïà äîêóìåíòà
DTD âèäà 1 ïîçâîëÿåò íåïîñðåäñòâåííî â ñàìîì äîêóìåíòå XML
çàäàòü âñå íåîáõîäèìûå îáúÿâëåíèÿ ðàçìåòêè äëÿ ââîäà îãðàíè÷åíèé íà ëîãè÷åñêóþ ñòðóêòóðó äîêóìåíòà. Ïîäîáíûé ïîäõîä ïðèìåíèì, åñëè ñîçäàåòñÿ íåáîëüøîå ÷èñëî äîêóìåíòîâ óêàçàííîãî òèïà.
Ïðèìåð èñïîëüçóåìîãî â íàøåì ïîñîáèè äîêóìåíòà XML ñî âñòðîåííûì îïðåäåëåíèåì òèïà äîêóìåíòà DTD:
<?xml version="1.0" standalone="yes" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (GREETING, MESSAGE)>
<!ELEMENT GREETING (#PCDATA)>
<!ELEMENT MESSAGE (#PCDATA)>
]>
<DOCUMENT>
<GREETING>Hello From XML</GREETING>
<MESSAGE>Äîáðî ïîæàëîâàòü â ìèð XML.</MESSAGE>
</DOCUMENT>
Ïðîâåðêà äåéñòâèòåëüíîñòè íà îñíîâå DTD
Ìîäóëè ïðîâåðêè äåéñòâèòåëüíîñòè XML-äîêóìåíòîâ äîñòóïíû â Èíòåðíåòå, íàïðèìåð, ïî àäðåñó http://validator.w3.org/.
Ìîæíî èñïîëüçîâàòü API è ïðîãðàììíûå ïðîäóêòû ðàçëè÷íûõ êîìïàíèé, íàïðèìåð, îáúåêòíóþ áèáëèîòåêó msxml.dll, ñâîáîäíî çàãðóæàåìóþ ñ ñàéòà ôèðìû Microsoft (ñì. ñòð. 11).
Îáúÿâëåíèå òèïà ýëåìåíòà
Äëÿ îáúÿâëåíèÿ òèïà ýëåìåíòà èñïîëüçóåòñÿ ñëåäóþùåå ïðàâèëî ãðàììàòèêè îïèñàíèÿ òèïà äîêóìåíòà:
<!ELEMENT èìÿ ìîäåëü_ñîäåðæèìîãî>
Ìîäåëü ñîäåðæèìîãî ìîæåò áûòü ñëåäóþùèõ âèäîâ:
28
• <!ELEMENT èìÿ EMPTY> ïóñòîé ýëåìåíò áåç ñîäåðæèìîãî, íî
ìîæåò èìåòü àòðèáóòû.
• <!ELEMENT èìÿ ANY> ëþáîé òèï ñîäåðæèìîãî (ëþáîé ýëåìåíò
èëè ñèìâîëüíûå äàííûå â ëþáîì ïîðÿäêå ôàêòè÷åñêè ñîäåðæèìîå ýëåìåíòà íå ïðîâåðÿåòñÿ).
• <!ELEMENT èìÿ (èìÿ_äî÷åðíåãî_ýë)> ñîäåðæèò îäèí äî÷åðíèé ýëåìåíò.
• <!ELEMENT èìÿ (#PCDATA)> ñîäåðæèò îáû÷íûé òåêñò (ðàçîáðàííûå ñèìâîëüíûå äàííûå parced character data) (åäèíñòâåííûé ñïîñîá óêàçàíèÿ ôîðìàòà ôàêòè÷åñêîãî ñèìâîëüíîãî ñîäåðæèìîãî ýëåìåíòà).
Ñ÷èòàåòñÿ, ÷òî ïîðÿäîê îáúÿâëåíèÿ ýëåìåíòîâ íå èìååò çíà÷åíèÿ.
Ìíîæåñòâåííûå äî÷åðíèå ýëåìåíòû îáúÿâëÿþòñÿ ñ ïîìîùüþ
ñèíòàêñèñà ðåãóëÿðíûõ âûðàæåíèé:
• a+ îäíî èëè áîëüøå ïîÿâëåíèé a;
• a? îäíî èëè íè îäíîãî ïîÿâëåíèé a;
• a* íóëü èëè áîëüøå ïîÿâëåíèé a;
• a, b ïîñëå a ñëåäóåò b;
• a | b a èëè b;
• (âûðàæåíèå) åäèíûé ìîäóëü è ê íåìó ìîæíî ïðèìåíÿòü
êâàíòèôèêàòîðû;
Íèæå ïîêàçàí ôðàãìåíò DTD äëÿ îïèñàíèÿ êîðàáëÿ:
<!ELEMENT ship (plate+)>
<!-- Âíóòðåííèõ âûðåçîâ â ïëàñòèíå ìîæåò
áûòü ìíîãî èëè íè îäíîãî -->
<!ELEMENT plate (outerContour,innerContour*)>
<!-- Êàê ìèíèìóì òðè òî÷êè â êîíòóðàõ -->
<!ELEMENT outerContour (point,point,point+)>
<!ELEMENT innerContour (point,point,point+)>
<!ELEMENT point EMPTY>
29
Ïðàâèëà ãðàììàòèêè îïèñàíèÿ òèïà äîêóìåíòà ïîçâîëÿþò çàäàâàòü òèï ýëåìåíòà ñî ñìåøàííûì ñîäåðæèìûì ñèìâîëüíûå
äàííûå (òåêñò) âïåðåìåøêó ñ ýëåìåíòàìè XML. Â ðåêîìåíäàöèÿõ
ïîäîáíîå ñîäåðæèìîå çàäàåòñÿ ñëåäóþùèì ïðàâèëîì:
Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')'
Çäåñü S èñïîëüçóåòñÿ äëÿ îáîçíà÷åíèÿ ïðîáåëüíûõ ñèìâîëîâ, à
#PCDATA äëÿ ðàçîáðàííûõ ñèìâîëüíûõ äàííûõ (íå ñîäåðæàùèõ
ñèìâîëû, èñïîëüçóåìûå äëÿ ðàçìåòêè). Ïðè çäàíèè ýëåìåíòà ñî
ñìåøàííûì ñîäåðæèìûì íåëüçÿ èñïîëüçîâàòü îäíî è òîæå èìÿ
äëÿ äî÷åðíåãî ýëåìåíòà áîëåå îäíîãî ðàçà. Îáðàùàåì âíèìàíèå,
÷òî â ñîîòâåòñòâèè ñ ïðèâåäåííûì ïðàâèëîì â ñìåøàííîì ñîäåðæèìîì íåëüçÿ îïðåäåëèòü ïîðÿäîê ïîÿâëåíèÿ ñèìâîëüíûõ äàííûõ
è äî÷åðíèõ ýëåìåíòîâ, à òàêæå èõ êîëè÷åñòâî:
<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
Íàðÿäó ñ îáúÿâëåíèåì ðàçìåòêè â îïèñàíèè òèïà äîêóìåíòà
ìîæíî èñïîëüçîâàòü êîììåíòàðèè äëÿ ïîÿñíåíèÿ ââîäèìûõ îáúÿâëåíèé.
Âíåøíèå îïðåäåëåíèÿ òèïà äîêóìåíòà DTD
Âíåøíèå îïðåäåëåíèÿ òèïà äîêóìåíòà DTD ìîãóò áûòü çàêðûòûìè è îòêðûòûìè è îáÿçàíû ðàñïîëàãàòüñÿ âî âíåøíèõ ôàéëàõ.
Çàêðûòîå îïðåäåëåíèå òèïà äîêóìåíòà DTD ïðåäíàçíà÷åíî
äëÿ èñïîëüçîâàíèÿ ãðóïïîé ëèö (çàêðûòûé èäåíòèôèêàòîð) è ââîäèòñÿ â äîêóìåíò îäíèì èç ïðåäñòàâëåííûõ íèæå îáúÿâëåíèé
<!DOCTYPE:
• <!DOCTYPE rootname SYSTEM URL>
• <!DOCTYPE rootname SYSTEM URL [DTD]>
URL îïðåäåëÿåò îòíîñèòåëüíûé èëè àáñîëþòíûé àäðåñ ôàéëà
ñ îáúÿâëåíèÿìè ðàçìåòêè è çàäàåòñÿ îáÿçàòåëüíî â êàâû÷êàõ èëè
àïîñòðîôàõ. Âòîðàÿ ôîðìà îáúÿâëåíèÿ <!DOCTYPE ïðåäíàçíà÷åíà
äëÿ ââåäåíèÿ äîïîëíèòåëüíûõ îáúÿâëåíèé ðàçìåòêè (â êâàäðàòíûõ
ñêîáêàõ ïîñëå àäðåñà ôàéëà) íåïîñðåäñòâåííî â äîêóìåíòå.
30
Çàìåòèì, ÷òî ôàéë ñ îáúÿâëåíèÿìè ðàçìåòêè ìîæåò áûòü ïóñòûì.  ýòîì ñëó÷àå âñå îáúÿâëåíèÿ ðàçìåòêè ìîãóò áûòü çàäàíû
íåïîñðåäñòâåííî â äîêóìåíòå XML, îäíàêî âåñü äîêóìåíò áóäåò îáðàáîòàí ñèíòàêñè÷åñêèì àíàëèçàòîðîì XML òîëüêî ïðè óñëîâèè
äîñòóïà ê çàäàííîìó ôàéëó.
Îïðåäåëåíèå òèïà äîêóìåíòà DTD äëÿ âñåîáùåãî èñïîëüçîâàíèÿ ââîäèòñÿ â äîêóìåíò îäíèì èç ïðåäñòàâëåííûõ íèæå îáúÿâëåíèé <!DOCTYPE:
• <!DOCTYPE rootname PUBLIC identifier URL>
• <!DOCTYPE rootname PUBLIC identifier URL [DTD]>
Çäåñü URL òàêæå îïðåäåëÿåò îòíîñèòåëüíûé èëè àáñîëþòíûé
àäðåñ ôàéëà ñ îáúÿâëåíèÿìè ðàçìåòêè. Âòîðàÿ ôîðìà èìååò òîò
æå ñìûñë, ÷òî è âòîðàÿ ôîðìà äëÿ çàêðûòîãî îïèñàíèÿ òèïà äîêóìåíòà DTD.
Ôîðìàëüíûé îòêðûòûé èäåíòèôèêàòîð (formal public identier FPI) identifier ïðåäñòàâëÿåò èíôîðìàöèþ î òèïå äîêóìåíòà,
çàäàåòñÿ â àïîñòðîôàõ èëè êàâû÷êàõ è ñîñòîèò èç ÷åòûðåõ ïîëåé,
ðàçäåëÿåìûõ ñèìâîëàìè //:
1. Ïîëå 1 ïðîøåë ëè ñòàíäàðòèçàöèþ (- íåò; + â äàííîì ñëó÷àå ñòàíäàðò íå ïðèìåíÿåòñÿ, íî DTD îäîáðåíî; äëÿ
îôèöèàëüíûõ ñòàíäàðòîâ èìÿ ýòîãî ñòàíäàðòà, íàïðèìåð,
ISO/IEC 13449:2000
2. Ïîëå 2 îïèñûâàåò èìÿ ãðóïïû èëè ëèö
à, êîòîðîå ïîääåðæèâàåò èëè îòâåòñòâåííî çà ýòî îïðåäåëåíèå (óíèêàëüíîå èìÿ)
3. Ïîëå 3 óêàçûâàåò òèï äîêóìåíòà, îáû÷íî ñîïðîâîæäàåòñÿ
èäåíòèôèêàòîðîì âåðñèè
4. Ïîëå 4 èñïîëüçóåìûé îïðåäåëåíèåì DTD ÿçûê
Ïðèìåð çàäàíèÿ ôîðìàëüíîãî îòêðûòîãî èäåíòèôèêàòîðà:
"-//starEditor//Custom XML Version 1.0//EN"
Ñóùíîñòè
31
Ñóùíîñòü ïðåäñòàâëÿåò ñîáîé ñîñòàâëÿþùèé (ôèçè÷åñêèé)
ýëåìåíò XML-äîêóìåíòà. Îíè äåëÿòñÿ íà äâà òèïà: îáùèå è ïàðàìåòðè÷åñêèå. Ññûëêè íà ïåðâûå èñïîëüçóþòñÿ âíóòðè äîêóìåíòà äëÿ ôîðìèðîâàíèÿ åãî ñîäåðæèìîãî èç îòäåëüíûõ ÷àñòåé, òîãäà
êàê âòîðûå ïðèìåíÿþòñÿ â DTD.
Îáðàùåíèå â äîêóìåíòå ê ñóùíîñòè âûïîëíÿåòñÿ ñ ïîìîùüþ
ññûëêè íà íåå:
• &èìÿ_ñóùí; ññûëêà íà îáùóþ ñóùíîñòü;
• %èìÿ_ñóùí; ññûëêà íà ïàðàìåòðè÷åñêóþ ñóùíîñòü.
XML-ïðîöåññîð ïðè îáðàáîòêå XML-äîêóìåíòà çàìåíÿåò
âñòðåòèâøóþñÿ ññûëêó íà ñóùíîñòü åå ñîäåðæèìûì (îáû÷íî òåêñòîâûå äàííûå, íî ìîãóò áûòü è â äâîè÷íîé ôîðìå).
Ñóùíîñòè ìîãóò áûòü âíåøíèå (ñîäåðæèìîå ñóùíîñòè õðàíèòñÿ âî âíåøíåì ðåñóðñå, à ïîýòîìó â åå îïðåäåëåíèè îáÿçàòåëåí
URI ýòîãî ðåñóðñà) è âíóòðåííèå (ñîäåðæèìîå ñóùíîñòè ïîëíîñòüþ îïðåäåëÿåòñÿ â DTD).
Ñóùíîñòè äåëÿòñÿ íà ðàçáèðàåìûå è íåðàçáèðàåìûå :
• Ðàçáèðàåìûå çàìåíÿþòñÿ íà òåêñò, êîòîðûé ìîæåò ñîäåðæàòü
ìàðêèðîâêó (âíóòðåííèå íà ñîäåðæèìîå ñóùíîñòè ïîñëå ïîäñòàíîâêè ñèìâîëüíûõ ññûëîê è ññûëîê íà ïàðàìåòðè÷åñêèå
ñóùíîñòè; âíåøíèå íà ñîäåðæèìîå ñóùíîñòè áåç ïîäñòàíîâêè
ñèìâîëüíûõ ññûëîê è ññûëîê íà ïàðàìåòðè÷åñêèå ñóùíîñòè
îíè çàìåíÿþòñÿ íåïîñðåäñòâåííî â äîêóìåíòå).
• Íåðàçáèðàåìûå çàìåíÿþòñÿ íà èõ ñîäåðæèìîå, êîòîðîå ìîæåò
áûòü ïðåäñòàâëåíî êàê îáû÷íûì òåêñòîì (íå îáÿçàòåëüíî ðàçìå÷åííûì ïî ïðàâèëàì XML), òàê è äâîè÷íûìè äàííûìè.
 XML ïðåäîïðåäåëåíû ïÿòü ñèìâîëüíûõ ñóùíîñòåé (ññûëîê
íà ñèìâîëû): <, >, &, " è '.
Îáùèå ñóùíîñòè
Âíóòðåííèå
ãî ýëåìåíòà:
ñóùíîñòè çàäàþòñÿ â DTD ñ ïîìîùüþ ñëåäóþùå-
<!ENTITY èìÿ îïðåäåëåíèå>
32
Çäåñü îïðåäåëåíèå ñòðîêà, ïðåäñòàâëÿþùàÿ ñîäåðæèìîå
ñóùíîñòè, âîçìîæíî ñîäåðæàùàÿ ññûëêè íà äðóãèå îáùèå èëè ïàðàìåòðè÷åñêèå ñóùíîñòè, íàïðèìåð:
<!ENTITY university "CÏáÃÓ">
<!ENTITY address "Ðîññèÿ, &university;">
Çàäàíèå ñóùíîñòåé íàïîìèíàåò çàäàíèå ïîëüçîâàòåëüñêèõ
êîíñòàíò â ÿçûêàõ ïðîãðàììèðîâàíèÿ. Äëÿ ñóùíîñòåé, êàê è äëÿ
êîíñòàíò, íå äîïóñòèìî çàöèêëèâàíèå ññûëîê.
Âíóòðåííèå ñóùíîñòè âñåãäà ðàçáèðàåìûå.
Âíåøíèå ñóùíîñòè ìîãóò áûòü êàê ðàçáèðàåìûå, òàê è íåðàçáèðàåìûå. Îáúÿâëåíèå âíåøíèõ ñóùíîñòåé ïîõîæå íà îáúÿâëåíèå
âíåøíèõ DTD îíè ìîãóò áûòü çàêðûòûìè è îòêðûòûìè:
• çàêðûòûå çàäàþòñÿ ñ êëþ÷åâûì ñëîâîì SYSTEM
<!ENTITY èìÿ SYSTEM URI>
• äëÿ îòêðûòûõ êðîìå êëþ÷åâîãî ñëîâà PUBLIC åùå íåîáõîäèìî
çàäàòü îòêðûòûé èäåíòèôèêàòîð
<!ENTITY èìÿ PUBLIC FPI URI>
Âíåøíèé ðåñóðñ äëÿ ðàçáèðàåìîé ñóùíîñòè äîëæåí èìåòü òåêñòîâîå ñîäåðæèìîå (âîçìîæíî ñ ðàçìåòêîé) ñî ññûëêàìè íà îáùèå
èëè ïàðàìåòðè÷åñêèå ñóùíîñòè, êîòîðûå ðàçðåøàþòñÿ óæå ïîñëå
ïîäñòàíîâêè â äîêóìåíò XML.
Âíåøíèå ñóùíîñòè ïîçâîëÿþò ôîðìèðîâàòü äîêóìåíò íà îñíîâå îòäåëüíûõ ÷àñòåé:
<!DOCTYPE library [
...
<!ENTITY data SYSTEM "./ch04.xml">
...
]>
<library>
...
&data;
...
</library>
33
Ïàðàìåòðè÷åñêèå ñóùíîñòè
ÎÃÐÀÍÈ×ÅÍÈÅ: ïàðàìåòðè÷åñêèå ñóùíîñòè ìîæíî îïðå-
äåëÿòü è èñïîëüçîâàòü ññûëêè íà íèõ òîëüêî âî âíåøíèõ DTD!
Ïàðàìåòðè÷åñêèå ñóùíîñòè, êàê è îáùèå, äåëÿòñÿ íà âíóòðåííèå, îïðåäåëÿåìûå íåïîñðåäñòâåííî â DTD, è âíåøíèå, îïðåäåëåíèå
êîòîðûõ âûíåñåíî âî âíåøíèé ðåñóðñ.
Âíóòðåííèå ñóùíîñòè îáúÿâëÿþòñÿ è îïðåäåëÿþòñÿ ñ ïîìîùüþ ñëåäóþùåãî ýëåìåíòà:
<!ENTITY % èìÿ îïðåäåëåíèå>
Ñòðîêîâûé ïàðàìåòð îïðåäåëåíèå êàê ðàç è ñîäåðæèò îïðåäåëåíèå ñóùíîñòè, êîòîðîå ìîæåò âêëþ÷àòü ññûëêè íà äðóãèå ïàðàìåòðè÷åñêèå ñóùíîñòè. Îïðåäåëåííóþ òàêèì ñïîñîáîì ñóùíîñòü
ìîæíî èñïîëüçîâàòü â DTD ïðè îïðåäåëåíèè ñîäåðæèìîãî â îáúÿâëåíèÿõ ýëåìåíòîâ, ñóùíîñòåé è àòðèáóòîâ:
<!ENTITY % content "title, name">
<!ELEMENT SIGNATURE (%content;, date)>
Âíåøíèå ñóùíîñòè îáúÿâëÿþòñÿ ññûëêîé íà âíåøíèé ðåñóðñ,
õðàíÿùèé èõ îïðåäåëåíèå:
<!ENTITY % èìÿ SYSTEM URI>
<!ENTITY % èìÿ PUBLIC FPI URI>
Ñìûñë âñåõ ïàðàìåòðîâ òàêîé æå, êàê è ïðè îáúÿâëåíèè âíåøíåé îáùåé ñóùíîñòè.
Èñïîëüçóåìàÿ ïàðàìåòðè÷åñêàÿ ñóùíîñòü äîëæíà áûòü îïðåäåëåíà äî åå èñïîëüçîâàíèÿ
Ñîâìåñòíî ñ ïàðàìåòðè÷åñêèìè ñóùíîñòÿìè èñïîëüçóþòñÿ äèðåêòèâû INCLUDE è IGNORE:
<![ INCLUDE [ ... ]]>
<![ IGNORE [ ... ]]>
Îíè ïîçâîëÿþò ¾ïîìåòèòü¿ âêëþ÷àåìûå èëè èãíîðèðóåìûå
îáúÿâëåíèÿ ýëåìåíòîâ, ñóùíîñòåé è àòðèáóòîâ è ïîëåçíû âî âðåìÿ
ðàçðàáîòêè DTD. Ìîæíî îïðåäåëèòü äâå ïàðàìåòðè÷åñêèå ñóùíîñòè draft è final. Ïåðâóþ èñïîëüçîâàòü äëÿ âêëþ÷åíèÿ â ðåæèìå
îòëàäêè êàêîãî-ëèáî îáúÿâëåíèÿ, à âòîðóþ äëÿ åãî îêîí÷àòåëüíîãî
âàðèàíòà:
34
<!ENTITY % draft 'INCLUDE'>
<!ENTITY % final 'IGNORE' >
 DTD èõ ñëåäóåò èñïîëüçîâàòü òàêèì îáðàçîì:
<![ %draft; [
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final; [
<!ELEMENT book (title, body, supplements?)>
]]>
Ïîñëå ïðîâåðêè íîâîãî âàðèàíòà ìîæíî âåðíóòüñÿ ê ñòàðîìó ïåðåîïðåäåëèâ óêàçàííûå âûøå ñóùíîñòè íà ïðîòèâîïîëîæíûå
çíà÷åíèÿ.
Àòðèáóòû
Äëÿ êàæäîãî ýëåìåíòà ìîæíî îáúÿâèòü ñïèñîê àòðèáóòîâ, ïîçâîëÿþùèõ îïðåäåëèòü äëÿ íåãî äîïîëíèòåëüíóþ èíôîðìàöèþ:
<!ATTLIST èìÿ_ýëåìåíòà
èìÿ_àòðèáóòà òèï óìàë÷èâàåìîå_ïîâåäåíèå
èìÿ_àòðèáóòà òèï óìàë÷èâàåìîå_ïîâåäåíèå
. . .
èìÿ_àòðèáóòà òèï óìàë÷èâàåìîå_ïîâåäåíèå >
Ïðèìåð DTD ñ ýëåìåíòîì GREETING, äëÿ êîòîðîãî çàäàíû
àòðèáóòû:
<!ELEMENT DOCUMENT (GREETING, MESSAGE)>
<!ELEMENT GREETING (#PCDATA)>
<!ELEMENT MESSAGE (#PCDATA)>
<!ATTLIST GREETING
lang CDATA #REQUIRED
type (text|audio|video) "text"
hand (UP|DOWN) #IMPLIED>
Óìàë÷èâàåìîå ïîâåäåíèå àòðèáóòà
Óìàë÷èâàåìîå ïîâåäåíèå çàäàåòñÿ îäíèì èç ñëåäóþùèõ ñïîñîáîâ:
35
• çíà÷åíèå â ñîîòâåòñòâèè ñ òèïîì àòðèáóòà.  ýòîì ñëó÷àå
àòðèáóò îïðåäåëåí, äàæå åñëè ïîëüçîâàòåëü åãî íå çàäàë, è
èìååò óêàçàííîå çíà÷åíèå. Ïîëüçîâàòåëü ìîæåò åãî èçìåíèòü.
<!ATTLIST GREETING lang CDATA "en">
• #REQUIRED Àòðèáóò îáÿçàòåëåí, åãî çíà÷åíèå çàäàåò ïîëüçîâàòåëü, óìàë÷èâàåìîãî çíà÷åíèÿ íåò
<!ATTLIST GREETING lang CDATA #REQUIRED>
• #IMPLIED Àòðèáóò íå îáÿçàòåëåí, à ïîýòîìó è óìàë÷èâàåìîãî
çíà÷åíèÿ íåò
<!ATTLIST GREETING lang CDATA #IMPLIED>
• #FIXED Àòðèáóò îïðåäåëåí è âñåãäà èìååò óêàçàííîå ïîñëå
êëþ÷åâîãî ñëîâà çíà÷åíèå, ïîëüçîâàòåëü íå ìîæåò åãî èçìåíèòü (ïîïûòêà âûïîëíèòü ýòî ïðèâåäåò ê òîìó, ÷òî äîêóìåíò
áóäåò íåäåéñòâèòåëüíûì!)
<!ATTLIST GREETING lang CDATA #FIXED "en">
Òèïû àòðèáóòîâ
CDATA ñòðîêà ñèìâîëüíûõ äàííûõ (ìîæíî èñïîëüçîâàòü ññûëêè
íà ñèìâîëüíûå è îáùèå ñóùíîñòè (â çíà÷åíèÿõ ïî óìîë÷àíèþ
â DTD òîæå))
<!ATTLIST GREETING lang CDATA "value &temp;">
òèï íå èìååò êëþ÷åâîãî ñëîâà, ïðîñòî èñïîëüçóåòñÿ âûðàæåíèå â êðóãëûõ ñêîáêàõ ñïèñêà çíà÷åíèé, ðàçäåëåííûõ âåðòèêàëüíîé ÷åðòîé, (value1 | value2 | ... | valueN).
Óìàë÷èâàåìîå çíà÷åíèå çàäàåòñÿ ñòðîêîé èç óêàçàííîãî ñïèñêà çíà÷åíèé.
Ïåðå÷èñëÿåìûé
36
<!ATTLIST GREETING lang (Yes | No) "No"
NMTOKEN ëåêñåìà ïðîñòîãî èìåíè â XML (îäíà èëè áîëüøå áóêâ,
öèôð, äåôèñà, ïîä÷åðêèâàíèÿ, òî÷êè, äâîåòî÷èÿ, íå îáÿçàòåëüíî íà÷èíàþùàÿñÿ ñ áóêâû, ïîä÷åðêèâàíèÿ èëè äâîåòî÷èÿ).
<!ATTLIST GREETING lang NMTOKEN "1:_.">
NMTOKENS çíà÷åíèÿ èç íåñêîëüêèõ ëåêñåì NMTOKEN, ðàçäåëåííûõ
ïðîáåëüíûìè ñèìâîëàìè.
<!ATTLIST GREETING lang NMTOKENS "Alex Green">
ID àòðèáóò ñ óíèêàëüíûì äëÿ âñåãî äîêóìåíòà ñðåäè àòðèáóòîâ
ýòîãî òèïà çíà÷åíèåì, êîòîðîå ñîîòâåòñòâóåò èìåíè â XML
(íà÷èíàåòñÿ ñ áóêâû, ñèìâîëà ïîä÷åðêèâàíèÿ èëè äâîåòî÷èÿ).
Ýëåìåíò ìîæåò èìåòü ÎÄÈÍ àòðèáóò ýòîãî òèïà, óìàë÷èâàåìîãî çíà÷åíèÿ íåò, òàê êàê íàçíà÷àåòñÿ ïîëüçîâàòåëåì, à
ïîýòîìó óìàë÷èâàåìîå ïîâåäåíèå #IMPLIED èëè #REQUIRED.
<!ATTLIST GREETING lang ID #REQUIRED>
IDREF çíà÷åíèå àòðèáóòà òèïà ID íåêîòîðîãî ýëåìåíòà ýòîãî æå
äîêóìåíòà (XML-ïðîöåññîð ïðîâåðÿåò íàëè÷èå â äîêóìåíòå
ýëåìåíòà ñ óêàçàííûì çíà÷åíèåì àòðèáóòà òèïà ID).
<!ATTLIST GREETING lang IDREF #REQUIRED>
ENTITY çíà÷åíèå èìåíè îáúÿâëåííîé âíåøíåé
ñóùíîñòè.
íåðàçáèðàåìîé
<!ENTITY img1 SYSTEM "pict.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
<!ATTLIST GREETING lang ENTITY "img1">
37
ENTITIES ñïèñîê èìåí îáúÿâëåííûõ âíåøíèõ
ñóùíîñòåé.
íåðàçáèðàåìûõ
<!ENTITY img1 SYSTEM "pict.gif" NDATA GIF>
<!ENTITY img2 SYSTEM "pict2.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
<!ATTLIST GREETING lang ENTITIES "img1 img2">
NOTATION ïåðå÷èñëÿåìûé òèï, çàäàþùèé ñïèñîê îáúÿâëåííûõ â
DTD íîòàöèé ôîðìàòà ïðåäñòàâëåíèÿ äàííûõ (MIME-òèïîâ),
îòëè÷íîãî îò XML-êîäà.
<!NOTATION GIF SYSTEM "image/gif">
<!NOTATION JPG SYSTEM "image/jpeg">
<!ATTLIST GREETING lang NOTATION (GIF | JPG) "GIF">
Âíåäðåíèå äàííûõ îòëè÷íîãî îò XML ôîðìàòà
Âíåøíèå íåðàçáèðàåìûå îáùèå ñóùíîñòè èñïîëüçóþòñÿ äëÿ
âíåäðåíèÿ â äîêóìåíò XML äàííûõ îòëè÷íîãî îò XML ôîðìàòà
(â ÷àñòíîñòè äâîè÷íûõ äàííûõ). Èõ îáúÿâëåíèå â DTD îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ýëåìåíòîâ ENTITY ñëåäóþùåãî âèäà:
<!ENTITY èìÿ SYSTEM URI NDATA èìÿ_íîòàöèè>
<!ENTITY èìÿ PUBLIC FPI URI NDATA èìÿ_íîòàöèè>
Íîòàöèÿ çàäàåò èìÿ ôîðìàòà äàííûõ íåðàçáèðàåìûõ âíåøíèõ
ñóùíîñòåé
<!NOTATION èìÿ SYSTEM MIME-òèï>
Ïðèìåð çàäàíèÿ âíåøíåé íåðàçáèðàåìîé ñóùíîñòè ñ óêàçàíèåì ôîðìàòà åå äâîè÷íûõ äàííûõ ÷åðåç ññûëêó íà ñîîòâåòñòâóþùóþ
íîòàöèþ:
<!ENTITY img1 SYSTEM "pict.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
Äâîè÷íûå äàííûå âêëþ÷àþòñÿ â XML-äîêóìåíò ïîñðåäñòâîì
âíåøíèõ íåðàçáèðàåìûõ ñóùíîñòåé ÷åðåç àòðèáóòû ýëåìåíòîâ:
38
<!ATTLIST GREETING lang ENTITY "img1">
XML-ïðîöåññîð íå ðàçáèðàåò âñòðàèâàåìóþ ñóùíîñòü, íî ÷àñòî ïðîèçâîäèò ïðîâåðêó íàëè÷èÿ âíåøíåãî ôàéëà.
39
ÃËÀÂÀ 2.
ÎÁÚÅÊÒÍÀß ÌÎÄÅËÜ XMLDOM
Îáúåêòíàÿ ìîäåëü äîêóìåíòà (DOM) ÿâëÿåòñÿ èíòåðôåéñîì ïðèêëàäíîãî ïðîãðàììèðîâàíèÿ (API) êàê äëÿ ïðàâèëüíîñôîðìèðîâàííûõ äîêóìåíòîâ XML, òàê è äëÿ äåéñòâèòåëüíûõ
HTML-äîêóìåíòîâ, îïðåäåëÿÿ èõ ëîãè÷åñêóþ ñòðóêòóðó è ñïîñîá
äîñòóïà ê ñîñòàâëÿþùèì óêàçàííûå äîêóìåíòû ýëåìåíòàì è èõ ìàíèïóëèðîâàíèåì.
DOM ïðåäñòàâëÿåò äîêóìåíò â âèäå ëîãè÷åñêîé ñòðóêòóðû,
ïîçâîëÿÿ:
• ïåðåìåùàòü ÷àñòü ñòðóêòóðû äîêóìåíòà â äðóãîå ìåñòî, íå
ðàçðóøàÿ è íå ñîçäàâàÿ åå çàíîâî;
• ñîçäàâàòü íîâûå ýëåìåíòû è ïðèñîåäèíÿòü èõ ê ñòðóêòóðå äîêóìåíòà â ëþáîì åå ìåñòå;
• îðãàíèçîâûâàòü è ìàíèïóëèðîâàòü íîâûìè èëè ñóùåñòâóþùèìè âåòâÿìè ñòðóêòóðû ôðàãìåíòà äîêóìåíòà äî ïîìåùåíèÿ
îáúåêòîâ â ñòðóêòóðíîå äåðåâî äîêóìåíòà.
 îáúåêòíîé ìîäåëè äîêóìåíòà ëîãè÷åñêàÿ ñòðóêòóðà ïðåäñòàâëåíèÿ äîêóìåíòà ñ èåðàðõè÷åñêèìè ñâÿçÿìè ìåæäó åãî îñíîâíûìè ýëåìåíòàìè íàèáîëåå óäîáíî ìîæåò áûòü âûðàæåíà â âèäå
¾äåðåâà¿, à òî è öåëîãî ¾ëåñà¿. Îäíàêî ýòîò ôàêò íèêàê íå ñâÿçàí
ñ ðåàëèçàöèåé ýòîé ìîäåëè èìåííî â âèäå äðåâîâèäíîé ñòðóêòóðû.
Ðåêîìåíäàöèè íå ðåãëàìåíòèðóþò ñïîñîá ðåàëèçàöèè ìîäåëè îíà
ìîæåò áûòü ïðîèçâîëüíîé. Îñíîâíîå ýòî ïðèíöèï ñòðóêòóðíîãî èçîìîðôèçìà : äâå ðåàëèçàöèè îáúåêòíîé ìîäåëè äîêóìåíòà, èñïîëüçóåìûå äëÿ ïðåäñòàâëåíèÿ îäíîãî è òîãî æå äîêóìåíòà, ñîçäàòü
îäíó è òó æå ñòðóêòóðíóþ ìîäåëü ñ îäèíàêîâûìè îáúåêòàìè è èõ
ñâÿçÿìè.
Äðóãîé âàæíûé àñïåêò ìîäåëè DOM îíà îïåðèðóåò ñ
îáúåêòàìè â ïîëíîì ñîîòâåòñòâèè ñ òðàäèöèîííûìè îáúåêòíîîðèåíòèðîâàííûìè òåõíîëîãèÿìè: âñå ýëåìåíòû äîêóìåíòà ïðåäñòàâëÿþòñÿ â âèäå îáúåêòîâ.  óçëàõ ñòðóêòóðíîé ëîãè÷åñêîé ñõåìû íàõîäÿòñÿ îáúåêòû, à íå äàííûå, ñî âñåìè ïðèñóùèìè îáúåêòàì
ñâîéñòâàìè è ïîâåäåíèåì.
40
Îáúåêòíàÿ ìîäåëü, ðåàëèçîâàííàÿ â Internet Explorer 6.0, ïîëíîñòüþ ñîîòâåòñòâóåò ðåêîìåíäàöèÿì REC-DOM-Level-1-19981001
Êîíñîðöèóìà WWW.
Îáúåêòíàÿ ìîäåëü äîêóìåíòà, òàêèì îáðàçîì, êàê îáúåêòíàÿ
ìîäåëü, îïðåäåëÿåò:
• èíòåðôåéñû è îáúåêòû, èñïîëüçóåìûå äëÿ ïðåäñòàâëåíèÿ äîêóìåíòà è ìàíèïóëèðîâàíèÿ ñ íèì;
• ñåìàíòèêó (ñìûñë) ýòèõ èíòåðôåéñîâ è îáúåêòîâ, âêëþ÷àÿ è
ïîâåäåíèå, è àòðèáóòû;
• "ðîäñòâåííûå"ñâÿçè è âçàèìîäåéñòâèå ìåæäó ýòèìè èíòåðôåéñàìè è îáúåêòàìè.
Ÿ1. Óçëû îáúåêòíîé ìîäåëè DOM
Îáúåêòíàÿ ìîäåëü äîêóìåíòà ïðåäñòàâëÿåòñÿ óçëàìè (node ),
ðàñïîëîæåííûìè â âèäå èåðàðõè÷åñêîé äðåâîâèäíîé ñòðóêòóðû.
Êîíöåïöèÿ îáúåêòíîé ìîäåëè íå ïðèâÿçàíà íè ê êàêîìó êîíêðåòíîìó ïðåäñòàâëåíèþ äîêóìåíòà (HTML, XML, SGML). Îíà âñåãî
ëèøü îïèñûâàåò ëîãè÷åñêóþ îðãàíèçàöèþ äîêóìåíòà. Åå ðåàëèçàöèÿ â êîíêðåòíîé ñèñòåìå ïðåäñòàâëåíèÿ äîêóìåíòîâ ñòàâèò â ñîîòâåòñòâèå óçëàì ìîäåëè ðåàëüíûå ýëåìåíòû äîêóìåíòà.  îáúåêòíîé
ìîäåëè äîêóìåíòà, ðåàëèçîâàííîé äëÿ XML, â óçëàõ ìîãóò íàõîäèòüñÿ ëþáûå ýëåìåíòû XML èëè òåêñòîâûå îáúåêòû. Ýòè ýëåìåíòû íàçûâàþò óçëîâûìè ýëåìåíòàìè.
Óçëû â ìîäåëè DOM äëÿ äîêóìåíòà XML ìîãóò áûòü íåñêîëüêèõ òèïîâ. Âñå îíè ïðåäñòàâëåíû â òàáëèöå 1.
 òàáëèöå òàêæå ïðåäñòàâëåíû íàèìåíîâàíèÿ êîíñòàíò äëÿ
ïðîâåðêè òèïà äîêóìåíòà, îïðåäåëåííûå â ñïåöèôèêàöèè.  ðåàëèçàöèè áèáëèîòåêè MSXML ôèðìû Ìèêðîñîôò ýòè êîíñòàíòû èìåþò íåñêîëüêî îòëè÷íûå îò óêàçàííûõ íàèìåíîâàíèÿ (ñì. ïîñëåäíèé
ñòîëáåö òàáëèöû 1). Òèï ëþáîãî óçëà ìîæíî îïðåäåëèòü ïî çíà÷åíèþ åãî ñâîéñòâà nodeType.
Óçëû ïåðå÷èñëåííûõ òèïîâ è îáðàçóþò èåðàðõè÷åñêóþ äðåâîâèäíóþ ñòðóêòóðó äîêóìåíòà XML â îáúåêòíîé ìîäåëè DOM.
Íàïðèìåð, ïðîñòåéøèé äîêóìåíò XHTML, ñîñòîÿùèé èç ïóñòûõ
ýëåìåíòîâ head è body â ýòîé ìîäåëè áóäåò ïðåäñòàâëåí äåðåâîì,
41
Òàáëèöà 1. Òèïû óçëîâ â ìîäåëè DOMXML
Òèï
1
2
3
4
5
6
7
8
9
10
11
12
Îáúåêò
Ýëåìåíò
XML
Àòðèáóò
ýëåìåíòà
Òåêñòîâûé
óçåë
Ñåêöèÿ
CDATA
Ññûëêà íà
ñóùíîñòü
Ñóùíîñòü
Èíñòðóêöèÿ
îáðàáîòêè
Êîììåíòàðèé
Äîêóìåíò
Òèï äîêóìåíòà
Ôðàãìåíò
äîêóìåíòà
Íîòàöèÿ
Êîíñòàíòû ñïåöèôèêàöèè DOM
Êîíñòàíòû MSXML
ELEMENT_NODE
NODE_ELEMENT
ATTRIBUTE_NODE
NODE_ATTRIBUTE
TEXT_NODE
NODE_TEXT
CDATA_SECTION_NODE
NODE_CDATA_SECTION
ENTITY_REFERENCE_NODE
NODE_ENTITY_REFERENCE
ENTITY_NODE
PROCESSING_INSTRUCTION_
NODE
COMMENT_NODE
NODE_ENTITY
NODE_PROCESSING_
INSTRUCTION
NODE_COMMENT
DOCUMENT_NODE
DOCUMENT_TYPE_NODE
NODE_DOCUMENT
NODE_DOCUMENT_TYPE
NODE_DOCUMENT_FRAGMENT
DOCUMENT_FRAGMENT_NODE
NODE_NOTATION
NOTATION_NODE
ïîêàçàííîì íà ðèñ. 2.1.1. Âî ãëàâå èåðàðõèè íàõîäèòñÿ ýëåìåíò òèïà
9 (DOCUMENT_NODE), ïðåäñòàâëÿþùèé âåñü äîêóìåíò XML. Îí èìååò
èìÿ #document. Îò íåãî ïîðîæäàåòñÿ óçåë html, õðàíÿùèé êîðíåâîé ýëåìåíò XML-äîêóìåíòà (ýëåìåíò <html> äîêóìåíòà XHTML),
îò êîòîðîãî, â ñâîþ î÷åðåäü, ïðîèñõîäÿò óçëû head è body, õðàíÿùèå ñîîòâåòñòâåííî ýëåìåíòû <head> è <body> äîêóìåíòà XHTML,
âñå òèïà 1 (ELEMENT_NODE). Äëÿ áûñòðîãî äîñòóïà ê óçëó êîðíåâîãî ýëåìåíòà äîêóìåíòà XML â DOM ïðåäóñìîòðåíî ñâîéñòâî
documentElement îáúåêòà #document.
Ñîäåðæèìûì ýëåìåíòà XML ìîæåò áûòü íåðàçìå÷åííûé òåêñò
ëèáî îíî ìîæåò áûòü ñìåøàííûì íåðàçìå÷åííûé òåêñò âïåðåìåæêó ñ ýëåìåíòàìè XML, ðàçìå÷åííûìè òåãàìè íà÷àëà è êîíöà
ýëåìåíòà. Ëþáîå òåêñòîâîå ñîäåðæèìîå ýëåìåíòà XML õðàíèòñÿ â
ñïåöèàëüíîì òåêñòîâîì óçëå (òèï 3). Èìÿ ëþáîãî òåêñòîâîãî óçëà
âñåãäà #text. Ýòîò óçåë ÿâëÿåòñÿ ïîä÷èíåííûì (äî÷åðíèì) óçëîì
ýëåìåíòà, òåêñòîâîå ñîäåðæèìîå (èëè ÷àñòü òåêñòîâîãî ñîäåðæèìî42
Ðèñ. 2.1.1. Äåðåâî ïðîñòåéøåãî äîêóìåíòà XHTML.
ãî) êîòîðîãî îí õðàíèò. Äëÿ ýëåìåíòà XML, ñîäåðæèìûì êîòîðîãî
ÿâëÿåòñÿ òîëüêî òåêñò, áóäåò ñîçäàí òîëüêî îäèí òåêñòîâûé óçåë,
òîãäà êàê äëÿ ýëåìåíòà ñî ñìåøàííûì ñîäåðæèìûì òàêèõ óçëîâ
áóäåò ñòîëüêî, ñêîëüêî ðàç â åãî ñîäåðæèìîì âñòðå÷àþòñÿ òåêñòîâûå ¾îñòðîâêè¿ òåêñò ìåæäó ðàçìå÷åííûìè òåãàìè ýëåìåíòàìè.
Íàïðèìåð, ðàññìîòðèì ñëåäóþùèé ôðàãìåíò äîêóìåíòà XHTML:
<P>Ýòî <B>ñîäåðæèìîå</B> àáçàöà <I>äîêóìåíòà</I> HTML</P>
 îáúåêòíîé ìîäåëè DOM îí áóäåò ïðåäñòàâëåí â âèäå èåðàðõè÷åñêîãî äåðåâà, ïîêàçàííîãî íà ðèñ. 2.1.2.
Ðèñ. 2.1.2. Äåðåâî ôðàãìåíòà àáçàöà ñî ñìåøàííûì ñîäåðæèìûì.
43
Íà ðèñ. 2.1.2 òåêñòîâûå óçëû ïîêàçàíû âìåñòå ñ èõ ñîäåðæèìûì. Ñîäåðæèìîå òåêñòîâîãî óçëà (óçåë òèïà 3) ìîæåò áûòü ïîëó÷åíî ñ ïîìîùüþ åãî ñâîéñòâà nodeValue. Ïîäîáíîå æå ñâîéñòâî åñòü
è ó óçëà êîììåíòàðèÿ (óçåë òèïà 8).  òàáëèöå 2 ïðèâåäåíû çíà÷åíèÿ ñâîéñòâ nodeName (èìÿ óçëà) è nodeValue âñåõ äîïóñòèìûõ â
DOM óçëîâ.
Òàáëèöà 2. Ñâîéñòâà nodeName è nodeValue óçëîâ DOM.
Îáúåêò
Ýëåìåíò
Àòðèáóò
Òåêñòîâûé
Ñåêöèÿ
CDATA
Ññûëêà íà
ñóùíîñòü
Ñóùíîñòü
Èíñòðóêöèÿ
îáðàáîòêè
Êîììåíòàðèé
Äîêóìåíò
Òèï äîêóìåíòà
Ôðàãìåíò
äîêóìåíòà
Íîòàöèÿ
nodeName
Èìÿ ýëåìåíòà
Èìÿ àòðèáóòà
#text
#cdata-section
Èìÿ ññûëî÷íîé ñóùíîñòè
Èìÿ ñóùíîñòè
Íàçâàíèå èíñòðóêöèè
#comment
#document
Èìÿ òèïà äîêóìåíòà
#document-fragment
Èìÿ íîòàöèè
nodeValue
null
Çíà÷åíèå àòðèáóòà
Ñîäåðæèìîå òåêñòîâîãî óçëà
Ñîäåðæèìëå ñåêöèè CDATA
null
null
Ñîäåðæèìîå èíñòðóêöèè áåç
íàçâàíèÿ
Ñîäåðæèìîå êîììåíòàðèÿ
null
null
null
null
Ÿ2. Ïåðåìåùåíèå ïî îáúåêòíîé ìîäåëè
Êîíöåïöèÿ îáúåêòíîé ìîäåëè äîêóìåíòà ïîçâîëÿåò èçìåíèòü
óçåë èëè öåëóþ âåòâü ñòðóêòóðû, íå ðàçðóøàÿ åå. Äëÿ ýòèõ öåëåé â
îáúåêòíîé ìîäåëè DOM ïðåäóñìîòðåí ðÿä ñâîéñòâ è ìåòîäîâ îáúåêòíûõ óçëîâ äåðåâà äîêóìåíòà.
Íà ïðèìåðå ñòðóêòóðû, ñîçäàâàåìîé âëîæåííûìè ñïèñêàìè,
ïðîäåìîíñòðèðóåì, ñ ïîìîùüþ êàêèõ ñâîéñòâ îáúåêòîâ ìîæíî ïåðåìåùàòüñÿ ïî óçëàì èåðàðõè÷åñêîé ñòðóêòóðû äîêóìåíòà:
<ul id="parent">
<li id="Node1">Óçåë 1</li>
<li id="Node2">Óçåë 2
44
<ul id="inside">
<li id="Child1">Ïîòîìîê 1</li>
<li id="Child2">Ïîòîìîê 2</li>
<li id="Child3">Ïîòîìîê 3</li>
</ul>
</li>
<li id="Node3">Óçåë 3</li>
</ul>
 îáúåêòíîé ìîäåëè äîêóìåíòîâ ýòîò ôðàãìåíò áóäåò ïðåäñòàâëåí â âèäå äåðåâà ñ îòíîøåíèÿìè "ðîäñòâà", ïîêàçàííîãî íà
ðèñ. 2.2.1.
Ðèñ. 2.2.1. Äåðåâî äëÿ âëîæåííûõ ñïèñêîâ.
Ýëåìåíòû ñ èìåíàìè Node1, Node2 è Node3 ÿâëÿþòñÿ óçëàìèïîòîìêàìè ýëåìåíòà-ðîäèòåëÿ ñ èìåíåì parent. Ó êàæäîãî
óçëà îáúåêòíîé ìîäåëè äîêóìåíòà èìååòñÿ ñâîéñòâî-ñåìåéñòâî
45
childNodes, õðàíÿùåå ññûëêè íà âñå, íåïîñðåäñòâåííî ïîðîæäàåìûå èì óçëû (åãî ¾äåòåé¿). Åñëè ó óçëà ¾äåòåé¿ íåò, çíà÷åíèåì
ñâîéñòâà ÿâëÿåòñÿ null. Ñâîéñòâî childNodes îáúåêòà parent õðàíèò ññûëêè íà âñåõ ¾äåòåé¿ ýòîãî óçëà (Node1, Node2 è Node3). Äëÿ
ïîëó÷åíèÿ ññûëîê íà ïåðâîãî è ïîñëåäíåãî ¾ðåáåíêà¿ óçëà â îáúåêòíîé ìîäåëè ïðåäóñìîòðåíû ñîîòâåòñòâåííî ñâîéñòâà firstChild
è lastChild (åñëè ïîðîæäàåìûõ óçëîâ íåò, òî ñâîéñòâà âîçâðàùàþò
çíà÷åíèÿ null).
 ñâîþ î÷åðåäü êàæäûé óçåë îáúåêòíîé ìîäåëè äîêóìåíòà ïîðîæäàåòñÿ êàêèì-òî óçëîì. Ñâîéñòâî parentNode ëþáîãî óçëà âîçâðàùàåò ññûëêó íà ¾ðîäèòåëÿ¿ ýòîãî óçëà. Òàê, äëÿ óçëîâ Node1,
Node2 è Node3 çíà÷åíèåì óêàçàííîãî ñâîéñòâà áóäåò ññûëêà íà óçåë
parent.
Óçëû Node1, Node2 è Node3 ÿâëÿþòñÿ ðîäñòâåííèêàìè îäíîãî
ïîêîëåíèÿ (¾áðàòüÿìè¿) è îòêðûâàþòñÿ äðóã äðóãó ñ ïîìîùüþ ñâîèõ ñâîéñòâ previousSibling (ïðåäûäóùèé áëèæàéøèé ðîäñòâåííèê îäíîãî ïîêîëåíèÿ) è nextSibling (ñëåäóþùèé áëèæàéøèé ðîäñòâåííèê îäíîãî ïîêîëåíèÿ). Åñëè ó ýëåìåíòà-óçëà íåò ñîîòâåòñòâóþùèõ áëèæàéøèõ ðîäñòâåííèêîâ, òî ýòè ñâîéñòâà âîçâðàùàþò çíà÷åíèå null.
 òàáëèöå 3 ïðèâåäåíû âñå ñâîéñòâà óçëîâ îáúåêòíîé ìîäåëè
äîêóìåíòà äëÿ ïåðåìåùåíèÿ ïî èåðàðõè÷åñêîìó äåðåâó äîêóìåíòà.
Òàáëèöà 3. Ñâîéñòâà óçëîâ DOM äëÿ ïåðåìåùåíèÿ ïî äåðåâó.
Ñâîéñòâî
parentNode
firstChild
lastChild
previousSibling
nextSibling
childNodes
nodeName
nodeType
nodeValue
Âîçâðàùàåìîå çíà÷åíèå
Óçåë, ïîðîæäàþùèé äàííûé (åãî ðîäèòåëü)
Ïåðâûé äî÷åðíèé óçåë
Ïîñëåäíèé äî÷åðíèé óçåë
Ïðåäûäóùèé áëèæàéøèé óçåë îäíîãî óðîâíÿ
Ñëåäóþùèé áëèæàéøèé óçåë îäíîãî óðîâíÿ
Ñåìåéñòâî íåïîñðåäñòâåííî ïîðîæäåííûõ óçëîâ
Íàèìåíîâàíèå óçëà
Òèï óçëà
Çíà÷åíèå óçëà)
Äëÿ ïåðåìåùåíèÿ è ìàíèïóëèðîâàíèÿ óçëàìè îáúåêòíîé ìîäåëè DOM íåîáõîäèìî èìåòü ññûëêó íà êîðíåâîé ýëåìåíò #document.
Äëÿ îáúåêòíîé ìîäåëè äîêóìåíòà HTML îíà ñîçäàåòñÿ àâòîìàòè÷åñêè è õðàíèòñÿ â îáúåêòå window.document.
46
Äëÿ ïîñòðîåíèÿ îáúåêòíîé ìîäåëè äëÿ äîêóìåíòà XML åãî
ñëåäóåò çàãðóçèòü â ñöåíàðèé. Â Internet Explorer âåðñèè 5.0 è âûøå ñëåäóåò âîñïîëüçîâàòüñÿ ñïåöèàëüíûì îáúåêòîì ActiveXObject,
ÿâëÿþùèìñÿ ôàáðèêîé, ñîçäàþùåé ýêçåìïëÿðû çàðåãèñòðèðîâàííûõ â îïåðàöèîííîé ñèñòåìå Windows êîìïüþòåðà COM-îáúåêòîâ.
Ôèðìîé Ìèêðîñîôò áûë ðàçðàáîòàíà áèáëèîòåêà MSXML ïîääåðæêè
ðàáîòû ñ îáúåêòíîé ìîäåëüþ DOM. Äëÿ ñîçäàíèÿ êîðíåâîãî ýëåìåíòà #document â ñöåíàðèè JavaScript íà ñòðàíèöå HTML ñëåäóåò
âîñïîëüçîâàòüñÿ ñëåäóþùèì êîäîì:
xmlDoc = new ActiveXObject("MSXML2.XMLHTTP.5.0");
xmlDoc.onreadystatechange = checkState
function checkState(){
switch(xmlR.readyState){
case 1:
// Âûïîëíÿåòñÿ çàãðóçêà äàííûõ...
break;
case 2:
// Äàííûå çàãðóæåíû è îáðàáàòûâàþòñÿ àíàëèçàòîðîì XML...
break;
case 3:
// Îáúåêòíàÿ ìîäåëü äàííûõ ÷àñòè÷íî óæå äîñòóïíà...
break;
case 4:
// Äàííûå ïîëó÷åíû è ïîëíîñòüþ äîñòóïíû
// Ìîæíî íà÷àòü èõ îáðàáîòêó
break;
}
}
Ÿ3. Ñîçäàíèå/èçìåíåíèå ñòðóêòóðû îáúåêòíîé ìîäåëè
äîêóìåíòà
Âñå ñåìåéñòâà òèïà NodeList (óïîðÿäî÷åííûé ñïèñîê îáúåêòîâ, íàïðèìåð, ñåìåéñòâî childNodes) è NamedNodeMap
(íåóïîðÿäî÷åííûé ñïèñîê îáúåêòîâ, äîñòóï ê êîòîðûì îñóùåñòâëÿåòñÿ ïî ñòðîêîâîìó èíäåêñó, íàïðèìåð, ñåìåéñòâî attributes, õðà-
Çàìå÷àíèå 3.1.
47
íÿùåå ññûëêè íà àòðèáóòû ýëåìåíòà XML, ïðåäñòàâëåííîãî óçëîì â
îáúåêòíîé ìîäåëè äîêóìåíòà) â DOM àâòîìàòè÷åñêè ÿâëÿþòñÿ
æèâûìè. Ýòî îçíà÷àåò, ÷òî åñëè áûëà èçìåíåíà ñòðóêòóðà äîêóìåíòà, òî àâòîìàòè÷åñêè ïðîèçîéäåò èçìåíåíèå â ñîîòâåòñòâóþùèõ
ñåìåéñòâàõ. Òàêèì îáðàçîì, â ñëó÷àå íàëè÷èÿ â ñöåíàðèè ññûëêè
íà òàêîå ñåìåéñòâî, ýòà ññûëêà àâòîìàòè÷åñêè áóäåò ¾îòñëåæèâàòü¿
èçìåíåíèÿ â ññûëî÷íîì ñåìåéñòâå.
Êðîìå èçìåíåíèÿ ñîäåðæèìîãî òåêñòîâûõ óçëîâ äîêóìåíòà ñ
ïîìîùüþ ñâîéñòâà nodeValue, îáúåêòíàÿ ìîäåëü DOM ïðåäîñòàâëÿåò âîçìîæíîñòü óäàëèòü ëþáîé ñóùåñòâóþùèé óçåë, ñîçäàòü íîâûé óçåë, ñîîòâåòñòâóþùèé ëþáîìó äîïóñòèìîìó òèïó, à çàòåì
âñòðîèòü åãî â ñóùåñòâóþùóþ ìîäåëü äîêóìåíòà ëèáî êàê ñîâåðøåííî íîâûé óçåë, ëèáî çàìåíèâ èì óæå ñóùåñòâóþùèé.
Ñîçäàíèå íîâîãî óçëà ëþáîãî òèïà âûïîëíÿåòñÿ ìåòîäàìè îáúåêòà #document, êîòîðûå ïåðå÷èñëåíû â òàáëèöå 4.  ïîñëåäíåì
ñòîëáöå ïîêàçàí òèï âîçâðàùàåìîãî ìåòîäîì îáúåêòà ñ óêàçàíèåì
÷åðåç äâîåòî÷èå îò êàêîãî êëàññà îí íàñëåäóåòñÿ.
Òàáëèöà 4. Ìåòîäû îáúåêòà #document äëÿ ñîçäàíèÿ óçëîâ.
Ìåòîä
createComment()
createCDATA
Section()
createDocument
Fragment()
createElement()
createEntity
Reference()
createProcessing
Instruction()
createTextNode()
createAttribute()
Ïàðàìåòðû
Ñòðîêà ñ ñîäåðæèìûì
êîììåíòàðèÿ
Ñòðîêà ñ ñîäåðæèìûì
ñåêöèè CDATA
Íåò ïàðàìåòðîâ
Ñòðîêà ñ èìåíåì ýëåìåíòà
Ñòðîêà ñ èìåíåì ññûëî÷íîé ñóùíîñòè
Ïåðâûé ïàðàìåòð ñòðîêà
ñ èìåíåì èíñòðóêöèè îáðàáîòêè, âòîðîé ñòðîêà ñ äàííûìè èíñòðóêöèè
îáðàáîòêè
Ñòðîêà ñ ñîäåðæèìûì
òåêñòîâîãî óçëà
Ñòðîêà ñ èìåíåì àòðèáóòà
48
Âîçâðàùàåìîå
íèå
çíà÷å-
Îáúåêò
Comment:CharacterData
Îáúåêò
CDATASection:Text
Îáúåêò DocumentFragment:Node
Îáúåêò Element:Node
Îáúåêò
EntityReference:Node
Îáúåêò ProcessingInstruction:Node
Îáúåêò
Text:CharacterData
Îáúåêò Attr:Node
Ó ìåòîäà createDocumentFragment() ñîçäàíèÿ ôðàãìåíòà äîêóìåíòà ïàðàìåòðîâ íåò:
var newFragment = document.createDocumentFragment();
Â
ìåòîäû
createTextNode(),
createComment()
è
createCDATASection() ïåðåäàåòñÿ ñòðîêà ñ ñîäåðæèìûì ñîçäàâàåìûõ óçëîâ, äîñòóï ê êîòîðîìó ìîæíî âïîñëåäñòâèè ïîëó÷èòü
÷åðåç ñâîéñòâî nodeValue ñîîòâåòñòâóþùèõ óçëîâ:
var newTxtEl = xmlDoc.createTextNode('Ñîäåðæèìîå óçëà');
var newComm = document.createComment('Êîììåíòàðèé');
var newCDATASec = xml.createCDATASection("<script>" +
"var xmlDoc=new ActiveXObject('MSXML2.DOCDocument.5.0')" +
"</script>")
Äëÿ ñîçäàíèÿ îáúåêòà, ïðåäñòàâëÿþùåãî èíñòðóêöèþ îáðàáîòêè, â ìåòîä createProcessingInstruction() ñëåäóåò ïåðåäàòü äâà
ñòðîêîâûõ ïàðàìåòðà, îïðåäåëÿþùèõ èìÿ èíñòðóêöèè è åå ñîäåðæèìîå (àòðèáóòû ñ èõ çíà÷åíèÿìè):
var PI = xml.createProcessingInstruction("xml-styleheet",
"type='text/css' href='1.css'");
Ðåçóëüòàòîì âûïîëíåíèÿ ýòîãî ìåòîäà áóäå ñîçäàíèå èíñòðóêöèè îáðàáîòêè äëÿ ïîäêëþ÷åíèÿ ê äîêóìåíòó êàñêàäíîé òàáëèöû
ñòèëåé:
<?xml-styleheet type='text/css' href='1.css'?>
 ìåòîä createElement() ïåðåäàåòñÿ ñòðîêîâûé ïàðàìåòð ñ
íàçâàíèåì ñîçäàâàåìîãî ýëåìåíòà (èìÿ îòêðûâàþùåãî òåãà ýëåìåíòà). Ñîçäàòü â ñöåíàðèè, âñòðîåííîì â XHTML äîêóìåíò, ýëåìåíò
àáçàöà p ìîæíî ñëåäóþùèì îïåðàòîðîì:
var newParagraph = xmlDoc.createElement('p');
Ïðè ñîçäàíèè ýëåìåíòà, åñëè äëÿ íåãî îïðåäåëåíû â DTD èëè
XML-ñõåìå àòðèáóòû ñî çíà÷åíèÿìè ïî óìîë÷àíèþ, òî äëÿ íèõ ñîçäàþòñÿ îáúåêòû òèïà Attr è ïðèñîåäèíÿþòñÿ ê ýëåìåíòó.
Îñòàëüíûå àòðèáóòû ìîæíî ïðèñîåäèíèòü ê ýëåìåíòó äâóìÿ
ñïîñîáàìè. Â ïåðâîì ñëåäóåò èñïîëüçîâàòü ìåòîä setAttribute()
49
ýëåìåíòà ñ äâóìÿ ñòðîêîâûìè ïàðàìåòðàìè, ïðåäñòàâëÿþùèìè
èìÿ è çíà÷åíèå ïðèñîåäèíÿåìîãî àòðèáóòà. Ïî âòîðîìó ñïîñîáó
ïðåäëàãàåòñÿ âîñïîëüçîâàòüñÿ ìåòîäîì setAttributeNode() ýëåìåíòà, åäèíñòâåííûì ïàðàìåòðîì êîòîðîãî ÿâëÿåòñÿ îáúåêò òèïà
Attr. Ýòîò îáúåêò ñîçäàåòñÿ ìåòîäîì createAttribute() îáúåêòà
#document, â êîòîðûé ïåðåäàåòñÿ ñòðîêîâûé ïàðàìåòð, îïðåäåëÿþùèé èìÿ ñîçäàâàåìîãî àòðèáóòà. Äëÿ ñîçäàííîãî àòðèáóòà ñëåäóåò
óñòàíîâèòü åãî çíà÷åíèå ÷åðåç ñâîéñòâî nodeValue è ïðèñîåäèíèòü
ê ýëåìåíòó ìåòîäîì setAttributeNode() ñàìîãî ýëåìåíòà, ïåðåäàâ
îáúåêò-àòðèáóò â êà÷åñòâå ïàðàìåòðà.
Ñëåäóþùèé ôðàãìåíò êîäà ñîçäàñò ïóñòîé ýëåìåíò
<book author="Ñ. Õîëçíåð" title="XSLT"/>:
var el = xmlDoc.createElement("book");
//
var attrib = xmlDoc.createAttribute("author");
attrib.nodeValue = "Ñ. Õîëçíåð";
el.setAttributeNode(attrib);
//
el.setAttribute("title", "XSLT");
Êðîìå ìåòîäîâ setAttribute() ó ýëåìåíòà èìåþòñÿ åùå ìåòîäû äëÿ ïîëó÷åíèÿ çíà÷åíèÿ â âèäå ñòðîêè getAttribute() è óäàëåíèÿ removeAttribute() àòðèáóòà ïî åãî èìåíè. Ïðè ïîïûòêå ïîëó÷èòü çíà÷åíèå íåñóùåñòâóþùåãî àòðèáóòà âîçâðàùàåòñÿ ïóñòàÿ
ñòðîêà, ïðè ïîïûòêå óäàëåíèÿ àòðèáóòà, ó êîòîðîãî èìååòñÿ óìàë÷èâàåìîå çíà÷åíèå, òî àòðèáóò íå óäàëÿåòñÿ, íî äëÿ íåãî óñòàíàâëèâàåòñÿ çíà÷åíèå ïî óìîë÷àíèþ.
Òàêæå èìåþòñÿ ìåòîä getAttributeNode() äëÿ ïîëó÷åíèÿ
àòðèáóòà â âèäå îáúåêòà òèïà Attr, ïåðåäàâ â íåãî ñòðîêó ñ èìåíåì àòðèáóòà, è ìåòîä óäàëåíèÿ àòðèáóòà removeAttributeNode(),
ïàðàìåòðîì êîòîðîãî ñëóæèò ññûëêà íà îáúåêò òèïà Attr:
el.removeAttributeNode(el.getAttributeNode("title"));
el.removeAttribute("author");
Ïîñëå äèíàìè÷åñêîãî ñîçäàíèÿ ðàçëè÷íûõ ýëåìåíòîâ ðàçìåòêè XML-äîêóìåíòà îíè ñóùåñòâóþò òîëüêî â ïàìÿòè êîìïüþòåðà,
è íå ñâÿçàíû íèêîèì îáðàçîì íè ñ êàêèì XML-äîêóìåíòîì. Èõ
50
ñëåäóåò âñòðîèòü â ïðàâèëüíûõ ìåñòàõ â ñóùåñòâóþùèé èëè ôîðìèðóåìûé íîâûé äîêóìåíò XML. Äëÿ ýòèõ öåëåé äëÿ îáúåêòîâ,
ïðåäñòàâëÿþùèõ ýëåìåíòû ðàçìåòêè è ìîãóùèõ èìåòü ñîäåðæèìîå,
ðåàëèçîâàí ðÿä ìåòîäîâ äëÿ ìàíèïóëÿöèè ñâîèì ñîäåðæèìûì. Ýòè
ìåòîäû íàñëåäóþòñÿ îò èíòåðôåéñà Node, îò êîòîðîãî ïðîèñõîäÿò
âñå îáúåêòû ðàçìåòêè (ñì. òàáëèöó 5).
Òàáëèöà 5. Ìåòîäû óçëîâ äëÿ ìàíèïóëèðîâàíèÿ ñîäåðæèìûì.
Ìåòîä
appendChild()
insertBefore()
replaceChild()
removeChild()
cloneNode()
hasChildNodes()
Ïàðàìåòðû
Íîâûé äî÷åðíèé óçåë, äîáàâëÿåìûé ïîñëå ïîñëåäíåãî äî÷åðíåãî óçëà ýëåìåíòà.
Íîâûé äî÷åðíèé óçåë è
äî÷åðíèé óçåë, ïåðåä êîòîðûì áóäåò âñòàâëåí íîâûé. Åñëè âòîðîé ïàðàìåòð îòñóòñòâóåò, äîáàâëÿåòñÿ ïîñëå ïîñëåäíåãî
äî÷åðíåãî óçëà.
Íîâûé äî÷åðíèé óçåë è
ïîäëåæàùèé çàìåíå äî÷åðíèé óçåë.
Äî÷åðíèé óçåë, ïîäëåæàùèé óäàëåíèþ.
true êëîíèðîâàòü âìåñòå ñ äî÷åðíèìè óçëàìè,
false êëîíèðîâàòü áåç
äî÷åðíèõ óçëîâ.
Íåò ïàðàìåòðîâ.
Âîçâðàùàåìîå
íèå
çíà÷å-
Äîáàâëåííûé óçåë
Äîáàâëåííûé óçåë
Çàìåùåííûé óçåë
Óäàëåííûé óçåë
Íîâûé (êëîíèðîâàííûé)
óçåë
, åñëè èìåþòñÿ äî÷åðíèå óçëû, false â
ïðîòèâíîì ñëó÷àå
true
Ïåðå÷èñëåííûå â òàáëèöå 5 ìåòîäû íå ïðèìåíÿþòñÿ äëÿ îáúåêòîâ, ïðåäñòàâëÿþùèõ èíñòðóêöèè îáðàáîòêè, êîììåíòàðèè, òåêñòîâûå óçëû è ñåêöèè CDATA, òàê êàê ó íèõ íå ìîæåò áûòü ñîäåðæèìîãî.
Êðîìå ïåðå÷èñëåííûõ â òàáëèöå 5 ìåòîäîâ â èíòåðôåéñå Node
òàêæå ðåàëèçîâàíû âñå ñâîéñòâà ýëåìåíòîâ, ñâÿçàííûå ñ ïåðåìåùåíèåì ïî äåðåâó äîêóìåíòà XML (ñì. òàáëèöà 3), âñå êîíñòàíòû òèïîâ óçëîâ, à òàêæå ñâîéñòâî attributes, âîçâðàùàþùåå äëÿ
51
ýëåìåíòà XML ñåìåéñòâî îáúåêòîâ òèïà Node, ïðåäñòàâëÿþùèõ âñå
àòðèáóòû ýëåìåíòà, äëÿ îñòàëüíûõ ýëåìåíòîâ çíà÷åíèåì ýòîãî ñâîéñòâà ÿâëÿåòñÿ null
Ñëåäóþùèé ôðàãìåíò ñöåíàðèÿ â öèêëå ðàñïå÷àòàåò íàçâàíèÿ
âñåõ àòðèáóòîâ ýëåìåíòà XML è èõ çíà÷åíèÿ:
for(var i=0; i<el.attributes.length; i++){
var v = el.attributes[i];
alert(v.nodeName+" = "+v.nodeValue);
}
Ïðè ñîçäàíèè íîâûõ îáúåêòîâ è âñòðàèâàíèÿ èõ â ñóùåñòâóþùóþ ñòðóêòóðó äîêóìåíòà ñëåäóåò ôîðìèðîâàòü îáúåêòû ñ ïðàâèëüíîé ñòðóêòóðîé, ñîîòâåòñòâóþùåé èõ ïðåäñòàâëåíèÿì â îáúåêòíîé ìîäåëè äîêóìåíòà.
Ðàññìîòðèì íà ïðèìåðå òàáëèöû XHTML ïðîöåññ äèíàìè÷åñêîãî ñîçäàíèÿ ýëåìåíòà. Ëþáàÿ òàáëèöà îáúåêòíîé ìîäåëè äîêóìåíòà îáÿçàòåëüíî ñîñòîèò, ïî êðàéíåé ìåðå, èç äâóõ óçëîâ: table
è tbody, ÷òî ñïðàâåäëèâî è äëÿ òàáëèö HTML. Ïîýòîìó ïðè äèíàìè÷åñêîì ñîçäàíèè òàáëèö íå ñëåäóåò çàáûâàòü îá ýòîì îáñòîÿòåëüñòâå:
var Table=document.createElement('table');
var TBody=document.createElement('tbody');
var Row=document.createElement('tr');
var Cell1=document.createElement('td');
var Cell2=Cell1.cloneNode();
Table.appendChild(TBody);
Row.appendChild(Cell1);
Row.appendChild(Cell2);
TBody.appendChild(Row);
Cell1.appendChild(document.createTextNode('ß÷åéêà 1'));
Cell2.appendChild(document.createTextNode('ß÷åéêà 2'));
Òåïåðü îñòàåòñÿ òîëüêî äîáàâèòü ñîçäàííûé îáúåêò ê òåëó äîêóìåíòà XHTML è â áðàóçåð àâòîìàòè÷åñêè îòîáðàçèò âíîâü ñîçäàííóþ òàáëèöó. Îäíàêî â íåé íå áóäóò ïðîðèñîâàíû ëèíèè ðåøåòêè, îòäåëÿþùèå ñòðîêè è ñòîëáöû äðóã îò äðóãà. Åñëè ýòî íåîáõîäèìî, òî ñëåäóåò ê ýëåìåíòó Table äîáàâèòü àòðèáóò border ñî
çíà÷åíèåì áîëüøå ëèáî ðàâíûì 1.
52
 çàêëþ÷åíèå ïðèâåäåì ñöåíàðèé JavaScript äèíàìè÷åñêîãî
ñîçäàíèÿ äîêóìåíòà XML:
var xml = new ActiveXObject("MSXML2.DOMDocument.5.0");
PI = xml.createProcessingInstruction("xml",
"version=\"1.0\" encoding=\"windows-1251\"");
xml.appendChild(PI); root = xml.createElement("books");
el = xml.createElement("book");
attrib = xml.createAttribute("author");
attrib.nodeValue = "Ñ. Õîëçíåð";
el.setAttributeNode(attrib);
el.setAttribute("title", "XSLT");
txt = xml.createTextNode("ìîÿ ïåðâàÿ êíèãà ïî XSLT");
xml.appendChild(root);
root.appendChild(xml.createTextNode("\n"));
comment = xml.createComment("áèáëèîòåêà êíèã");
xml.insertBefore(comment, root);
root.appendChild(el);
el.appendChild(xml.createTextNode("\n"));
el.appendChild(txt);
el.appendChild(xml.createTextNode("\n"));
root.appendChild(xml.createTextNode("\n"));
PI = xml.createProcessingInstruction("xml-styleheet",
"type='text/css' href='1.css'");
xml.insertBefore(PI, comment);
cDT = xml.createCDATASection("<script>" + "\n" +
"var xmlDoc=new ActiveXObject('MSXML2.DOCDocument.5.0')" +
"\n" + "<//script>");
root.insertBefore(cDT, el);
root.insertBefore(xml.createTextNode("\n"), el);
Ðåçóëüòàòîì âûïîëíåíèÿ ýòîãî ñöåíàðèÿ áóäåò ñëåäóþùèé
XML-äîêóìåíò:
<?xml version="1.0"?>
<?xml-styleheet type='text/css' href='1.css'?>
<!--áèáëèîòåêà êíèã-->
<books> <![CDATA[<script>
var xmlDoc=new ActiveXObject('MSXML2.DOCDocument.5.0')
53
<//script>]]>
<book author="Ñ. Õîëçíåð" title="XSLT">
ìîÿ ïåðâàÿ êíèãà ïî XSLT
</book>
</books>
Îáðàùàåì âíèìàíèå ÷èòàòåëÿ íà òî, ÷òî äëÿ òîãî, ÷òîáû äîêóìåíò XML îòîáðàæàëñÿ â âèäå äðåâîâèäíîé ñòðóêòóðû, ñëåäóåò
â íóæíûõ ìåñòàõ âñòàâëÿòü òàê íàçûâàåìûå ïðîáåëüíûå òåêñòîâûå
óçëû (ñîäåðæàò òîëüêî ïðîáåëû, ñèìâîëû òàáóëÿöèè è ïåðåõîäà íà
íîâóþ ñòðîêó), êîòîðûå íå âõîäÿò â ñîäåðæèìîå XML-äîêóìåíòà,
íî âàæíû ïðè ïðåîáðàçîâàíèè åãî â òåêñòîâûé âèä, ó÷àñòâóÿ â ôîðìèðîâàíèè äðåâîâèäíîé ñòðóêòóðû.
54
ÃËÀÂÀ 3.
XSL-ÑÏÅÖÈÔÈÊÀÖÈÈ
Ïîä XSL ïîíèìàåòñÿ ñåìåéñòâî ðåêîìåíäàöèé äëÿ ïðåîáðàçîâàíèÿ è ïðåäñòàâëåíèÿ XML-äîêóìåíòà. Ýòî ñåìåéñòâî ñîñòîèò èç
òðåõ ÷àñòåé:
1. XSL Transformations (XSLT) ÿçûê ïðåîáðàçîâàíèÿ XMLäîêóìåíòà. Â íàñòîÿùåå âðåìÿ èñïîëüçóåòñÿ âåðñèÿ 1.0
2. XML Path Language (XPath) ÿçûê âûðàæåíèé, èñïîëüçóåìûõ XSLT äëÿ äîñòóïà èëè ññûëêè íà ÷àñòè XML-äîêóìåíòà.
(XPath òàêæå èñïîëüçóåòñÿ ñïåöèôèêàöèåé XML Linking.) Â
íàñòîÿùåå âðåìÿ èñïîëüçóåòñÿ âåðñèÿ 1.0
3. XSL Formatting Objects (XSL-FO) XML-ñëîâàðü çàäàíèÿ
ñåìàíòèêè ôîðìàòèðîâàíèÿ ýëåìåíòîâ XML äëÿ îòîáðàæåíèÿ
íà ðàçëè÷íûõ óñòðîéñòâàõ.
 íàñòîÿùåì ïîñîáèè ìû ðàññìîòðèì ïåðâûå äâå ñîñòàâëÿþùèå ñåìåéñòâà ñïåöèôèêàöèé XSL.
Ÿ1. Ïðèìåíåíèå XSL-ïðåîáðàçîâàíèÿ ê XML-äîêóìåíòó
Äëÿ ïðèìåíåíèÿ XSL-ïðåîáðàçîâàíèÿ ê XML-äîêóìåíòó ìîæíî âîñïîëüçîâàòüñÿ ïðîöåññîðàìè XSLT, ðàçðàáàòûâàåìûìè ðàçíûìè ôèðìàìè.
Êîìïàíèÿ Microsoft ðàçðàáîòàëà ñèíòàêñè÷åñêèé àíàëèçàòîð
XML, ôóíêöèÿìè êîòîðîãî ÿâëÿþòñÿ íå òîëüêî ñèíòàêñè÷åñêèé
ðàçáîð XML-äîêóìåíòà è ïðîâåðêà åãî äåéñòâèòåëüíîñòè â ñëó÷àå íàëè÷èÿ DTD èëè XML-ñõåìû äîêóìåíòà, íî è ïðåîáðàçîâàíèå XML-äîêóìåíòà â ñîîòâåòñòâèè ñ ïðèñîåäèíåííûì ê íåìó ôàéëîì XSLT. Ðåàëèçàöèÿ âûïîëíåíà â âèäå îáúåêòíîé áèáëèîòåêè
msxml.dll, êîòîðóþ ìîæíî ïîäêëþ÷èòü è èñïîëüçîâàòü â ñîáñòâåííûõ ðàçðàáîòêàõ. Íà ñåãîäíÿøíèé ìîìåíò ïîñëåäíåé âåðñèåé ÿâëÿåòñÿ 6.0. Êîìïàíèÿ Microsoft ðàñïðîñòðàíÿåò çàãðóçî÷íûé ìîäóëü
msxsl.exe äëÿ ïðèìåíåíèÿ ê XML-äîêóìåíòó ïðåîáðàçîâàíèé XSLT,
âûçîâ êîòîðîãî âûïîëíÿåòñÿ â ñîîòâåòñòâèè ñ ïðèâîäèìûì íèæå
ñèíòàêñèñîì êîìàíäíîé ñòðîêè:
msxsl.exe xml-ôàéë xsl-ôàéë -o ôàéë-ðåçóëüòàòà
55
Àäðåñà ñàéòîâ äðóãèõ ïðîèçâîäèòåëåé ïðîãðàììíîãî îáåñïå÷åíèÿ äëÿ ðàáîòû ñ XML è XSLT ïåðå÷èñëåíû íèæå:
• Saxon (Michael Kay) http://users.iclway.co.uk/mhkay/saxon/
• Oracle XSLT http://technet.oracle.com/tech/xml/
• Xalan
(Apache
j/index.html
Project)
http://xml.apache.orj/xalan-
Äëÿ ïðèìåíåíèÿ XSL-ïðåîáðàçîâàíèÿ ê äîêóìåíòó XML ìîæíî èñïîëüçîâàòü ñîâðåìåííûå áðàóçåðû, ïîääåðæèâàþùèå óêàçàííûå ïðåîáðàçîâàíèÿ: Microsoft Internet Explorer, Opera è áðàóçåðû
íà áàçå äâèæêà ¾Mozilla¿ FireFox è Navigator. Äëÿ ýòîãî íåîáõîäèìî â äîêóìåíò XML âêëþ÷èòü èíñòðóêöèþ îáðàáîòêè, ïðèñîåäèíÿþùóþ ê äîêóìåíòó ôàéë XSLT, à çàòåì âñå ïðîïèñàííûå â
ôàéëå XSLT ïðåîáðàçîâàíèÿ áóäóò âûïîëíåíû ïðè çàãðóçêå XMLäîêóìåíòà â áðàóçåð.
Äëÿ âñåõ áðàóçåðîâ, êðîìå MS Internet Explorer, èíñòðóêöèÿ
îáðàáîòêè äîëæíà çàäàâàòüñÿ â ñîîòâåòñòâèè ñ ðåêîìåíäàöèÿìè
WWW-êîíñîðöèóìà ñ óàçàíèåì MIME-òèïà ïðèñîåäèíÿåìîãî ôàéëà XSLT â âèäå text/xml:
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
Äëÿ Microsoft Internet Explorer ýòà æå èíñòðóêöèÿ áóäåò ðàáîòàòü, òîëüêî åñëè óêàçàòü MIME-òèï ïðèñîåäèíÿåìîãî ôàéëà XSLT
â âèäå text/xsl:
<?xml-stylesheet type="text/xsl" href="planets.xsl"?>
Ÿ2. XSLT-ïðåîáðàçîâàíèÿ â MS IE 6.0 è âûøå
Ñîçäàäèì äîêóìåíò XML, õðàíÿùèé èíôîðìàöèþ î òðåõ ïëàíåòàõ Ñîëíå÷íîé ñèñòåìû:
<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheettype="text/xsl" href="planets.xsl"?>
<PLANETS>
<PLANET>
56
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>e
<DISTANCE UNITS="million miles">43.4</DISTANCE>
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS UNITS="(Earth = 1)">.815</MASS>
<DAY UNITS="days">116.75</DAY>
<RADIUS UNITS="miles">3716</RADIUS>
<DENSITY UNITS="(Earth = 1)">.943</DENSITY>
<DISTANCE UNITS="million miles">66.8</DISTANCE>
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<MASS UNITS="(Earth = 1)">1</MASS>
<DAY UNITS="days">1</DAY>
<RADIUS UNITS="miles">2107</RADIUS>
<DENSITY UNITS="(Earth = 1)">1</DENSITY>
<DISTANCE UNITS="million miles">128.4</DISTANCE>
</PLANET>
</PLANETS>
Ïðèñîåäèíåííûé ê äîêóìåíòó ôàéë planets.xsl ïðåîáðàçîâàíèé XSLT èìååò ñëåäóþùèé âèä:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>Ïëàíåòû Ñîëíå÷íîé ñèñòåìû</TITLE>
</HEAD>
<BODY>
<H1>The Planets Table</H1>
<TABLE BORDER="2">
57
<TR>
<TH>Íàçâàíèå</TH>
<TH>Ìàññà</TH>
<TH>Ðàäèóñ</TH>
<TH>Ñóòêè</TH>
</TR>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:value-of select="MASS"/></TD>
<TD><xsl:value-of select="RADIUS"/></TD>
<TD><xsl:value-of select="DAY"/></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
Ôàéë XSLT-ïðåîáðàçîâàíèé ÿâëÿåòñÿ äîêóìåíòîì XML, çàäàþùèì øàáëîíû äëÿ îòîáðàæåíèÿ ýëåìåíòîâ XML. Äëÿ ýòèõ öåëåé
èñïîëüçóåòñÿ ýëåìåíò <xsl:template>, àòðèáóò êîòîðîãî match çàäàåòñÿ ðàâíûì îáðàçöó âûáîðà (÷àñòíûé ñëó÷àé âûðàæåíèÿ XPath:
îáðàçåö âûáîðà ÿâëÿåòñÿ âûðàæåíèåì XPath, îäíàêî íå âñÿêîå âûðàæåíèå XPath ÿâëÿåòñÿ îáðàçöîì âûáîðà), îïðåäåëÿþùåå ýëåìåíò
XML-äîêóìåíòà, ê êîòîðîìó áóäåò ïðèìåíÿòüñÿ øàáëîí.
Îáðàçåö âûáîðà "/PLANETS" ïåðâîãî øàáëîíà ñîîòâåòñòâóåò êîðíåâîìó ýëåìåíòó <PLANETS> äîêóìåíòà è çàäàåò HTMLäîêóìåíò, â òåëå êîòîðîãî îòîáðàæàåòñÿ çàãîëîâîê ïåðâîãî óðîâíÿ è òàáëèöà ñ ïåðâîé çàãîëîâî÷íîé ñòðîêîé, ïîñëå êîòîðîé ñòîèò
XSLT-ýëåìåíò <xsl:apply-templates/>. Îí óêàçûâàåò ïðîöåññîðó
XSLT ïðèìåíÿòü øàáëîíû äëÿ âñåõ äåòåé ýëåìåíòà <PLANETS>.
Âòîðîé øàáëîí çàäàåò ïðàâèëà îòîáðàæåíèÿ ýëåìåíòîâ
<PLANET> â âèäå ñòðîêè òàáëèöû, çíà÷åíèÿìè ÿ÷ååê êîòîðîé ÿâëÿþòñÿ ñîîòâåòñòâåííî ñîäåðæèìîå ýëåìåíòîâ <NAME>, <MASS>,
<RADIUS> è <DAY> (ýëåìåíò <xsl:value-of>). Òàê êàê íèãäå â øàá58
ëîíå íå çàäàí ýëåìåíò <xsl:apply-templates/> äëÿ óêàçàíèÿ ïðîäîëæåíèÿ ïðèìåíåíèÿ øàáëîíîâ äëÿ äåòåé ýëåìåíòà <PLANET>, òî
íà ýòîì îáðàáîòêà XML-äîêóìåíòà çàâåðøèòñÿ.
Ðåçóëüòàò ïðåîáðàçîâàíèÿ â äâóõ áðàóçåðàõ ïîêàçàí íà
ðèñ. 3.2.1 è 3.2.2.
Ðèñ. 3.2.1. MS Internet Explorer
Ðèñ. 3.2.2. Mozilla Firefox
Ÿ3. Äåðåâüÿ è óçëû
Ïðîöåññîð XSLT òðàêòóåò XML-äîêóìåíò â âèäå äåðåâà, óçëû
êîòîðîãî ïðåäñòàâëÿþò êîìïîíåíòû XML-äîêóìåíòà:
• Êîðíåâîé óçåë (ïðåäñòàâëÿåò âåñü äîêóìåíò, íå ïóòàòü ñ
êîðíåâûì ýëåìåíòîì, êîòîðûé òàêæå íàçûâàåòñÿ ýëåìåíòîì
äîêóìåíòà)
• Óçåë àòðèáóòà. Ñîäåðæèò çíà÷åíèå àòðèáóòà ïîñëå òîãî, êàê
áûëè ðàñêðûòû ññûëêè íà ñóùíîñòè è îòáðîøåíû îêðóæàþùèå ñèìâîëû-ðàçäåëèòåëè. Àòðèáóò ýëåìåíòà ðàññìàòðèâàåòñÿ êàê åãî äî÷åðíèé ýëåìåíò (îòëè÷èå îò XMLDOM)
• Óçåë êîììåíòàðèÿ. Ñîäåðæèò òåêñò êîììåíòàðèÿ, íå ñîäåðæàùèé ñèìâîëîâ <!-- è -->
• Óçåë ýëåìåíòà. Ñîñòîèò èç ÷àñòè äîêóìåíòà, çàêëþ÷åííîé
â îòêðûâàþùèé è ñîîòâåòñòâóþùèé åìó çàâåðøàþùèé òåãè,
èëè åäèíñòâåííûé ïóñòîé ýëåìåíò-òåã, íàïðèìåð <br/>
59
• Óçåë ïðîñòðàíñòâà èìåí. Ïðåäñòàâëÿåò îáúÿâëåíèå ïðîñòðàíñòâà èìåí, äîáàâëÿåòñÿ ê êàæäîìó ýëåìåíòó, ê êîòîðîìó
ïðèìåíÿåòñÿ ýòî ïðîñòðàíñòâî èìåí
• Óçåë èíñòðóêöèè îáðàáîòêè. Ñîäåðæèò òåêñò èíñòðóêöèè
ïî îáðàáîòêå, íå ñîäåðæàùèé ñèìâîëîâ <? è ?>.
• Òåêñòîâûé óçåë. Òåêñòîâûå óçëû ñîäåðæàò ïîñëåäîâàòåëüíîñòè ñèìâîëîâ, òî åñòü òåêñò PCDATA. Òåêñòîâûå óçëû
ïî óìîë÷àíèþ â XSLT ïîäâåðãàþòñÿ íîðìàëèçàöèè, òî åñòü
ñìåæíûå òåêñòîâûå óçëû îáúåäèíÿþòñÿ.
Ðàññìîòðèì, íàïðèìåð, ñëåäóþùèé ïðîñòîé XML-äîêóìåíò:
<?xml version="1.0"?>
<library>
<book>
<title>
Earthquakes for Lunch
</title>
<title>
Volcanoes for Dinner
</title>
</book>
</library>}
Äåðåâî, ïîñòðîåííîå ïðîöåññîðîì XSLT, áóäåò âûãëÿäåòü òàê,
êàê ïîêàçàíî íà ðèñ. 3.3.1.
Ðèñ. 3.3.1. Äåðåâî äîêóìåíòà XML â ïðîöåññîðå XSLT.
60
Îäíàêî äåðåâî ðèñ. 3.3.1 ñîîòâåòñòâóåò íàøåìó äîêóìåíòó
XML òîëüêî ïðè óñëîâèè, ÷òî îí ñóùåñòâóåò áåç âûäåëåíèÿ åãî
ñòðóêòóðû ñ ïîìîùüþ îòñòóïîâ è ïåðåõîäîâ íà íîâûå ñòðîêè,
ò.å. êàê ïðîñòîé ïîòîê ñèìâîëîâ ðàçìåòêè è ñîäåðæèìîãî. Îäíàêî íàø äîêóìåíò XML íà ñàìîì äåëå èìååò âèä, ïðåäñòàâëåííûé
íà ðèñ. 3.3.2, ãäå ñèìâîë ¾ · ¿ ïðåäñòàâëÿåò ïðîáåë, à ñèìâîë ¾ ¶ ¿
èñïîëüçóåòñÿ äëÿ îáîçíà÷åíèÿ ïåðåõîäà íà íîâóþ ñòðîêó.
Ðèñ. 3.3.2. Äîêóìåíò XML ñ ïðîáåëüíûìè ñèìâîëàìè äëÿ
âûäåëåíèÿ ñòðóêòóðû.
Òåïåðü äåðåâî áóäåò âûãëÿäåòü êàê íà ðèñ. 3.3.3. Êàæäûé
òåêñòîâûé ïðîáåëüíûé óçåë (text:whitespace) ñîäåðæèò ïðîáåëû,
ñèìâîëû òàáóëÿöèè è ïåðåõîäà íà íîâûå ñòðîêè.
Ðèñ. 3.3.3. Äåðåâî äîêóìåíòà XML ñ ïðîáåëüíûìè óçëàìè.
61
Åñëè ó êàêîãî-ëèáî ýëåìåíòà XML èìååòñÿ àòðèáóò (ñì.
ðèñ. 3.3.4), òî ýòîò àòðèáóò ïðåäñòàâëÿåòñÿ óçëîì, ïîðîæäåííûì
óçëîì, ñîîòâåòñòâóþùèì ýëåìåíòó XML (ñì. ðèñ. 3.4.1).
Ðèñ. 3.3.4. Äîêóìåíò XML ñ ýëåìåíòîì, èìåþùèì àòðèáóò.
Óçëû XSLT-ìîäåëè äîêóìåíòà èìåþò ñëåäóþùèå ñâîéñòâà:
• Èìÿ. Èìÿ óçëà;
• Ñòðîêà-çíà÷åíèå. Òåêñò óçëà;
• Áàçîâûé URI. Áàçîâûé URI óçëà (XML-âàðèàíò URL);
• Äåòè. Ñïèñîê äî÷åðíèõ óçëîâ; íîëü, åñëè äåòåé íåò;
• Ðîäèòåëü. Óçåë-ðîäèòåëü äàííîãî óçëà;
• Èìååò àòðèáóò. Îïðåäåëÿåò àòðèáóòû óçëà ýëåìåíòà, åñëè
òàêîâûå èìåþòñÿ;
• Èìååò ïðîñòðàíñòâî èìåí. Îïðåäåëÿåò óçëû ïðîñòðàíñòâà
èìåí óçëà-ýëåìåíòà.
Ÿ4. Ýëåìåíòû XSLT
Ýëåìåíòû XSLT ïîääåðæèâàþò áîëüøîå ÷èñëî àòðèáóòîâ, è
W3C âûðàáîòàë ðÿä ôîðìàëüíûõ îïðåäåëåíèé òèïîâ äàííûõ, êîòîðûå ìîæíî ïðèñâàèâàòü ýòèì àòðèáóòàì:
62
Ðèñ. 3.4.1. Äåðåâî äîêóìåíòà XML ñ ýëåìåíòîì, èìåþùèì àòðèáóò.
• NCNameChar Áóêâà, öèôðà, òî÷êà, äåôèñ èëè ñèìâîë ïîä÷åðêèâàíèÿ;
• NCName Áóêâà èëè ñèìâîë ïîä÷åðêèâàíèÿ, çà êîòîðûì
(íåîáÿçàòåëüíî) ñëåäóþò äàííûå òèïà NCNameChar. Òî åñòü ýòî
èìÿ XML, íå ñîäåðæàùåå äâîåòî÷èé;
• QName Ïîëíîñòüþ îïðåäåëåííîå (qualied) èìÿ. Îíî ôîðìèðóåòñÿ èç ïðåôèêñà (êîòîðûé äîëæåí ïðèíàäëåæàòü ê òèïó NCName), çà êîòîðûì ñëåäóåò äâîåòî÷èå è ëîêàëüíàÿ ÷àñòü
(êîòîðàÿ òàêæå äîëæíà áûòü òèïà NCName);
• NameTest Èìÿ (íàïðèìåð, book) èëè îáîáùåííîå èìÿ ñ
ñèìâîëàìè ïîäñòàíîâêè (êàê, íàïðèìåð, book* èëè *).
Îáúÿâëåíèå xml
Îáúÿâëåíèå xml çàäàåòñÿ, êàê è â ëþáîì XML-äîêóìåíòå ñàìûì ïåðâûì. Íåîáÿçàòåëüíûé àòðèáóò encoding îïðåäåëÿåò êîäèðîâêó äîêóìåíòà (ïî óìîë÷àíèþ UTF-8):
<?xml version="1.0"? encoding="windows-1251">
Êîðíåâîé ýëåìåíò XSLT-äîêóìåíòà
63
Êîðíåâîé ýëåìåíò äîêóìåíòà XSLT èìååò ñëåäóþùèé âèä ñ
îáÿçàòåëüíûì çàäàíèåì ïðîñòðàíñòâà èìåí (õîòÿ ïðåôèêñ ìîæåò
áûòü ëþáûì, íî ïðèíÿò èìåííî xsl):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
. . .
</xsl:stylesheet>
Åãî íåîáÿçàòåëüíûé àòðèáóò id ìîæåò èñïîëüçîâàòüñÿ äëÿ
èäåíòèôèêàöèè òàáëèöû ñòèëåé, óñòàíàâëèâàåòñÿ ðàâíûì çíà÷åíèþ, ñîîòâåòñòâóþùåìó èìåíè XML.
Êîðíåâîé ýëåìåíò XSLT-äîêóìåíòà ìîæåò ñîäåðæàòü ýëåìåíòû âûñîêîãî óðîâíÿ òàáëèöû ñòèëåé:
• <xsl:attribute-set>
• <xsl:decimal-format>
• <xsl:import>
• <xsl:include>
• <xsl:key>
• <xsl:namespace-alias>
• <xsl:output>
• <xsl:param>
• <xsl:preserve-space>
• <xsl:strip-space>
• <xsl:template>
• <xsl:variable>
Ÿ5. Øàáëîí ïðåîáðàçîâàíèÿ
Ýëåìåíò <xsl:template> (åãî íàçûâàþò øàáëîí ) èñïîëüçóåòñÿ
äëÿ âûáîðà îäíîãî óçëà (êîòîðûé ìîæåò ñîäåðæàòü äðóãèå óçëû)
64
èëè ðÿäà óçëîâ â èñõîäíîì äîêóìåíòå, è çàäàíèÿ ñïîñîáà åãî(èõ)
ïðåîáðàçîâàíèÿ. Åãî òåëî ñîäåðæèò ïðàâèëà ïðåîáðàçîâàíèÿ, íàçûâàåìûå ïðàâèëàìè øàáëîíà. Èìååò ðÿä àòðèáóòîâ:
• match (îáÿçàòåëüíûé, åñëè òîëüêî íå çàäàí àòðèáóò name). Çàäàåò øàáëîí âûáîðà (îáðàçåö âûáîðà XPath) îáðàáàòûâàåìûõ
óçëîâ.
• name (íåîáÿçàòåëüíûé). Çàäàåò èìÿ øàáëîíà òèïà QName.
 äàëüíåéøåì ìîæåò áûòü âûçâàí ñ ïîìîùüþ ýëåìåíòà
<xsl:call-template>.
• priority (íåîáÿçàòåëüíûé). Ïîëîæèòåëüíîå èëè îòðèöàòåëüíîå öåëîå èëè äåéñòâèòåëüíîå ÷èñëî, çàäàþùåå ïðèîðèòåò
øàáëîíà. Èñïîëüçóåòñÿ, êîãäà îäèí è òîò æå óçåë óäîâëåòâîðÿåò íåñêîëüêèì øàáëîíàì.
• mode (íåîáÿçàòåëüíûé). Åñëè â òåëå øàáëîíà èñïîëüçóþòñÿ
èíñòðóêöèè <xsl:apply-templates>, òî áóäóò ïðèìåíÿòüñÿ
òîëüêî òå, ó êîòîðûõ àòðèáóò mode èìååò çíà÷åíèå, ñîâïàäàþùåå ñî çíà÷åíèåì ýòîãî àòðèáóòà â øàáëîíå. Ïðèíèìàåò
çíà÷åíèå òèïà QName.
 ñâÿçè ñ òåì, ÷òî êàæäûé ýëåìåíò <xsl:template> îïðåäåëÿåò ïðàâèëà ïðåîáðàçîâàíèÿ ýëåìåíòà, åãî ñàìîãî èíîãäà íàçûâàþò
ïðàâèëîì (rule).
 îáùåì ñëó÷àå øàáëîí ìîæåò ñîäåðæàòü íîëü èëè áîëåå ýëåìåíòîâ <xsl:param>, çà êîòîðûìè ñëåäóåò åãî òåëî, îïðåäåëÿþùåå
ñïîñîá îñóùåñòâëåíèÿ ïðåîáðàçîâàíèÿ.
Òåëî øàáëîíà
Òåëî øàáëîíà ìîæåò ñîäåðæàòü:
• ðàçîáðàííûå ñèìâîëüíûå äàííûå (PCDATA)
• èíñòðóêöèè XSLT
<xsl:apply-imports>
<xsl:apply-templates>
<xsl:attribute>
65
<xsl:call-template>
<xsl:choose>
<xsl:comment>
<xsl:copy>
<xsl:copy-of>
<xsl:element>
<xsl:fallback>
<xsl:for-each>
<xsl:if>
<xsl:message>
<xsl:number>
<xsl:processing-instruction>
<xsl:text>
<xsl:value-of>
<xsl:variable>
• ýëåìåíòîâ ðàñøèðåíèÿ (îïðåäåëÿþòñÿ ïîëüçîâàòåëåì)
• ýëåìåíòîâ áóêâàëüíîãî ðåçóëüòàòà, íå ÿâëÿþùèõñÿ èíñòðóêöèÿìè XSLT èëè ýëåìåíòàìè ðàñøèðåíèÿ, êîòîðûå êîïèðóþòñÿ â ðåçóëüòèðóþùåå âûõîäíîå äåðåâî, ñîçäàâàåìîå ïðîöåññîðîì XSLT, è èõ ñîäåðæèìîå òðàêòóåòñÿ êàê åùå îäíî òåëî
øàáëîíà è ðàçáèðàåòñÿ ïðîöåññîðîì XSLT:
<xsl:template match="RADIUS">
<TD>
RADIUS: <xsl:value-of select=".">
</TD>
</xsl:template>
Ïðîñòîå è ðåêóðñèâíîå ïðåîáðàçîâàíèå óçëà
Ïðîñòîå ïðåîáðàçîâàíèå óçëà ïðèìåíÿåòñÿ íåïîñðåäñòâåííî ê
óçëó, íå çàòðàãèâàÿ ïîðîæäàåìûõ èì ýëåìåíòîâ (åãî äåòåé). Íàïðèìåð, ïðîñòîå ïðåîáðàçîâàíèå êîðíåâîãî óçëà (îáðàçåö âûáîðà ¾/¿)
â ñîîòâåòñòâèè ñ ïðèâîäèìûì íèæå øàáëîíîì
66
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Ïðîñòåéøåå ïðåîáðàçîâàíèå XSLT</TITLE>
</HEAD>
<BODY>
Ýòî ïðåîáðàçîâàíèå çàìåíèò âåñü äîêóìåíò
íà òåêñò â ýëåìåíòå BODY.
</BODY>
</HTML>
</xsl:template>
ïðèâåäåò ê çàìåíå âñåãî äîêóìåíòà XML íà çàäàííûé â øàáëîíå äîêóìåíò HTML, êîòîðûé è îòîáðàçèòñÿ â îêíå áðàóçåðà, åñëè èìåííî
â íåì áóäåò âûïîëíÿòüñÿ ïðåîáðàçîâàíèå XSLT.
Èíñòðóêöèÿ <xsl:apply-templates> â òåëå øàáëîíà çàäà¼ò ðåêóðñèâíóþ îáðàáîòêó ñîäåðæàùèõñÿ â ýëåìåíòå (àòðèáóò
match) âñåõ èëè òîëüêî îïðåäåëåííûõ â íåîáÿçàòåëüíîì àòðèáóòå select ýòîé èíñòðóêöèè äî÷åðíèõ ýëåìåíòîâ.  ýòîì àòðèáóòå
ïîçâîëèòåëüíî çàäàâàòü ïîëíûå âûðàæåíèÿ XPath, à íå òîëüêî îáðàçöû âûáîðà, êàê â ñàìîì øàáëîíå! Îáðàáîòêà âûïîëíÿåòñÿ ëèáî
â ñîîòâåòñòâèè ñ çàäàííûì â ôàéëå äëÿ äî÷åðíåãî ýëåìåíòà øàáëîíîì, à åñëè îí íå îïðåäåëåí, òî â ñîîòâåòñòâèè ñ øàáëîíîì ïî
óìîë÷àíèþ (ñì. 76).
Âòîðîé (íåîáÿçàòåëüíûé) àòðèáóò mode ýòîé èíñòðóêöèè ñâÿçàí ñ àíàëîãè÷íûì àòðèáóòîì øàáëîíà ýòà èíñòðóêöèÿ ïðèìåíÿåòñÿ, òîëüêî åñëè çíà÷åíèå ýòîãî àòðèáóòà ñîâïàäàåò ñî çíà÷åíèåì
àíàëîãè÷íîãî àòðèáóòà øàáëîíà.
Òåëî èíñòðóêöèè <xsl:apply-templates> ìîæåò ñîäåðæàòü
íîëü èëè áîëåå ýëåìåíòîâ <xsl:sort> (êîòîðûå ñîðòèðóþò âñå äî÷åðíèå óçëû èëè íàáîð óçëîâ, îïðåäåëåííûõ âûðàæåíèåì XPath â
àòðèáóòå select èíñòðóêöèè) èëè <xsl:with-param> (êîòîðûå çàäàþò çíà÷åíèÿ ïàðàìåòðîâ, îïðåäåëåííûõ â øàáëîíå).
Ñëåäóþùèé äîêóìåíò XSL ïðåîáðàçóåò äîêóìåíò XML ñ îïèñàíèåì ïëàíåò â HTML-äîêóìåíò, ñîäåðæàùèé ñòîëüêî àáçàöåâ ñ
òåêñòîì ¾Ïëàíåòà¿, ñêîëüêî ýëåìåíòîâ PLANET áóäåò â äîêóìåíòå:
<xsl:template match="/">
<html>
67
<head<</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="PLANETS">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="PLANET">
<p>
Ïëàíåòà
</p>
</xsl:template>}
Ïîëó÷èòü äîñòóï ê çíà÷åíèþ óçëà ìîæíî ïðè ïîìîùè ýëåìåíòà <xsl:value-of> ñ àòðèáóòàìè:
• select (îáÿçàòåëüíûé) Âûðàæåíèå XPath, çàäàþùåå ýëåìåíò
â äîêóìåíòå, ÷üå çíà÷åíèå ñëåäóåò ïîëó÷èòü;
• disable-output-escaping (íåîáÿçàòåëüíûé) Îïðåäåëÿåò ðåæèì çàìåíû ñèìâîëîâ ðàçìåòêè ¾>¿, ¾<¿, ¾"¿, ¾'¿ è ¾&¿
íà ñèìâîëüíûå ññûëêè ¾>¿, ¾<¿, ¾"¿, ¾'¿
è ¾&¿. Çíà÷åíèå ýòîãî àòðèáóòà yes íå çàìåíÿåò ñèìâîëû
ðàçìåòêè íà ñèìâîëüíûå ññûëêè, à çíà÷åíèå no çàìåíÿåò.
Çíà÷åíèåì óçëà ÿâëÿåòñÿ ðåêóðñèâíàÿ êîíêàòåíàöèÿ òåêñòîâîãî ñîäåðæèìîãî ñàìîãî óçëà è òåêñòîâîãî ñîäåðæèìîãî âñåõ åãî äî÷åðíèõ óçëîâ.
Èçìåíåííûé øàáëîí äëÿ ýëåìåíòà PLANET
<xsl:template match="PLANET">
<p>
<xsl:value-of select="NAME">
</p>
</xsl:template>
ïîçâîëèò ñîçäàòü HTML-äîêóìåíò ñ àáçàöàìè, ñîäåðæàùèìè èìåíà
ïëàíåò, îïðåäåëåííûõ â äîêóìåíòå XML.
68
Ÿ6. Âûáîð ìåòîäà âûâîäà
Ýëåìåíò <xsl:output> îïðåäåëÿåò äëÿ ïðîöåññîðà XSLT òèï
ãåíåðèðóåìîãî âûõîäíîãî äîêóìåíòà. Èìååò ñëåäóþùèå àòðèáóòû:
• cdata-section-elements (íåîáÿçàòåëüíûé) Çàäàåò íàçâàíèÿ
òåõ ýëåìåíòîâ, ÷üå ñîäåðæèìîå áóäåò âûâîäèòüñÿ â âèäå ðàçäåëîâ CDATA. Çàäàåòñÿ â âèäå ñïèñêà íàçâàíèé ýëåìåíòîâ.
• doctype-public (íåîáÿçàòåëüíûé) Îïðåäåëÿåò îòêðûòûé
èäåíòèôèêàòîð, êîòîðûé áóäåò èñïîëüçîâàòüñÿ â îáúÿâëåíèè
<!DOCTYPE>.
• doctype-system (íåîáÿçàòåëüíûé) Îïðåäåëÿåò ñèñòåìíûé
èäåíòèôèêàòîð, êîòîðûé áóäåò èñïîëüçîâàòüñÿ â îáúÿâëåíèè
<!DOCTYPE>.
• encoding (íåîáÿçàòåëüíûé) Îïðåäåëÿåò, áóäåò ëè âêëþ÷åí â
xml-îáúÿâëåíèå àòðèáóò encoding ñ óêàçàííûì çíà÷åíèåì èñïîëüçîâàííîé â äîêóìåíòå êîäèðîâêè ñèìâîëîâ.
• indent (íåîáÿçàòåëüíûé) Îïðåäåëÿåò, áóäåò ëè âûâîä âûðîâíåí ñ îòîáðàæåíèåì ñòðóêòóðû âëîæåííîñòè. Óñòàíàâëèâàåòñÿ ðàâíûì ¾yes¿ èëè ¾no¿;
• media-type (íåîáÿçàòåëüíûé) Îïðåäåëÿåò òèï MIME âûâîäà.
Óñòàíàâëèâàåòñÿ â ñòðîêîâîå çíà÷åíèå;
• method (íåîáÿçàòåëüíûé) Îïðåäåëÿåò ôîðìàò âûâîäà. Óñòàíàâëèâàåòñÿ ðàâíûì ¾xml¿, ¾html¿, ¾text¿ èëè äîïóñòèìîìó
èìåíè òèïà QName.
• omit-xml-declaration (íåîáÿçàòåëüíûé) Îïðåäåëÿåò, áóäåò
ëè âêëþ÷åíî â âûâîä xml-îáúÿâëåíèå. Óñòàíàâëèâàåòñÿ ðàâíûì ¾yes¿ èëè ¾no¿.
• standalone (íåîáÿçàòåëüíûé) Îïðåäåëÿåò, áóäåò ëè âêëþ÷åí â
xml-îáúÿâëåíèå àòðèáóò standalone ñ óêàçàííûì çíà÷åíèåì.
Óñòàíàâëèâàåòñÿ ðàâíûì ¾yes¿ èëè ¾no¿.
69
• version (íåîáÿçàòåëüíûé) Îïðåäåëÿåò, áóäåò ëè âêëþ÷åí â
xml-îáúÿâëåíèå àòðèáóò version ñ óêàçàííûì çíà÷åíèåì.
Óñòàíàâëèâàåòñÿ â äîïóñòèìóþ ëåêñåìó òèïà NMToken.
Ÿ7. Âñòàâêà òàáëèöû ñòèëåé â äðóãóþ
Ýëåìåíò âåðõíåãî óðîâíÿ <xsl:include> âêëþ÷àåò ôàéë òàáëèöû ñòèëåé, àäðåñ êîòîðîé çàäàí â åãî àòðèáóòå href, â äðóãóþ
òàáëèöó ñòèëåé.
Óäàëèì èç òàáëèöû ñòèëåé planets.xsl (ñòð. 57) øàáëîí
ïðåîáðàçîâàíèÿ ýëåìåíòà PLANET è âêëþ÷èì ïåðåä ñàìûì ïåðâûì øàáëîíîì ñëåäóþùèé ýëåìåíò äëÿ âêëþ÷åíèÿ âíåøíåãî ôàéëà ñ øàáëîíîì ïðåîáðàçîâàíèÿ ýëåìåíòà PLANET (âñå ýëåìåíòû
<xsl:include> ÿâëÿþòñÿ ïåðâûìè äåòüìè êîðíåâîãî ýëåìåíòà äîêóìåíòà òàáëèöû ñòèëåé):
<xsl:include href="rules.xsl"/>
Âêëþ÷àåìàÿ òàáëèöà ñòèëåé rules.xsl äîëæíà áûòü õîðîøî
ñôîðìèðîâàííûì XML-äîêóìåíòîì êëàññà XSL:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:value-of select="MASS"/></TD>
<TD><xsl:value-of select="RADIUS"/></TD>
<TD><xsl:value-of select="DAY"/></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
Åñëè âî âêëþ÷àåìîì ôàéëå èñïîëüçóåòñÿ êîäèðîâêà îòëè÷íàÿ îò
óìàë÷èâàåìîé UTF-8, òî åå ñëåäóåò óêàçàòü â àòðèáóòå encoding
xml-îáúÿâëåíèÿ.  ïðîòèâíîì ñëó÷àå â MS IE áóäåò ïîëó÷åíà îøèáêà î íåäîïóñòèìîì ñèìâîëå â òåêñòîâîì êîììåíòàðèè, à FireFox
ñèìâîëû, çàäàííûå íå â êîäèðîâêå UTF-8 áóäóò îòîáðàæåíû çíàêàìè âîïðîñîâ (ýòî êàñàåòñÿ ñèìâîëîâ êèðèëëèöû).
70
Åñëè â òàáëèöó ñòèëåé âêëþ÷àåòñÿ íåñêîëüêî âíåøíèõ òàáëèö ñòèëåé ñ ïðàâèëàìè äëÿ îäíîãî è òîãî æå ýëåìåíòà, òî â ñëó÷àå
îòñóòñòâèÿ â èñõîäíîé òàáëèöå ïðàâèëà äëÿ ýòîãî ýëåìåíòà áóäåò
ïðèìåíåíî ïðàâèëî, îïðåäåëåííîå â ïîñëåäíåé âêëþ÷àåìîé òàáëèöå. Åñëè â èñõîäíîé òàáëèöå ïðàâèëî äëÿ ýòîãî ýëåìåíòà îïðåäåëåíî, òî áóäåò ïðèìåíåíî èìåííî îíî.
Ýëåìåíò <xsl:import> èìïîðòèðóåò ôàéë òàáëèöû ñòèëåé â
äðóãóþ òàáëèöó ñòèëåé ñ óñòàíîâêîé ñòàðøèíñòâà ïðàâèë.
 îòñóòñòâèè ïðàâèëà äëÿ ýëåìåíòà â èñõîäíîé òàáëèöå ñòèëåé
èìïîðòèðóåìûå òàáëèöû ñòèëåé âåäóò ñåáÿ òàêæå, êàê è âêëþ÷àåìûå: ê ýëåìåíòó ïðèìåíÿåòñÿ ïðàâèëî, îïðåäåëåííîå â ïîñëåäíåé
èìïîðòèðîâàííîé òàáëèöå.
Îäíàêî åñëè â èñõîäíîé òàáëèöå ñòèëåé çàäàíî ïðàâèëî äëÿ
ýëåìåíòà, òî ìîæíî ñ ïîìîùüþ èíñòðóêöèè <xsl:apply-imports>
äîáàâèòü â ýòî ïðàâèëî òàêæå è ôîðìàòèðîâàíèå, îïðåäåëåííîå â
èìïîðòèðóåìîé òàáëèöå ñòèëåé. Áóäåò ïðèìåíåíî ïðàâèëî äëÿ ýòîãî ýëåìåíòà ñ íàèâûñøèì ïðèîðèòåòîì èç âñåõ èìïîðòèðîâàííûõ.
Íàïðèìåð, â ñëó÷àå èìïîðòèðîâàíèÿ ôàéëà rules.xsl â èñõîäíóþ
òàáëèöó ñòèëåé ìîæíî â íåé îïðåäåëèòü ïðàâèëî äëÿ ýëåìåíòà
PLANET, â êîòîðîå âñòàâèòü äîïîëíèòåëüíîå ïðåîáðàçîâàíèå ýòîãî
æå ýëåìåíòà èç èìïîðòèðîâàííîé òàáëèöû:
<xsl:template match="PLANET">
<TR>
<TD colspan="4">Ïðàâèëî èñõîäíîå</TD>
<xsl:apply-imports/>
</TR>
</xsl:template>
Ÿ8. Î øàáëîíàõ ïîäðîáíåå
Êîãäà ïðîöåññîð XSLT íàõîäèò óçåë, óäîâëåòâîðÿþùèé îáðàçöó âûáîðà, çàäàííîìó â àòðèáóòå match øàáëîíà, ýòîò óçåë ñòàíîâèòñÿ êîíòåêñòíûì óçëîì øàáëîíà è âñå îïåðàöèè, îïðåäåëåííûå
â òåëå øàáëîíà, ïðîèçâîäÿòñÿ íàä ýòèì óçëîì.
Îáðàçöû âûáîðà ïîäìíîæåñòâî ÿçûêà XPath . Èõ ìîæíî èñïîëüçîâàòü â àòðèáóòå match ýëåìåíòîâ <xsl:template>
71
è <xsl:key>, à òàêæå â àòðèáóòàõ count è from ýëåìåíòà
<xsl:number>.
Îáðàçöû âûáîðà ìîæíî ìûñëèòü êàê ðåãóëÿðíûå âûðàæåíèÿ,
çàäàþùèå ïóòè äîñòóïà ê òðåáóåìûì óçëàì äåðåâà äîêóìåíòà. Îáðàçöû âûáîðà áóäóò èçó÷àòüñÿ ïîäðîáíåå äàëåå, à ñåé÷àñ ïðîñòî
ïðèâåäåì ïðèìåðû çàäàíèÿ îáðàçöîâ âûáîðà, êîòîðûå ïîòðåáóþòñÿ â áëèæàéøèõ ïàðàãðàôàõ:
• / âûáèðàåò êîðíåâîé óçåë;
• * âûáèðàåò òîëüêî óçëû ýëåìåíòîâ (óçëû àòðèáóòîâ âûáðàíû íå áóäóò);
• PLANET âûáèðàåò ýëåìåíòû <PLANET>
• PLANET/MASS âûáèðàåò âñå ýëåìåíòû <MASS>, äî÷åðíèå äëÿ
ýëåìåíòà <PLANET>;
• //PLANET âûáèðàåò âñå ýëåìåíòû <PLANET>, ïðîèçâîäíûå îò
êîðíåâîãî óçëà;
• . âûáèðàåò òåêóùèé óçåë (ýòî íå îáðàçåö âûáîðà, à ïðèíÿòîå
ñîêðàùåíèå äëÿ âûðàæåíèÿ XPath, çàäàþùåå òåêóùèé óçåë).
Îáðàçöû âûáîðà ìîæíî òàêæå èñïîëüçîâàòü â àòðèáóòå select ýëåìåíòîâ <xsl:apply-templates>, <xsl:value-of>,
<xsl:for-each>, <xsl:copy-of> è <xsl:sort>, õîòÿ â óêàçàííîì
àòðèáóòå ïåðå÷èñëåííûõ ýëåìåíòîâ ìîæíî èñïîëüçîâàòü ïîëíûå
âûðàæåíèÿ XPath.
Ïðîñòîå èñïîëüçîâàíèå <xsl:apply-templates/> óêàçûâàåò
ïðîöåññîðó XSLT îñóùåñòâëÿòü ïîèñê âñåõ øàáëîíîâ äëÿ âñåõ äî÷åðíèõ óçëîâ êîíòåêñòíîãî óçëà èìåííî â òîì ïîðÿäêå, â êîòîðîì
îíè îïðåäåëåíû â óçëå. Àòðèáóò select ýòîãî ýëåìåíòà ïîçâîëÿåò
çàäàòü ïðèìåíåíèå øàáëîíîâ â òðåáóåìîì ïîðÿäêå äëÿ îïðåäåëåííûõ (íå âñåõ) äî÷åðíèõ óçëîâ:
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
72
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
<xsl:template match="MASS">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="RADIUS">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="DAY">
<xsl:value-of select="."/>
</xsl:template>
Ÿ9. ×òåíèå çíà÷åíèé àòðèáóòîâ
Ïîëó÷èòü äîñòóï ê çíà÷åíèþ àòðèáóòà ìîæíî ñ ïîìîùüþ ýëåìåíòà <xsl:value-of>, çàäàâ â àòðèáóòå select îáðàçåö âûáîðà äëÿ
àòðèáóòà ïðåôèêñ @, çà êîòîðûì ñëåäóåò èìÿ àòðèáóòà, íàïðèìåð: @src, @height. Äëÿ âûáîðà âñåõ àòðèáóòîâ (èëè ëþáîãî)
èñïîëüçóåòñÿ âûðàæåíèå @*.
Îòîáðàçèì åäèíèöû èçìåðåíèÿ (îïðåäåëåííûå â àòðèáóòå
UNITS) äëÿ ìàññ ïëàíåò èç äîêóìåíòà planets.xml, èçìåíèâ øàáëîí
äëÿ ýëåìåíòà MASS:
<xsl:template match="MASS">
<xsl:value-of select="."/>
<xsl:value-of select="@UNITS"/>
</xsl:template>
Ðåçóëüòàò íå ñîâñåì óñòðàèâàåò íàñ, òàê êàê ìåæäó çíà÷åíèåì ìàññû è åäèíèöåé èçìåðåíèÿ íåò ïðîáåëà .0553(Çåìëÿ = 1).
Âñòàâèòü òåêñò (ïðîáåë) ìîæíî ïðè ïîìîùè ýëåìåíòà <xsl:text>,
çàäàâ åãî ñîäåðæèìûì îäèí ïðîáåë:
<xsl:template match="MASS">
<xsl:value-of select="."/>
73
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
Ýëåìåíò
<xsl:text>
èìååò
åäèíñòâåííûé
àòðèáóò
disable-output-escaping, çíà÷åíèå ¾yes¿ êîòîðîãî íå ïðåîáðàçóåò ñèìâîëû ðàçìåòêè â ñèìâîëüíûå ññûëêè. Ïî óìîë÷àíèþ
èìååò çíà÷åíèå ¾no¿.
Ÿ10. Ñîçäàíèå àòðèáóòîâ
Ìîæíî
ñîçäàòü
àòðèáóò
ïðè
ïîìîùè
ýëåìåíòà
<xsl:attribute> è ïðèñîåäèíèòü åãî ê ýëåìåíòó â âûõîäíîì
äåðåâå äîêóìåíòà, à ìîæíî èñïîëüçîâàòü îáðàçåö âûáîðà çíà÷åíèÿ
àòðèáóòà â ëèòåðàëüíîì ýëåìåíòå äëÿ çàäàíèÿ çíà÷åíèÿ àòðèáóòà.
Ïðåäïîëîæèì, ÷òî íàì íåîáõîäèìî âñå äî÷åðíèå ýëåìåíòû
âñåõ ýëåìåíòîâ PLANET ïðåäñòàâèòü â âèäå àòðèáóòîâ:
<?xml version="1.0" encoding="windows-1251"?>
<PLANETS>
<PLANET DAY="58.65 äíåé" RADIUS="1516 ìèëè"
MASS=".0553 (Çåìëÿ = 1)" NAME="Ìåðêóðèé"/>
. . .
</PLANETS>
Èñïîëüçîâàòü ýëåìåíò <xsl:value-of select=NAME"/>"â
çíà÷åíèÿõ àòðèáóòà, çàäàííîãî â áóêâàëüíîì ýëåìåíòå, íåëüçÿ:
<xsl:template match="PLANET">
<PLANET
NAME="<xsl:value-of select="NAME"/> "
MASS="<xsl:value-of select="MASS"/>
<xsl:text> </xsl:text>
<xsl:value-of select="MASS/@UNITS"/>"
. . .
/>
</xsl:template>
Ñëåäóåò âîñïîëüçîâàòüñÿ îáðàçöîì âûáîðà äëÿ çàäàíèÿ çíà÷åíèÿ àòðèáóòà, çàêëþ÷èâ òðåáóåìûé îáðàçåö âûáîðà ýëåìåíòà èëè
74
àòðèáóòà, ÷ü¼ çíà÷åíèå ñëåäóåò èñïîëüçîâàòü â êà÷åñòâå çíà÷åíèÿ
àòðèáóòà, â ôèãóðíûå ñêîáêè:
<xsl:template match="PLANET">
<PLANET
NAME="{NAME}" MASS="{MASS} {MASS/@UNITS}"
RADIUS="{RADIUS} {RADIUS/@UNITS}"
DAY="{DAY} {DAY/@UNITS}"/>
</xsl:template>
 îáðàçöàõ âûáîðà äëÿ çíà÷åíèé àòðèáóòîâ íåëüçÿ èñïîëüçîâàòü âëîæåííûå ôèãóðíûå ñêîáêè è èõ ñëåäóåò óäâàèâàòü, äëÿ òîãî
÷òîáû ïðîöåññîð XSLT èõ èãíîðèðîâàë.
Øàáëîíû çíà÷åíèé àòðèáóòîâ âñåãäà ðàáîòàþò ñ êîíòåêñòíûì
óçëîì
Øàáëîíû çíà÷åíèé àòðèáóòîâ ìîæíî èñïîëüçîâàòü òîëüêî â
ñëåäóþùèõ ìåñòàõ:
• ýëåìåíòû áóêâàëüíîãî ðåçóëüòàòà;
• ýëåìåíòû ðàñøèðåíèÿ;
• <xsl:attribute> (çäåñü ìîæíî èñïîëüçîâàòü àòðèáóòû name
è namespace);
• <xsl:element> (çäåñü ìîæíî èñïîëüçîâàòü àòðèáóòû name è
namespace);
• <xsl:number> (çäåñü ìîæíî èñïîëüçîâàòü àòðèáóòû format,
lang, letter-value, grouping-separator è grouping-size);
• <xsl:processing-instruction> (çäåñü ìîæíî èñïîëüçîâàòü
àòðèáóò name);
• <xsl:sort> (çäåñü ìîæíî èñïîëüçîâàòü àòðèáóòû lang,
data-type, order è case-order).
Ÿ11. Îáðàáîòêà ïðîáåëüíûõ ñèìâîëîâ
75
ýòî òåêñòîâûå
óçëû, ñîäåðæàùèå òîëüêî ïðîáåëüíûå ñèìâîëû (ïðîáåëû, ñèìâîëû
òàáóëÿöèè è ïåðåõîäà íà íîâóþ ñòðîêó).
Îïðåäåëåíèå 3.11.1. ×èñòûå óçëû-ðàçäåëèòåëè
×èñòûå óçëû-ðàçäåëèòåëè èñïîëüçóþòñÿ äëÿ ñòðóêòóðèðîâàíèÿ äîêóìåíòà îòñòóïàìè. Èç òàáëèöû ñòèëåé ÷èñòûå óçëûðàçäåëèòåëè â âûõîäíîé äîêóìåíò íå êîïèðóþòñÿ, íî ïî óìîë÷àíèþ
êîïèðóþòñÿ èç èñõîäíîãî äîêóìåíòà.
Ïðèìåíèòü ê planets.xml è ïîñìîòðåòü îñòàâøèåñÿ ïðîáåëüíûå
ñèìâîëû:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ýëåìåíò <xsl:strip-space> äàåò óêàçàíèå ïðîöåññîðó XSLT óáðàòü âñå ÷èñòûå óçëû-ðàçäåëèòåëè, ýëåìåíò
<xsl:preserve-space> äàåò óêàçàíèå ïðîöåññîðó XSLT îñòàâèòü âñå ÷èñòûå óçëû-ðàçäåëèòåëè
elements (îáÿçàòåëüíûé). Çàäàåò ýëåìåíòû, èç êîòîðûõ íóæíî óáðàòü ñèìâîëû-ðàçäåëèòåëè. Ïðåäñòàâëÿåò ñîáîé ñïèñîê ðàçäåëåííûõ ñèìâîëàìè-ðàçäåëèòåëÿìè NameTest (èìåíàìè èëè îáîáùåííûìè èìåíàìè ñ ñèìâîëàìè ïîäñòàíîâîê).
<xsl:strip-space elements="*"/>
Ÿ12. Ïðàâèëà ïî óìîë÷àíèþ â øàáëîíå
Åñëè äëÿ ýëåìåíòà íå çàäàíî ïðàâèëî, òî ïî óìîë÷àíèþ äåéñòâóåò îäíî èç ñëåäóþùèõ ïðàâèë:
• Êîðíåâîé
óçåë.
Ïî
<xsl:apply-templates/>;
76
óìîë÷àíèþ
âûçûâàåòñÿ
• Óçëû
ýëåìåíòîâ.
Ïî
<xsl:apply-templates/>;
óìîë÷àíèþ
âûçûâàåòñÿ
• Óçëû àòðèáóòîâ. Êîïèðóåò â ðåçóëüòèðóþùèé äîêóìåíò
çíà÷åíèå àòðèáóòà, îäíàêî êîïèðóåò åãî êàê òåêñò, íî íå êàê
àòðèáóò;
• Òåêñòîâûå óçëû. Êîïèðóåò â ðåçóëüòèðóþùèé äîêóìåíò
òåêñò;
• Óçëû êîììåíòàðèåâ. Íåò îáðàáîòêè XSLT, íè÷åãî íå êîïèðóåòñÿ;
• Óçëû èíñòðóêöèé îáðàáîòêè. Íåò îáðàáîòêè XSLT, íè÷åãî íå êîïèðóåòñÿ;
• Óçëû ïðîñòðàíñòâ èìåí. Íåò îáðàáîòêè XSLT, íè÷åãî íå
êîïèðóåòñÿ.
Íàèáîëåå âàæíîå ïðàâèëî ïî óìîë÷àíèþ ïðèìåíÿåòñÿ ê ýëåìåíòàì è ìîæåò áûòü âûðàæåíî ñëåäóþùèì îáðàçîì:
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
Ïðàâèëî ïî óìîë÷àíèþ äëÿ òåêñòîâûõ óçëîâ ìîæíî âûðàçèòü
ñëåäóþùèì îáðàçîì:
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
Çäåñü XSLT-ôóíêöèÿ text() âûáèðàåò òåêñò óçëà, êîòîðûé è äîáàâëÿåòñÿ â âûõîäíîé äîêóìåíò.
Èíñòðóêöèè îáðàáîòêè íå âñòàâëÿþòñÿ â âûõîäíîé äîêóìåíò,
ïîýòîìó èõ ïðàâèëî ïî óìîë÷àíèþ ìîæíî âûðàçèòü, èñïîëüçóÿ
XSLT-ôóíêöèþ processing-instruction():
<xsl:template match="processing-instruction()"/>
Òî æå âåðíî è äëÿ êîììåíòàðèåâ, íî òîëüêî ñëåäóåò â øàáëîíå
èñïîëüçîâàòü XSLT-ôóíêöèþ comment():
77
<xsl:template match="comment()"/>
Óäàëåíèå ñîäåðæèìîãî
Åñëè â òàáëèöå ñòèëåé äëÿ ýëåìåíòà íå áóäåò çàäàíî íèêàêîãî
ïðàâèëà, òî ïî óìîë÷àíèþ â âûõîäíîé äîêóìåíò áóäåò ñêîïèðîâàí
òåêñò åãî ñîäåðæèìîãî âìåñòå ñî çíà÷åíèÿìè àòðèáóòîâ. Åñëè íåîáõîäèìî âîîáùå íå îáðàáàòûâàòü êàêîé-ëèáî ýëåìåíò, òî ñëåäóåò äëÿ
íåãî çàäàòü ïðàâèëî ñ ïóñòûì òåëîì:
<xsl:template match="RADIUS">
</xsl:template>
Ÿ13. Êîïèðîâàíèå óçëîâ â âûõîäíîé äîêóìåíò
Ýëåìåíò <xsl:copy>
Ýëåìåíò <xsl:copy> êîïèðóåò óçåë â âûõîäíîé äîêóìåíò, îäíàêî åãî àòðèáóòû è âñå óçëû-ïîòîìêè íå êîïèðóþòñÿ. Òåëî øàáëîíà çàäàåòñÿ, åñëè êîïèðóåòñÿ êîðíåâîé óçåë èëè ëþáîé ýëåìåíò.
Ñëåäóþùåå ïðàâèëî ñîçäàñò êîïèþ èñõîäíîãî äîêóìåíòà ñ óäàëåííûìè àòðèáóòàìè âñåõ ýëåìåíòîâ:
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
Åñëè íåîáõîäèìî ñêîïèðîâàòü è àòðèáóòû, òî ñëåäóåò âîñïîëüçîâàòüñÿ ýëåìåíòîì <xsl:copy-of>.
Ýëåìåíò <xsl:copy-of>
Ýëåìåíò <xsl:copy-of> îñóùåñòâëÿåò ãëóáîêîå êîïèðîâàíèå
óçëîâ, ïðè êîòîðîì êîïèðóåòñÿ íå òîëüêî óçåë, íî è âñå åãî àòðèáóòû è ïîòîìêè. Ó ýòîãî ýëåìåíòà åäèíñòâåííûé îáÿçàòåëüíûé àòðèáóò select, â êîòîðîì çàäàåòñÿ âûðàæåíèå XPath (â òîì ÷èñëå è
îáðàçåö âûáîðà) äëÿ âûáîðà óçëà èëè öåëîãî ñåìåéñòâà óçëîâ, ïîäëåæàùèõ êîïèðîâàíèþ â âûõîäíîé äîêóìåíò. Íàïðèìåð, ñîçäàíèå
èäåíòè÷íîãî îáðàáàòûâàåìîìó äîêóìåíòó íîâîãî äîêóìåíòà (åãî
êîïèþ) ìîæíî âûïîëíèòü ñ ïîìîùüþ ñëåäóþùåãî øàáëîíà:
78
<xsl:template match="/">
<xsl:copy-of select="*"/>
</xsl:template>
Ÿ14. Ïðèíÿòèå ðåøåíèé
Âûáîð ïî óñëîâèþ
Ïðè ïîìîùè ýëåìåíòà <xsl:if> îñóùåñòâëÿþòñÿ ïðîâåðêè
óñëîâèÿ è ïðèíèìàþòñÿ äåéñòâèÿ íà îñíîâå ðåçóëüòàòà ïðîâåðêè.
Ó ýòîãî ýëåìåíòà îäèí îáÿçàòåëüíûé àòðèáóò test, â êîòîðîì çàäàåòñÿ óñëîâèå ïðîâåðêè â âèäå âûðàæåíèÿ, âû÷èñëÿåìîãî ðàâíûì ëîãè÷åñêîìó çíà÷åíèþ true èëè false. Åñëè çíà÷åíèå âûðàæåíèÿ true, òî ñîäåðæèìîå ýëåìåíòà <xsl:if> âñòàâëÿåòñÿ â òåëî
øàáëîíà. Çíà÷åíèåì àòðèáóòà test ìîæåò áûòü ëþáîå âûðàæåíèå
XPath, äëÿ ïðåîáðàçîâàíèÿ êîòîðîãî â ëîãè÷åñêèå çíà÷åíèÿ true
èëè false ïðèìåíÿþòñÿ ïðàâèëà:
• åñëè âûðàæåíèå âû÷èñëÿåòñÿ â íàáîð óçëîâ, îíî òðàêòóåòñÿ
êàê true, åñëè íàáîð óçëîâ ñîäåðæèò õîòÿ áû îäèí óçåë;
• âûðàæåíèå-ñòðîêà ñ÷èòàåòñÿ true, åñëè ñòðîêà íå ïóñòà;
• ôðàãìåíò ðåçóëüòèðóþùåãî äåðåâà òðàêòóåòñÿ êàê true, åñëè
ñîäåðæèò óçëû;
• åñëè âûðàæåíèå âû÷èñëÿåòñÿ â ÷èñëî, îíî ñ÷èòàåòñÿ true, åñëè îòëè÷íî îò íóëÿ.
Ïðèìåð äîáàâëåíèÿ ãîðèçîíòàëüíîé ÷åðòû ïîñëå ïîñëåäíåãî
ýëåìåíòà äîêóìåíòà:
<xsl:template match="PLANET">
<P>
Ýëåìåíò <<xsl:value-of select="NAME"/>>
ÿâëÿåòñÿ äî÷åðíèì ýëåìåíòîì ýëåìåíòà PLANETS
íîìåð <xsl:value-of select="position()"/>.
</P>
<xsl:if test="position() = last()"><HR/></xsl:if>
</xsl:template>
79
Çäåñü èñïîëüçóþòñÿ XSLT-ôóíêöèè position() äëÿ ïîëó÷åíèÿ íîìåðà ýëåìåíòà â ñåìåéñòâå óçëîâ, ñîîòâåòñòâóþùèõ îáðàçöó âûáîðà
àòðèáóòà match øàáëîíà è last() äëÿ îïðåäåëåíèÿ íîìåðà ïîñëåäíåãî ýëåìåíòà â ñåìåéñòâà (êîëè÷åñòâî óçëîâ ïî-ñóùåñòâó).
Ïðèìåð îòîáðàæåíèÿ ñîäåðæèìîãî ýëåìåíòà <PLANETS> â âèäå
ñòðîêè ¾Ïåðâûå òðè ïëàíåòû: Ìåðêóðèé, Âåíåðà è Çåìëÿ.¿:
<xsl:template match="PLANETS">
<DOCUMENT>
<TITLE>
Ïëàíåòû
</TITLE>
<PLANETS>
Ïåðâûå òðè ïëàíåòû: <xsl:apply-templates select="PLANET"/>
</PLANETS>
</DOCUMENT>
</xsl:template>
<xsl:template match="PLANET">
<xsl:value-of select="NAME"/>
<xsl:if test="position() != last()">
<xsl:if test="position() != last()-1">, </xsl:if>
</xsl:if>
<xsl:if test="position()=last()-1"> è </xsl:if>
<xsl:if test="position()=last()">.</xsl:if>
</xsl:template>
Ïðèìåð ïðîâåðêè ñîäåðæèìîãî ýëåìåíòà <NAME>:
<xsl:template match="PLANET">
<xsl:if test="NAME[not(text())]">
<xsl:message terminate="yes">
Ó êàæäîé ïëàíåòû äîëæíî áûòü çàäàíî èìÿ!
</xsl:message>
</xsl:if>
</xsl:template>
Çäåñü èñïîëüçîâàíî âûðàæåíèå XPath text(), èñïîëüçóåìîå äëÿ òåñòèðîâàíèÿ óçëà íà ïðèíàäëåæíîñòü åãî ê òèïó ¾òåêñòîâûé óçåë¿.
XPath-ôóíêöèÿ not() âûïîëíÿåò îïåðàöèþ ëîãè÷åñêîãî îòðèöàíèÿ
80
íàä ñâîèì àðãóìåíòîì.  êâàäðàòíûõ ñêîáêàõ â îáðàçöå âûáîðà çàäàåòñÿ íåîáÿçàòåëüíûé ïðåäèêàò, â êîòîðîì âûðàæåíèå XPath ìîæåò âû÷èñëÿòüñÿ ëèáî â ëîãè÷åñêîå çíà÷åíèå true èëè false, ëèáî
â öåëîå ÷èñëî.  ïåðâîì ñëó÷àå èç ïîëó÷åííîãî ñåìåéñòâà óçëîâ âûáèðàþòñÿ òîëüêî òå, äëÿ êîòîðûõ âûðàæåíèå ïðåäèêàòà èñòèííî, âî
âòîðîì óçåë ñ âû÷èñëåííûì ïîðÿäêîâûì íîìåðîì. Òàêèì îáðàçîì,
îáðàçåö âûáîðà ¾NAME[not(text())]¿ âûáèðàåò óçëû, ó êîòîðûõ íå
çàäàíî òåêñòîâîå ñîäåðæèìîå (â ïðåäèêàòå ôóíêöèè âûïîëíÿþòñÿ
íàä äî÷åðíèìè ýëåìåíòàìè óçëà).
Ýëåìåíò <xsl:message> (ñì. ñòð. 89) âñåãî ëèøü âûâîäèò ñâîå
ñîäåðæèìîå, îñòàíàâëèâàÿ äàëüíåéøóþ îáðàáîòêó äîêóìåíòà, åñëè
åãî àòðèáóò terminate óñòàíîâëåí ðàâíûì ¾yes¿.
Ïåðåêëþ÷àòåëü
Äëÿ ñîçäàíèÿ ïåðåêëþ÷àòåëÿ èñïîëüçóþòñÿ
<xsl:choose>, <xsl:when> è <xsl:otherwise>:
ýëåìåíòû
<xsl:choose>
<xsl:when test="áóëåâî âûðàæåíèå 1">
<!--òåëî øàáëîíà 1-->
</xsl:when>
<xsl:when test="áóëåâî âûðàæåíèå 2">
<!--òåëî øàáëîíà 2-->
. . .
<xsl:otherwise>
<!--òåëî øàáëîíà n-->
</xsl:otherwise>
</xsl:choose>
Ýëåìåíò <xsl:choose> ñîäåðæèò îäèí èëè áîëåå ýëåìåíòîâ
<xsl:when> è îäèí íåîáÿçàòåëüíûé ýëåìåíò <xsl:otherwise>, êîòîðûé äîëæåí áûòü ïîñëåäíèì. Àëãîðèòì ðàáîòû ïåðåêëþ÷àòåëÿ
ñëåäóþùèé: ïîñëåäîâàòåëüíî âû÷èñëÿþòñÿ áóëåâû âûðàæåíèÿ, çàäàííûå â àòðèáóòå test ýëåìåíòîâ <xsl:when>, â òåëî øàáëîíà
âñòàâëÿåòñÿ ñîäåðæèìîå ïåðâîãî òàêîãî ýëåìåíòà, ó êîòîðîãî àòðèáóò âû÷èñëÿåòñÿ ðàâíûì true è íà ýòîì ïåðåêëþ÷àòåëü çàâåðøàåò
ñâîþ ðàáîòó. Åñëè íè îäíî òåñòîâîå âûðàæåíèå íå ðàâíî true, òî â
øàáëîí âñòàâëÿåòñÿ ñîäåðæèìîå ýëåìåíòà <xsl:otherwise> â ñëó÷àå åãî íàëè÷èÿ.
81
Ïðèìåð îòîáðàæåíèÿ ñîäåðæèìîãî ýëåìåíòà <PLANETS> â âèäå
ñòðîêè ¾Ïåðâûå òðè ïëàíåòû: Ìåðêóðèé, Âåíåðà è Çåìëÿ.¿ (øàáëîí äëÿ ýëåìåíòà <PLANETS> ñì. ñòð. 80):
<xsl:choose>
<xsl:when test="position()=last()-1"> è </xsl:when>
<xsl:when test="position()!=last()">
<xsl:choose>
<xsl:when test="position()!=last()-1">, </xsl:when>
</xsl:choose>
</xsl:when>
<xsl:otherwise>.</xsl:otherwise>
</xsl:choose>
Öèêëè÷åñêàÿ îáðàáîòêà
Öèêëè÷åñêàÿ îáðàáîòêà ñåìåéñòâà óçëîâ çàäàåòñÿ ýëåìåíòîì
<xsl:for-each> ñ îäíèì îáÿçàòåëüíûì àòðèáóòîì select ñî çíà÷åíèåì ðàâíûì âûðàæåíèþ XPath, êîòîðîå âîçâðàùàåò ñåìåéñòâî
óçëîâ. Íà êàæäîì øàãå öèêëà òåëî øàáëîíà ïðèìåíÿåòñÿ ê ñëåäóþùåìó óçëó èç ñåìåéñòâà.
Ýëåìåíò <xsl:for-each> ìîæåò ñîäåðæàòü íîëü èëè áîëåå ýëåìåíòîâ <xsl:sort>, çà êîòîðûìè ñëåäóåò òåëî øàáëîíà.
 òåëå øàáëîíà XPath-ôóíêöèÿ position() âîçâðàùàåò ïîðÿäêîâûé íîìåð òåêóùåãî óçëà â ñåìåéñòâå óçëîâ, à last() âîçâðàùàåò ÷èñëî óçëîâ â ñåìåéñòâå.
Åñëè ýëåìåíò <xsl:sort> íå èñïîëüçóåòñÿ, óçëû îáðàáàòûâàþòñÿ â ïîðÿäêå, â êîòîðîì îíè ïîÿâëÿþòñÿ â äîêóìåíòå.  ïðîòèâíîì ñëó÷àå ñåìåéñòâî óçëîâ áóäåò ñíà÷àëà îòñîðòèðîâàíî â ïîðÿäêå, çàäàííîì ýòèì ýëåìåíòîì, à çàòåì íà÷íåòñÿ èõ öèêëè÷åñêàÿ
îáðàáîòêà.
Ïðåäïîëîæèì, ÷òî ó ýëåìåíòîâ <PLANET> ìîæåò áûòü íåñêîëüêî ýëåìåíòîâ <NAME>. Äëÿ èõ ïðåîáðàçîâàíèÿ â àáçàöû ñ óêàçàíèåì
ïîðÿäêîâîãî íîìåðà ìîæíî âîñïîëüçîâàòüñÿ ñëåäóþùèì øàáëîíîì:
<xsl:template match="PLANET">
<xsl:for-each select="NAME">
<P>
<xsl:value-of select="position()"/>.
<xsl:value-of select="."/>
82
</P>
</xsl:for-each>
</xsl:template>
Ýëåìåíò
<xsl:apply-templates> ïîõîæ íà ýëåìåíò
<xsl:for-each>, òàê îí, ïî-ñóùåñòâó, â öèêëå ïðèìåíÿåò øàáëîíû
ê äî÷åðíèì ýëåìåíòàì.
Êàê ïðàâèëî, ýëåìåíò <xsl:apply-templates> õîðîøî ïðèìåíÿòü â òåõ ñëó÷àÿõ, êîãäà îðãàíèçàöèÿ äî÷åðíèõ óçëîâ íåèçâåñòíà, è
íåîáõîäèìî ïðèìåíèòü ðàçëè÷íûå øàáëîíû ê ïîòîìêàì ðàçíûõ âèäîâ, íåçàâèñèìî îò êîëè÷åñòâà óðîâíåé, íà êîòîðûå óãëóáëÿåòñÿ èõ
ñòðóêòóðà. Åñëè æå äî÷åðíèå óçëû îáëàäàþò ðåãóëÿðíîé, õîðîøî
îïðåäåëåííîé îðãàíèçàöèåé, ìîæíî èñïîëüçîâàòü <xsl:for-each>
äëÿ îáðàáîòêè âñåõ ýòèõ óçëîâ.
Ýëåìåíòû <xsl:for-each> ìîæíî âêëàäûâàòü äðóã â äðóãà:
<xsl:template match="PLANETS">
<PLANETS>
<xsl:for-each select="PLANET">
<PLANET>
<xsl:for-each select="*">
<DATA>
<xsl:value-of select="."/>
</DATA>
</xsl:for-each>
</PLANET>
</xsl:for-each>
</PLANETS>
</xsl:template>
Ÿ15. Ñîðòèðîâêà äàííûõ
Ïðè ïîìîùè ýëåìåíòà <xsl:sort> ìîæíî ñîðòèðîâàòü óçëû â ñåìåéñòâå, óñòàíàâëèâàÿ, òàêèì îáðàçîì, ïîðÿäîê îáðàáîòêè óçëîâ äëÿ ýëåìåíòîâ <xsl:apply-templates> è äëÿ öèêëà
<xsl:for-each>. Ó ýëåìåíòà <xsl:sort> èìååòñÿ ðÿä àòðèáóòîâ:
• select (íåîáÿçàòåëüíûé). Çíà÷åíèå ðàâíî âûðàæåíèþ XPath,
âîçâðàùàþùåãî ñåìåéñòâî óçëîâ, ïîäëåæàùèõ ñîðòèðîâêè. Ïî
óìîë÷àíèþ çíà÷åíèå ðàâíî string(.).
83
• order (íåîáÿçàòåëüíûé). Çàäàåò ïîðÿäîê ñîðòèðîâêè:
ascending ïî âîçðàñòàíèþ, descending ïî óáûâàíèþ.
• case-order (íåîáÿçàòåëüíûé). Îïðåäåëÿåò, áóäóò ëè áóêâû â
âåðõíåì ðåãèñòðå ðàñïîëàãàòüñÿ ïåðåä áóêâàìè â íèæíåì ðåãèñòðå ïðè ñîðòèðîâêå: upper-first ñíà÷àëà âåðõíèé ðåãèñòð, lower-first ñíà÷àëà íèæíèé ðåãèñòð.
• lang (íåîáÿçàòåëüíûé). Çàäàåò ÿçûê, ÷üè ñîãëàøåíèÿ î ñîðòèðîâêå áóäóò ïðèìåíÿòüñÿ. Óñòàíàâëèâàåòñÿ ðàâíûì êîäó ÿçûêà, äîïóñòèìîìó â àòðèáóòå xml:lang.
• data-type (íåîáÿçàòåëüíûé). Îïðåäåëÿåò, áóäåò ëè ñîðòèðîâêà âåñòèñü â òåêñòîâîì èëè ÷èñëîâîì ïîðÿäêå: text òåêñòîâûé, number ÷èñëîâîé èëè ëþáîå ïðàâèëüíîå QName.
Ýòîò ýëåìåíò íå èìååò ñîäåðæèìîãî. Îí äîëæåí âõîäèòü â ñîäåðæèìîå ýëåìåíòîâ <xsl:apply-templates> èëè <xsl:for-each>,
÷òîáû âûïîëíÿòü ñîðòèðîâêó ñåìåéñòâ óçëîâ, ñ êîòîðûìè ðàáîòàþò
ýòè ýëåìåíòû. Íàïðèìåð, îòñîðòèðóåì ïëàíåòû ïî âîçðàñòàíèþ èõ
ïëîòíîñòåé:
<xsl:template match="PLANETS">
<xsl:apply-templates>
<xsl:sort select="DENSITY"/>
</xsl:apply-templates>
</xsl:template>
Ñîðòèðîâêà â öèêëå ïîêàçàíà íà ïðèìåðå óïîðÿäî÷åíèÿ ïëàíåò ïî âîçðàñòàíèþ èõ ðàäèóñîâ:
<xsl:template match="/PLANETS">
<xsl:for-each select="PLANET">
<xsl:sort select="RADIUS"/>
<xsl:value-of select="NAME"/>:
<xsl:value-of select="MASS"/>:
<xsl:value-of select="RADIUS"/>:
<xsl:value-of select="DAY"/><br/>
</xsl:for-each>
</xsl:template>
84
Ïî óìîë÷àíèþ, <xsl:sort> ïðîèçâîäèò ñîðòèðîâêó â àëôàïîðÿäêå, ÷òî îçíà÷àåò, ÷òî ¾10¿ ðàñïîëàãàåòñÿ ïåðåä ¾2¿.
Äëÿ îñóùåñòâëåíèÿ ñîðòèðîâêè â ÷èñëîâîì ïîðÿäêå ñëåäóåò èñïîëüçîâàòü àòðèáóò data-type è óñòàíîâèòü åãî çíà÷åíèå ðàâíûì
number:
âèòíîì
<xsl:sort data-type="number" select="DENSITY"/>
Óáûâàþùèé ïîðÿäîê ñîðòèðîâêè çàäàåòñÿ óñòàíîâêîé àòðèáóòà order ðàâíûì çíà÷åíèþ descending. Ìîæíî òàêæå ñîðòèðîâàòü ïî çíà÷åíèÿì àòðèáóòà, íàïðèìåð:
<xsl:apply-templates select="PLANETS">
<xsl:sort select="@SIZE"/>
</xsl:apply-templates>
Ïðè ñîðòèðîâêå ìîæíî ïðèìåíÿòü íåñêîëüêî êðèòåðèåâ. Ïåðâûé ýëåìåíò <xsl:sort> îòñîðòèðóåò äàííûå ïî ñâîåìó êðèòåðèþ,
ñëåäóþùèé ýëåìåíò ïî ñâîåìó êðèòåðèþ, è ò. ä.
<xsl:apply-templates>
<xsl:sort select="DISTANCE"/>
<xsl:sort select="DENSITY"/>
</xsl:apply-templates>
Ÿ16. Íóìåðàöèÿ â âûõîäíîì äîêóìåíòå
Ïðè ïîìîùè ýëåìåíòà <xsl:number> óçëó â ðåçóëüòèðóþùåì
äîêóìåíòå ïðèñâàèâàåòñÿ î÷åðåäíîé íîìåð. Íàïðèìåð, ìîæíî ïåðåíóìåðîâàòü àáçàöû â êîíòðàêòå èëè ñòðîôû â ïîýìå. Ìîæíî äàæå ïåðåíóìåðîâàòü ÷àñòè äîêóìåíòà íåñêîëüêèìè óðîâíÿìè, íàïðèìåð, ¾Ðàçäåë 3.2.5.1.¿ è ò. ï. Ó ýëåìåíòà <xsl:number> èìåþòñÿ
ñëåäóþùèå àòðèáóòû:
• level (íåîáÿçàòåëüíûé). Îïðåäåëÿåò ñïîñîá íóìåðàöèè:
single (îäíîóðîâíåâûé), multiple (ìíîãîóðîâíåâûé) èëè
any (ïðîèçâîëüíûé). Çíà÷åíèå ïî óìîë÷àíèþ single.
• count (íåîáÿçàòåëüíûé). Îïðåäåëÿåò, êàêèå óçëû íóæíî íóìåðîâàòü. Óñòàíàâëèâàåòñÿ ðàâíûì îáðàçöó âûáîðà.
85
• from (íåîáÿçàòåëüíûé). Îïðåäåëÿåò òî÷êó íà÷àëà îòñ÷åòà.
Óñòàíàâëèâàåòñÿ ðàâíûì îáðàçöó âûáîðà.
• value (íåîáÿçàòåëüíûé). ×èñëîâàÿ âåëè÷èíà, èñïîëüçóåìàÿ
äëÿ íóìåðàöèè, íàïðèìåð, position() (óìàë÷èâàåìîå çíà÷åíèå).
• format (íåîáÿçàòåëüíûé). Îïðåäåëÿåò ôîðìàò âûâîäà. Óñòàíàâëèâàåòñÿ ðàâíûì øàáëîíó çíà÷åíèÿ àòðèáóòà, âîçâðàùàþùåãî ñòðîêó ôîðìàòèðîâàíèÿ.
• lang (íåîáÿçàòåëüíûé). Îïðåäåëÿåò ÿçûê, ÷üè ñîãëàøåíèÿ áóäóò èñïîëüçîâàíû äëÿ íóìåðàöèè. Óñòàíàâëèâàåòñÿ ðàâíûì
êîäó ÿçûêà, êîòîðûé ìîæíî ïðèìåíÿòü â àòðèáóòå xml:lang.
• letter-value (íåîáÿçàòåëüíûé). Ïîçâîëÿåò âûáðàòü ðàçëè÷íûå ñõåìû íóìåðàöèè: alphabetical (àëôàâèòíàÿ) èëè
traditional (îáû÷íàÿ).
• grouping-separator (íåîáÿçàòåëüíûé). Ñèìâîë äëÿ ðàçäåëåíèÿ ãðóïï ðàçðÿäîâ, íàïðèìåð, çàïÿòàÿ. Óñòàíàâëèâàåòñÿ ðàâíûì øàáëîíó çíà÷åíèÿ àòðèáóòà, âîçâðàùàþùåãî åäèíñòâåííûé ñèìâîë.
• grouping-size (íåîáÿçàòåëüíûé). Êîëè÷åñòâî ðàçðÿäîâ â
êàæäîé ãðóïïå. Óñòàíàâëèâàåòñÿ ðàâíûì øàáëîíó çíà÷åíèÿ
àòðèáóòà, âîçâðàùàþùåãî ÷èñëî.
Îäíîóðîâíåâàÿ íóìåðàöèÿ
Îäíîóðîâíåâàÿ íóìåðàöèÿ
ýòî ïðîñòàÿ íóìåðàöèÿ,
êîãäà ïåðåíóìåðîâûâàþòñÿ óçëû-áðàòüÿ íà îäíîì óðîâíå
(level="single"). Ýòîò òèï íóìåðàöèè óñòàíîâëåí ïî óìîë÷àíèþ.
Ïðèìåð îäíîóðîâíåâîé íóìåðàöèè ïëàíåò â âûõîäíîì äîêóìåíòå ïðè îáðàáîòêå äîêóìåíòà planets.xml:
<xsl:template match="PLANET">
<TR>
<TD><xsl:number/>. <xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
86
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
Êðîìå èñïîëüçîâàííîé ïî óìîë÷àíèþ ÷èñëîâîé äåñÿòè÷íîé
íóìåðàöèè ìîæíî çàäàâàòü è äðóãèå ñïîñîáû íóìåðàöèè â àòðèáóòå format. Âîçìîæíûå çíà÷åíèÿ ýòîãî àòðèáóòà è ñîîòâåòñòâóþùèå
èì âèäû íóìåðàöèè ïåðå÷èñëåíû íèæå:
• 1 ïîðîæäàåò ïîñëåäîâàòåëüíîñòü 1, 2, 3...;
• 01 ïîðîæäàåò ïîñëåäîâàòåëüíîñòü 01, 02, 03...;
• äðóãèå ÷èñëà Unicode â äðóãèõ ñèñòåìàõ ñ÷èñëåíèÿ ïîðîæäàþò ïîñëåäîâàòåëüíîñòè àíàëîãè÷íî äâóì ïðåäûäóùèì ïðàâèëàì;
• a ïîðîæäàåò ïîñëåäîâàòåëüíîñòü a, b, ... , z, aa, ab, ... zy, zz,
aaa, aab, ...;
• A ïîðîæäàåò ïîñëåäîâàòåëüíîñòü A, B, ... , Z, AA, AB, ... ZY,
ZZ, AAA, AAB, ...;
• i ïîðîæäàåò ïîñëåäîâàòåëüíîñòü i, ii, iii, iv, ... ix, x, xi, xii
...;
• I ïîðîæäàåò ïîñëåäîâàòåëüíîñòü I, II, III, IV, ... IX, X, XI,
XII ...;
• Òàêæå âîçìîæíî äîáàâëÿòü ëþáûå íå àëôàâèòíî-öèôðîâûå
ñèìâîëû.
Íóìåðàöèÿ íà ïðîèçâîëüíûõ óðîâíÿõ
Èíîãäà ìîæåò ïîòðåáîâàòüñÿ ïðîñòî ïåðåíóìåðîâàòü óçëû
îïðåäåëåííîãî òèïà íåçàâèñèìî îò èõ óðîâíÿ â äîêóìåíòå. Ýòîò
ðåæèì âêëþ÷àåòñÿ óñòàíîâêîé àòðèáóòà level ðàâíûì çíà÷åíèþ
any. Íàïðèìåð, ñëåäóþùåå ïðàâèëî ïåðåíóìåðóåò âñå ýëåìåíòû
<NAME>:
87
<xsl:template match="NAME">
<xsl:number format="1" level="any" />
<xsl:text>. </xsl:text>
<xsl:value-of select="."/><br/>
</xsl:template>
<xsl:template match="text()">
</xsl:template>
Äëÿ òîãî, ÷òîáû íå îòîáðàæàëîñü ñîäåðæèìîå äðóãèõ ýëåìåíòîâ,
ñîäåðæàùèõñÿ â ýëåìåíòå <PLANET>, çàäàí ïóñòîé øàáëîí äëÿ òåêñòîâûõ óçëîâ.
Ïðè ïîìîùè àòðèáóòà from ýëåìåíòà <xsl:number> ìîæíî
óêàçàòü, ñ êàêîãî óçëà-ïðåäêà íà÷èíàòü ¾ãëîáàëüíûé¿ îòñ÷åò, òàê
êàê â ýòîì ñëó÷àå íóìåðàöèÿ íà÷íåòñÿ çàíîâî, êàê òîëüêî ¾ïîïàäàåì¿ â óêàçàííûé óçåë-ïðåäîê. Íàïðèìåð, åñëè óñòàíîâèòü óçåëïðåäîê â ïðåäûäóùåì øàáëîíå ðàâíûì ýëåìåíòó <PLANET>, òî ïîëó÷èì îòäåëüíóþ íóìåðàöèÿ ýëåìåíòîâ <NAME> â êàæäîì ýëåìåíòå
<PLANET>:
<xsl:number level="any" count="NAME" from="PLANET"/>
Ìíîãîóðîâíåâàÿ íóìåðàöèÿ
Äëÿ âêëþ÷åíèÿ ðåæèìà ìíîãîóðîâíåâîé íóìåðàöèè ñëåäóåò óñòàíîâèòü àòðèáóò level ýëåìåíòà <xsl:number> ðàâíûì
multiple. Ïðè ïîìîùè àòðèáóòà count ìîæíî óêàçàòü, óçëû êàêîãî òèïà ñëåäóåò íóìåðîâàòü. Ïðè îáðàáîòêå ýëåìåíòîâ
<xsl:number> ïðîöåññîð XSLT íóìåðóåò óçëû â ñîîòâåòñòâèè ñ
èåðàðõèåé äîêóìåíòà.
Íóìåðàöèþ âñåõ óðîâíåé â èåðàðõèè ýëåìåíòîâ äîêóìåíòà
planets.xml ìîæíî óâèäåòü, ïðèìåíèâ ñëåäóþùèå ïðàâèëà:
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>
Ïëàíåòû Ñîëíå÷íîé ñèñòåìû
</TITLE>
</HEAD>
88
<BODY>
<H1>
Ïëàíåòû Ñîëíå÷íîé ñèñòåìû
</H1>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:text> <<</xsl:text>
<xsl:number format="1.1.1." level="multiple" count="*"/>
<xsl:value-of select="name(.)"/>
<xsl:text>: </xsl:text><br/>
<xsl:apply-templates select="node()"/>
<xsl:text>>> </xsl:text><br/>
</xsl:copy>
</xsl:template>
Êàæäûé óðîâåíü èåðàðõèè îòìå÷åí îòêðûâàþùèìèñÿ è çàêðûâàþùèìèñÿ äâîéíûìè óãëîâûìè ñêîáêàìè.
Ÿ17. Ýëåìåíò <xsl:message>
Ïðè ïîìîùè ýëåìåíòà <xsl:message> ìîæíî äàòü óêàçàíèå
ïðîöåññîðó XSLT îòîáðàçèòü ñîîáùåíèå, è ëèáî ïðîäîëæèòü, ëèáî ïðåêðàòèòü îáðàáîòêó òàáëèöû ñòèëåé, çàäàâ çíà÷åíèå íåîáÿçàòåëüíîãî àòðèáóòà terminate, çíà÷åíèå êîòîðîãî yes ïðåêðàùàåò
îáðàáîòêó. Ïî óìîë÷àíèþ îí óñòàíîâëåí ðàâíûì no.
<xsl:template match="DAY">
<xsl:message terminate="yes">
Èçâèíèòå, ñîäåðæèìîå ýëåìåíòà DAY çàñåêðå÷åíî!
</xsl:message>
</xsl:template>
Ÿ18. Îáðàçöû âûáîðà
89
ÿâëÿþòñÿ ïîäìíîæåñòâîì âûðàæåíèé XPath (íå âñå âûðàæåíèÿ XPath ÿâëÿþòñÿ îáðàçöàìè âûáîðà)
Êàê óæå îòìå÷àëîñü ðàíåå îáðàçöû âûáîðà ÿâëÿþòñÿ ïîäìíîæåñòâîì âûðàæåíèé XPath (ñì. 71) è èõ ìîæíî ïðèìåíÿòü â àòðèáóò match ýëåìåíòîâ <xsl:template> è <xsl:key>, à òàêæå â àòðèáóòàõ count è from ýëåìåíòà <xsl:number>. Îáðàçöû âûáîðà îïðåäåëåíû â ðåêîìåíäàöèè XSLT, à íå à ðåêîìåíäàöèè XPath, òîãäà
êàê âûðàæåíèÿ XPath îïðåäåëåíû â ðåêîìåíäàöèè XPath.
 âûðàæåíèÿõ XPath ìîæíî èñïîëüçîâàòü ïóòè (îñè) äëÿ ïîëó÷åíèÿ äîñòóïà ê óçëàì, ïðåäñòàâëåííûå íà ðèñ. 3.18.1. Åäèíñòâåííûå âûðàæåíèÿ XPath, êîòîðûå ìîãóò áûòü îáðàçöàìè, ýòî
âûðàæåíèÿ, âîçâðàùàþùèå íàáîð óçëîâ (äàæå íàáîð, ñîñòîÿùèé
èç îäíîãî óçëà) è èñïîëüçóþùèå ïóòè, çàäàþùèå òîëüêî äî÷åðíèå
óçëû èëè óçëû àòðèáóòîâ.
Ðèñ. 3.18.1. Äîïóñòèìûå îñè âûðàæåíèé XPath.
Âûáîð óçëîâ-ýëåìåíòîâ
Äëÿ çàäàíèÿ âûðàæåíèé XPath èñïîëüçóåòñÿ ñïåöèàëüíûé
ÿçûê, îò÷àñòè ïîõîæèé íà ñèíòàêñèñ ðåãóëÿðíûõ âûðàæåíèé íåêîòîðûå ñèìâîëû ìîãóò èìåòü ñïåöèàëüíûå çíà÷åíèÿ.
Ñïîñîáû çàäàíèÿ îáðàçöîâ âûáîðà:
90
• êîðíåâîé óçåë äîêóìåíòà /;
• ýëåìåíòû XML èõ èìåíà, íàïðèìåð, PLANETS;
• Ïðè äîñòóïå ê äî÷åðíåìó óçëó îïðåäåëåííîãî óçëà äëÿ ðàçäåëåíèÿ èìåí ýëåìåíòîâ ñëåäóåò èñïîëüçîâàòü îïåðàöèþ øàãà
`/:
ïðàâèëî, êîòîðîå äîëæíî ïðèìåíÿòüñÿ òîëüêî ê òåì ýëå-
ìåíòàì <NAME>, êîòîðûå ÿâëÿþòñÿ äî÷åðíèìè äëÿ ýëåìåíòîâ <PLANET>:
<xsl:template match="PLANET/NAME">
<H3>
<xsl:value-of select="."/>
</H3>
</xsl:template>
• îáðàçåö * ñîîòâåòñòâóåò ëþáîìó ýëåìåíòó;
• îáðàçåö @* âûáèðàåò ëþáîé àòðèáóò;
• ñëåäóþùåå ïðàâèëî ïðèìåíÿåòñÿ êî âñåì ýëåìåíòàì <NAME>,
êîòîðûå ÿâëÿþòñÿ âíóêàìè ýëåìåíòîâ <PLANET>:
<xsl:template match="PLANET/*/NAME">
<H3>
<xsl:value-of select="."/>
</H3>
</xsl:template>
• îáðàçåö
PLANET//NAME
âûáèðàåò
PLANET/*/NAME, PLANET/*/*/NAME è ò. ä.
PLANET/NAME,
• âûáîð àòðèáóòû ïðåäâàðÿòü èõ èìåíà ïðåôèêñîì @.
Ôîðìàëüíîå îïðåäåëåíèå îáðàçöîâ âûáîðà
 ðåêîìåíäàöèÿõ äàåòñÿ ñëåäóþùåå îïðåäåëåíèå îáðàçöà âûáîðà: ¾Ñèíòàêñèñ äëÿ îáðàçöîâ âûáîðà ÿâëÿåòñÿ ïîäìíîæåñòâîì
91
ñèíòàêñèñà äëÿ âûðàæåíèé XPath. Âûðàæåíèå, â òî æå âðåìÿ ÿâëÿþùååñÿ îáðàçöîì, âñåãäà âû÷èñëÿåòñÿ ðàâíûì îáúåêòó, òèï êîòîðîãî íàáîð óçëîâ. Óçåë ñîîòâåòñòâóåò îáðàçöó, åñëè óçåë ÿâëÿåòñÿ
÷ëåíîì ðåçóëüòàòà âû÷èñëåíèÿ îáðàçöà êàê âûðàæåíèÿ ïî îòíîøåíèþ ê âîçìîæíîìó êîíòåêñòó. Âîçìîæíûì êîíòåêñòîì ìîæåò áûòü
êîíòåêñòíûé óçåë óçëà, ñîîòâåòñòâóþùåãî îáðàçöó, èëè óçëà îäíîãî
èç åãî ïðåäêîâ.¿
Ñàìîå âàæíîå ïðåäëîæåíèå â ïðåäûäóùåì àáçàöå ïîñëåäíåå. Ñóòü â òîì, ÷òî óçåë X óäîâëåòâîðÿåò îáðàçöó òîãäà è òîëüêî
òîãäà, êîãäà ñóùåñòâóåò óçåë X èëè ïðåäîê óçëà X, òàêîé, ÷òî ïðè
ïðèìåíåíèè ê ýòîìó óçëó îáðàçöà êàê âûðàæåíèÿ XPath, ðåçóëüòèðóþùèé íàáîð óçëîâ áóäåò âêëþ÷àòü X.
Ýòî çíà÷èò, ÷òî êîãäà íóæíî ïðîâåðèòü, óäîâëåòâîðÿåò ëè óçåë
îáðàçöó, ñíà÷àëà ñëåäóåò ïðèìåíèòü îáðàçåö êàê âûðàæåíèå XPath
ê ñàìîìó óçëó, çàòåì ïðèìåíèòü åãî ïîñëåäîâàòåëüíî êî âñåì åãî
ïðåäêàì, âïëîòü äî êîðíåâîãî óçëà. Åñëè êàêîé-ëèáî ïîëó÷åííûé
ïðè ýòîì íàáîð óçëîâ áóäåò ñîäåðæàòü ñàì óçåë, óçåë óäîâëåòâîðÿåò
îáðàçöó. Òàêîé ïîðÿäîê äåéñòâèé èìååò ñìûñë ïîòîìó, ÷òî îáðàçöû
âûáîðà ïèøóòñÿ äëÿ ïðèìåíåíèÿ ê òåêóùåìó óçëó èëè åãî äî÷åðíèì óçëàì.
 ñîîòâåòñòâèè ñ ôîðìàëüíûì îïðåäåëåíèåì îáðàçöà âûáîðà â ðåêîìåíäàöèÿõ XSLT ñ ïîìîùüþ ïðàâèë ðàñøèðåííîé ÁÍÔãðàììàòèêè êàæäûé îáðàçåö âûáîðà ñîñòîèò èç îäíîãî èëè áîëåå
îáðàçöà ïóòè ðàñïîëîæåíèÿ (location path pattern), ðàçäåëåííûõ
ñèìâîëîì |, îçíà÷àþùèì ëîãè÷åñêóþ îïåðàöèþ or.
Îáðàçåö ïóòè ðàñïîëîæåíèÿ ôîðìèðóåòñÿ èç íå îáÿçàòåëüíî
ïðåäâàðÿþùåéñÿ ñèìâîëàìè / èëè // ïîñëåäîâàòåëüíîñòè îáðàçöîâ øàãà, ðàçäåëåííûõ ýòèìè æå ñèìâîëàìè èëè ôóíêöèé id()
è key(), åäèíñòâåííûì ïàðàìåòðîì êîòîðûõ ÿâëÿåòñÿ óêàçàííàÿ
âûøå ïîñëåäîâàòåëüíîñòü îáðàçöîâ øàãà. Åñëè îáðàçåö ïóòè íà÷èíàåòñÿ ñ ñèìâîëà /, òî îí íàçûâàåòñÿ àáñîëþòíûì (îò êîðíÿ äîêóìåíòà), â ïðîòèâíîì ñëó÷àå îòíîñèòåëüíûì (ïðèìåíÿåòñÿ, íà÷èíàÿ
ñ êîíòåêñòíîãî óçëà).
Îáðàçåö øàãà ñòðîèòñÿ èç îñè (íàïðàâëåíèÿ ïåðåìåùåíèÿ),
óñëîâèÿ âûáîðà óçëà è íåîãðàíè÷åííîãî ÷èñëà ïðåäèêàòîâ, êîòîðûõ ìîæåò è íå áûòü âîâñå.
Òàêèì îáðàçîì, äëÿ ïîíèìàíèÿ ñîçäàíèÿ îáðàçöîâ âûáîðà ñëåäóåò ïîíÿòü òðè ñîñòàâíûå ÷àñòè îáðàçöà øàãà, òàê êàê îáðàçåö
92
âûáîðà, ïî-ñóùåñòâó, åñòü âñåãî ëèøü ïîñëåäîâàòåëüíîñòü îáðàçöîâ
øàãà.
Îáðàçöû øàãà: îñè
Îñü çàäàåòñÿ ñâîèì èìåíåì, çà êîòîðûì ñëåäóåò äâà äâîåòî÷èÿ
(íàïðèìåð, child::).
Ó îáðàçöîâ âûáîðà, â îòëè÷èå îò âûðàæåíèé XPath, òîëüêî
äâå îñè (ñì. ðèñ. 3.18.1):
• Îñü attribute ñîäåðæèò àòðèáóòû êîíòåêñòíîãî óçëà.
• Îñü child ñîäåðæèò äåòåé êîíòåêñòíîãî óçëà. Åñëè îñü ÿâíî
íå çàäàíà, òî ïî óìîë÷àíèþ ñ÷èòàåòñÿ, ÷òî èñïîëüçóåòñÿ îñü
child.
Ïðèìåðû ïðèìåíåíèÿ îñåé:
• child::PLANET âîçâðàùàåò äî÷åðíèå ýëåìåíòû <PLANET>
êîíòåêñòíîãî óçëà;
• child::* âîçâðàùàåò âñå äî÷åðíèå ýëåìåíòû êîíòåêñòíîãî
óçëà (àòðèáóòû íå âõîäÿò);
• attribute::UNIT âîçâðàùàåò àòðèáóò UNITS êîíòåêñòíîãî
óçëà;
• child::*/child::PLANET âîçâðàùàåò âñåõ âíóêîâ <PLANET>
êîíòåêñòíîãî óçëà.
Åñëè òðåáóåòñÿ âûáðàòü âñå ýëåìåíòû <MASS>, ïîÿâëÿþùèåñÿ â ëþáîì ìåñòå ýëåìåíòà <PLANETS>, äåòåé, âíóêîâ, ïðàâíóêîâ è ò. ä., êàæåòñÿ, ÷òî íåò ñïîñîáà ñäåëàòü ýòî â îäíîì
îáðàçöå. Â XPath ýòî ìîæíî ñäåëàòü ïðè ïîìîùè âûðàæåíèÿ
child::PLANETS/descendant::MASS, íî â îáðàçöàõ íåëüçÿ èñïîëüçîâàòü îñü ïîòîìêîâ (descendant). Îäíàêî ìîæíî ïðèìåíèòü ñîîòâåòñòâóþùóþ ïðåäñòàâëåííîìó âûøå âûðàæåíèþ îïåðàöèþ //.
Íàïðèìåð, îáðàçåö child::PLANETS//child::MASS âûáèðàåò âñå
ýëåìåíòû <MASS> â ëþáîì ìåñòå âíóòðè ýëåìåíòà <PLANETS>.
Ñîêðàùåííûé ñèíòàêñèñ
Äëÿ îáðàçöîâ ñóùåñòâóþò äâà ïðàâèëà ñîêðàùåíèÿ ñèíòàêñèñà
çàäàíèÿ îñåé:
93
• child::childname ìîæåò áûòü ñîêðàùåíî äî childname;
• attribute::childname ìîæåò áûòü ñîêðàùåíî äî @childname.
Ïðèìåðû
îñåé:
Íåñêîëüêî ïðèìåðîâ çàäàíèÿ îáðàçöîâ øàãà ñ èñïîëüçîâàíèåì
• PLANET âûáèðàåò äî÷åðíèå ýëåìåíòû <PLANET> êîíòåêñòíîãî óçëà;
• * âûáèðàåò âñå äî÷åðíèå ýëåìåíòû êîíòåêñòíîãî óçëà;
• @UNITS âûáèðàåò àòðèáóò UNITS óçëà;
• @* âûáèðàåò âñå àòðèáóòû êîíòåêñòíîãî óçëà;
• */PLANET âûáèðàåò âñåõ âíóêîâ <PLANET> êîíòåêñòíîãî óçëà;
• //PLANET âûáèðàåò âñåõ ïîòîìêîâ <PLANET> êîðíÿ äîêóìåíòà;
• PLANETS//PLANET âûáèðàåò âñå ýëåìåíòû <PLANET>, ÿâëÿþùèåñÿ ïîòîìêàìè äî÷åðíèõ ýëåìåíòîâ <PLANETS> êîíòåêñòíîãî óçëà;
• //PLANET/NAME âûáèðàåò âñå ýëåìåíòû <NAME>, äî÷åðíèå ïî
îòíîøåíèþ ê <PLANET>;
Îáðàçöû øàãà: óñëîâèå âûáîðà óçëà
Óñëîâèå âûáîðà óçëà (node test) ñîñòàâëÿþò âòîðóþ ÷àñòü îáðàçöîâ øàãà.  êà÷åñòâå óñëîâèÿ âûáîðà óçëà ìîæíî èñïîëüçîâàòü íàçâàíèå óçëà èëè ñèìâîë * äëÿ âûáîðà ëþáîãî ýëåìåíòà. Íàïðèìåð, âûðàæåíèå child::*/child::NAME âûáèðàåò âñå ýëåìåíòû
<NAME>, ÿâëÿþùèåñÿ ïðàâíóêàìè êîíòåêñòíîãî óçëà.
Ïîìèìî íàçâàíèé óçëîâ è ñèìâîëà ïîäñòàíîâêè * ìîæíî ïðèìåíÿòü òàêæå ñëåäóþùèå ôóíêöèè ïðè çàäàíèè óñëîâèÿ âûáîðà
óçëà:
• comment() âûáèðàåò óçëû êîììåíòàðèÿ:
94
<xsl:template match="comment()">
<COMMENT>
<xsl:value-of select="."/>
</COMMENT>
</xsl:template>
• node() âûáèðàåò óçåë ëþáîãî òèïà (óçåë ýëåìåíòà, òåêñòîâûé
óçåë, óçåë êîììåíòàðèÿ) çà èñêëþ÷åíèåì êîðíåâîãî óçëà (â
äåéñòâèòåëüíîñòè ýòî child::node()). Ñäåëàòü êîïèþ äîêóìåíòà ìîæíî ñ ïîìîùüþ ñëåäóþùåãî øàáëîíà:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
• processing-instruction() âûáèðàåò óçåë èíñòðóêöèè îáðàáîòêè. Â ñêîáêàõ ìîæíî óêàçàòü íàçâàíèå âûáèðàåìîé èíñòðóêöèè îáðàáîòêè;
• text() âûáèðàåò òåêñòîâûé óçåë.
Ïðàâèëî ïî óìîë÷àíèþ äëÿ òåêñòîâîãî óçëà âûáðàòü åãî
ñîäåðæèìîå. Îíî âêëþ÷àåòñÿ â âûõîäíîé äîêóìåíò, åñëè òîëüêî
äëÿ ýòîãî óçëà íå çàäàíî äðóãîå ïðàâèëî:
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
Ïîòðåáíîñòü â ïðèìåíåíèè óñëîâèÿ âûáîðà òåêñòîâîãî óçëà
âîçíèêàåò, íàïðèìåð, êîãäà íóæíî âûáðàòü óçëû ñ îïðåäåëåííûì
òåêñòîì. Ïðåäèêàò (òåêñò â êâàäðàòíûõ ñêîáêàõ) îáðàçöà âûáîðà
NAME[text() = 'Venus'] óêàçûâàåò, ÷òî ñëåäóåò âûáðàòü ýëåìåíòû <NAME>, â êîòîðûõ ñîäåðæèòñÿ ñòðîêà Venus. Åùå îäíà ïðè÷èíà äëÿ èñïîëüçîâàíèÿ óñëîâèÿ âûáîðà òåêñòîâîãî óçëà, êîãäà òðåáóåòñÿ ê ñîäåðæèìîìó òåêñòîâîãî óçëà ïðèìåíèòü ñòðîêîâóþ ôóíêöèþ XPath, íàïðèìåð, text()[starts-with(., 'E')].
95
Îáðàçöû øàãà: ïðåäèêàòû
Ïðåäèêàò ïðåäñòàâëÿåò ñîáîé óñëîâèå, êîòîðîå ïðîâåðÿåòñÿ íà
èñòèííîñòü. Îí îáÿçàòåëüíî çàêëþ÷åí â êâàäðàòíûå ñêîáêè [] è ñ
åãî ïîìîùüþ ìîæíî ïðîâåðèòü:
• çíà÷åíèå çàäàííîãî àòðèáóòà â çàäàííîì ýëåìåíòå;
• çíà÷åíèå ýëåìåíòà;
• ñîäåðæèò ëè ýëåìåíò îïðåäåëåííîãî ðåáåíêà, àòðèáóò èëè
äðóãîé ýëåìåíò;
• ïîçèöèþ óçëà â äåðåâå óçëîâ.
Ïðåäèêàòû ÿâëÿþòñÿ ïîëíûìè âûðàæåíèÿìè XPath, õîòÿ íà
ïðåäèêàòû, èñïîëüçóåìûå â îáðàçöàõ, íàêëàäûâàåòñÿ äâà îãðàíè÷åíèÿ:
• êîãäà îáðàçåö èñïîëüçóåòñÿ â àòðèáóòå match, ïðåäèêàò íå
äîëæåí ñîäåðæàòü íèêàêèõ ññûëîê íà ïåðåìåííûå XSL. Ýòî
îãðàíè÷åíèå íå ïðèìåíÿåòñÿ ê ïðåäèêàòàì, èñïîëüçóåìûì â
ýëåìåíòàõ <xsl:number>;
• îáðàçöû íå ìîãóò èñïîëüçîâàòü â ïðåäèêàòàõ ôóíêöèþ XPath
current(), âîçâðàùàþùóþ òåêóùèé óçåë.
Ïðèìåð:
<xsl:template match="PLANET[@COLOR = 'BLUE']">
Ïëàíåòà <xsl:value-of select="NAME"/> ãîëóáàÿ.
</xsl:template>
Ÿ19. Ñîçäàíèå ïðåäèêàòîâ
Ïðåäèêàòû íàñòîÿùèå âûðàæåíèÿ XPath, êîòîðûå ìîãóò
âîçâðàùàòü íå òîëüêî ñåìåéñòâî óçëîâ, íî òàêæå ëîãè÷åñêèå, ñòðîêîâûå è ÷èñëîâûå çíà÷åíèÿ.
Âûðàæåíèÿ XPath ìîãóò ðàáîòàòü íå òîëüêî ñ òåêóùèì óçëîì
èëè äî÷åðíèìè óçëàìè, íî ïîëó÷àòü äîñòóï ê ðîäèòåëüñêèì óçëàì,
óçëàì-ïðåäêàì è äðóãèì óçëàì â ñîîòâåòñòâèè ñ äîïóñòèìûìè îñÿìè (ñì. ðèñ. 3.18.1).
96
Ïðåäèêàòû: ñåìåéñòâî óçëîâ
Ñåìåéñòâî óçëîâ (node set) ïðåäñòàâëÿåò ñîáîé ïðîñòî ñîâîêóïíîñòü óçëîâ (íî ìîæåò ñîñòîÿòü è èç îäíîãî óçëà).
Âûðàæåíèå child::PLANET âîçâðàùàåò ñåìåéñòâî óçëîâ, ñîñòîÿùåå èõ âñåõ ýëåìåíòîâ <PLANET>.
Âûðàæåíèå child::PLANET/child::NAME âîçâðàùàåò ñåìåéñòâî óçëîâ âñåõ ýëåìåíòîâ <NAME>, äî÷åðíèõ ïî îòíîøåíèþ ê ýëåìåíòàì <PLANET>.
Äëÿ âûáîðà óçëà èëè óçëîâ èç ñåìåéñòâà óçëîâ ïðåäîïðåäåëåíû ôóíêöèè äëÿ ðàáîòû ñ ñåìåéñòâàìè óçëîâ â ïðåäèêàòàõ:
• last() âîçâðàùàåò êîëè÷åñòâî óçëîâ â íàáîðå óçëîâ;
• position() âîçâðàùàåò ïîçèöèþ êîíòåêñòíîãî óçëà â êîíòåêñòíîì íàáîðå óçëîâ (èíäåêñ íà÷èíàåòñÿ ñ 1);
• count(node-set) âîçâðàùàåò êîëè÷åñòâî óçëîâ â ñåìåéñòâå.
Åñëè îïóñòèòü ïàðàìåòð node-set, ôóíêöèÿ áóäåò ïðèìåíåíà
ê êîíòåêñòíîìó óçëó;
• id(ID) âîçâðàùàåò ñåìåéñòâî óçëîâ, ñîäåðæàùåå ýëåìåíò ñ
óêàçàííûì çíà÷åíèåì ID, èëè ïóñòîå ñåìåéñòâî óçëîâ. Ìîæíî ïåðå÷èñëèòü íåñêîëüêî èäåíòèôèêàòîðîâ, ðàçäåëåííûõ
ñèìâîëàìè-ðàçäåëèòåëÿìè, òîãäà ôóíêöèÿ âåðíåò ñåìåéñòâî
óçëîâ, ñîñòîÿùåå èç ýëåìåíòîâ ñ óêàçàííûìè èäåíòèôèêàòîðàìè;
• local-name(node-set) âîçâðàùàåò ëîêàëüíîå èìÿ ïåðâîãî óçëà â ñåìåéñòâå óçëîâ Åñëè îïóñòèòü ïàðàìåòð node-set,
ôóíêöèÿ áóäåò ïðèìåíåíà ê êîíòåêñòíîìó óçëó;
• namespace-uri(node-set) âîçâðàùàåò URI ïðîñòðàíñòâà
èìåí ïåðâîãî óçëà â ñåìåéñòâå óçëîâ. Åñëè îïóñòèòü ïàðàìåòð
node-set, ôóíêöèÿ áóäåò ïðèìåíåíà ê êîíòåêñòíîìó óçëó;
• name(node-set) âîçâðàùàåò ïîëíîñòüþ îïðåäåëåííîå èìÿ
ïåðâîãî óçëà â ñåìåéñòâå óçëîâ. Åñëè îïóñòèòü ïàðàìåòð
node-set, ôóíêöèÿ áóäåò ïðèìåíåíà ê êîíòåêñòíîìó óçëó.
Ïðåäèêàòû: ëîãè÷åñêèå çíà÷åíèÿ
97
 âûðàæåíèÿõ XPath ìîæíî òàêæå èñïîëüçîâàòü ëîãè÷åñêèå
çíà÷åíèÿ. Íîëü ïðèíèìàåòñÿ çà ëîæü (false), äðóãèå çíà÷åíèÿ çà
èñòèíó (true). Ïóñòàÿ ñòðîêà ñ÷èòàåòñÿ ëîæüþ, âñå îñòàëüíûå
ñòðîêè èñòèíîé.
Äëÿ ñîçäàíèÿ ëîãè÷åñêèõ âûðàæåíèé ìîæíî ïðèìåíÿòü îïåðàöèè ñðàâíåíèÿ:
• != îçíà÷àåò ¾íå ðàâíî¿;
• < îçíà÷àåò ¾ìåíüøå, ÷åì¿ (â äîêóìåíòàõ XML èëè XSL èñïîëüçóéòå <);
• <= îçíà÷àåò ¾ìåíüøå èëè ðàâíî¿ (â äîêóìåíòàõ XML èëè
XSL èñïîëüçóéòå <=);
• = îçíà÷àåò ¾ðàâíî¿ (ïðîãðàììèñòû íà C, C++, Java è
JavaScript îáðàòèòå âíèìàíèå: ñèìâîëîì ýòîé îïåðàöèè ÿâëÿåòñÿ îäèí çíàê ðàâåíñòâà =, à íå äâà);
• > îçíà÷àåò ¾áîëüøå, ÷åì¿;
• >= îçíà÷àåò ¾áîëüøå èëè ðàâíî¿.
Ëîãè÷åñêèå âûðàæåíèÿ ìîãóò áûòü îïåðàíäàìè ëîãè÷åñêèõ
îïåðàöèé:
• and ëîãè÷åñêîå È;
• or ëîãè÷åñêîå ÈËÈ;
• not ëîãè÷åñêîå îòðèöàíèå HE;
Ïðèìåðû:
<xsl:template match="PLANET[NAME='Earth']">
Ïëàíåòà Çåìëÿ íå íóæäàåòñÿ â ïðåäñòàâëåíèè.
</xsl:template>
<xsl:template match="PLANET[NAME!='Earth']">
<xsl:value-of select="NAME"/>
<xsl:apply-templates select="MASS"/>
<xsl:apply-templates select="RADIUS"/>
98
<xsl:apply-templates select="DAY"/>
</xsl:template>
<xsl:template match="PLANET[position() > 5]">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="PLANET[not(position() = last())]">
<xsl:value-of select="."/>
</xsl:template>
Ïðåäèêàòû: ÷èñëà
 XPath ÷èñëà (è âåùåñòâåííûå, è öåëûå) õðàíÿòñÿ â ôîðìàòå 64-ðàçðÿäíîãî ÷èñëà ñòàíäàðòà IEEE äëÿ ÷èñåë ñ ïëàâàþùåé
òî÷êîé óäâîåííîé òî÷íîñòè.
Íàä ÷èñëàìè ìîæíî âûïîëíÿòü îïåðàöèè:
• + ñëîæåíèÿ;
• - âû÷èòàíèÿ;
• * óìíîæåíèÿ;
• div äåëåíèz;
• mod îñòàòîê îò äåëåíèÿ ïåðâîãî ÷èñëà íà âòîðîå.
Ïðèìåðû:
<xsl:value-of select="180 + 420"/>
<xsl:apply-templates select="PLANET[DAY div MASS > 100]"/>
XPath òàêæå ïîääåðæèâàåò ñëåäóþùèå ôóíêöèè äëÿ ðàáîòû
ñ ÷èñëàìè:
• ceiling() âîçâðàùàåò íàèìåíüøåå öåëîå, áîëüøåå, ÷åì ïåðåäàííîå ôóíêöèè ÷èñëî;
• floor() âîçâðàùàåò íàèáîëüøåå öåëîå, ìåíüøåå, ÷åì ïåðåäàííîå ôóíêöèè ÷èñëî;
99
• round() îêðóãëÿåò ïåðåäàííîå ÷èñëî äî áëèæàéøåãî öåëîãî;
• sum() âîçâðàùàåò ñóììó ïåðåäàííûõ ôóíêöèè ÷èñåë, íàïðèìåð,
<xsl:template match="PLANETS">
<HTML>
<BODY>
Ñðåäíÿÿ ïëàíåòíàÿ ìàññà:
<xsl:value-of select=
"sum(child::PLANET/child::MASS) div
count(child::PLANET)"/>
</BODY>
</HTML>
</xsl:template>
Ïðåäèêàòû: ñòðîêè
 XPath ñòðîêè ôîðìèðóþòñÿ èç ñèìâîëîâ Unicode. Ðÿä ôóíêöèé ñïåöèàëüíî ïðåäíàçíà÷åí äëÿ ðàáîòû ñî ñòðîêàìè:
• string(object1) ïðåîáðàçóåò îáúåêò â ñòðîêó;
• starts-with(string1, string2) âîçâðàùàåò èñòèíó, åñëè
ïåðâàÿ ñòðîêà íà÷èíàåòñÿ ñî âòîðîé ñòðîêè:
<xsl:template match="text()[starts-with(., 'E')]">
<xsl:text>(Íàø ìèð)</xsl:text>
</xsl:template>
• contains(string1, string2) âîçâðàùàåò èñòèíó, åñëè ïåðâàÿ ñòðîêà ñîäåðæèò âòîðóþ ñòðîêó;
• substring(string1, offset, length) âîçâðàùàåò ïîäñòðîêó ñòðîêè string1 äëèíîé length ñèìâîëîâ, íà÷èíàÿ ñî
ñìåùåíèÿ offset;
• substring-before(string1, string2) âîçâðàùàåò ÷àñòü
ñòðîêè string1 äî ïåðâîãî âõîæäåíèÿ ñòðîêè string2;
100
• substring-after(string1, string2) âîçâðàùàåò ÷àñòü
ñòðîêè string1 ïîñëå ïåðâîãî âõîæäåíèÿ string2;
• string-length(string1) âîçâðàùàåò êîëè÷åñòâî ñèìâîëîâ
â ñòðîêå string1;
• normalize-space(string1) âîçâðàùàåò ñòðîêó string1 ïîñëå îòáðàñûâàíèÿ ëèäèðóþùèõ è çàâåðøàþùèõ ñèìâîëîâðàçäåëèòåëåé è çàìåíû íåñêîëüêèõ ïîñëåäîâàòåëüíûõ ðàçäåëèòåëåé íà îäèí ïðîáåë;
• translate(string1, string2, string3) âîçâðàùàåò ñòðîêó string1, â êîòîðîé âñå âõîæäåíèÿ ñèìâîëîâ â ñòðîêå
string2 çàìåíåíû íà ñîîòâåòñòâóþùèå ñèìâîëû â ñòðîêå
string3;
• concat(string1, string2, ...) âîçâðàùàåò êîíêàòåíàöèþ (îáúåäèíåíèå) âñåõ ñòðîê.
• format-number(number1, string1, string2)
(ôóíêöèÿ
XSLT) ïðåîáðàçóåò ÷èñëî number1 â ñòðîêó, èñïîëüçóÿ string1 â êà÷åñòâå ôîðìàòèðóþùåé ñòðîêè (ôîðìàòèðóþùèå ñòðîêè ñîçäàþòñÿ òàê æå, êàê äëÿ ìåòîäà
java.text.DecimalFormat ÿçûêà Java) è string2 êàê âîçìîæíóþ ñòðîêó ëîêàëèçàöèè.
Ñîêðàùåííûé ñèíòàêñèñ ïðåäèêàòîâ
Âûðàæåíèÿ
ïðåäèêàòîâ
ìîæíî
ñîêðàùàòü,
îïóñêàÿ
position()=.
Íàïðèìåð,
[position() = 3]
ñòàíîâèòñÿ
`verb"[3]“ ', [position() = last()] ñòàíîâèòñÿ [last()], è
ò. ä.
Ïðèìåðû:
• PLANET[2] âîçâðàùàåò âòîðîãî ðåáåíêà <PLANET> êîíòåêñòíîãî óçëà;
• PLANET[last()] âîçâðàùàåò ïîñëåäíåãî ðåáåíêà <PLANET>
êîíòåêñòíîãî óçëà;
• /PLANETS/PLANET[2]/NAME[1] âîçâðàùàåò ïåðâûé ýëåìåíò <NAME> âòîðîãî ýëåìåíòà <PLANET> ýëåìåíòà <PLANETS>;
101
• PLANET[5][@UNITS = "million miles"]
âîçâðàùàåò ïÿòîãî ðåáåíêà <PLANET> êîíòåêñòíîãî óçëà, òîëüêî åñëè ó íåãî èìååòñÿ àòðèáóò UNITS ñî çíà÷åíèåì
million miles. Ýòî âûðàæåíèå ìîæíî òàêæå çàïèñàòü
êàê PLANET[@UNITS = "million miles"][5].
Ÿ20. Âûáîð ïî ID
 äîïîëíåíèå ê ñîçäàíèþ îáðàçöîâ èç îáðàçöîâ øàãà, çàäàþùèõ îñü, óñëîâèå óçëà è ïðåäèêàò, ìîæíî ïðèìåíÿòü è ôóíêöèþ
id() äëÿ âûáîðà ýëåìåíòîâ ñ îïðåäåëåííûì çíà÷åíèåì àòðèáóòà
òèïà ID. Äëÿ ðàáîòû ñ ýòîé ôóíêöèåé íåîáõîäèìî èìåòü ýëåìåíòû
ñ ñîîòâåòñòâóþùèìè ñòðèáóòàìè, ÷òî ìîæíî ñäåëàòü â DTD èëè
XML-ñõåìå äîêóìåíòà:
<xsl:template match = "id('favorite')''>
<H3><xsl:value-of select="."/></H3>
</xsl:template>
Ÿ21. Âûáîð ïî êëþ÷ó
Êëþ÷è äàþò ïðîñòîé ñïîñîá èäåíòèôèöèðîâàòü ýëåìåíòû.
Êîíêðåòíûå êëþ÷è ìîæíî âûáðàòü ïðè ïîìîùè ôóíêöèè key().
Äëÿ ñîçäàíèÿ êëþ÷à ñëóæèò ýëåìåíò <xsl:key>. Ýòî ýëåìåíò
âåðõíåãî óðîâíÿ, ïîýòîìó îí èñïîëüçóåòñÿ âíå øàáëîíîâ è êàê äî÷åðíèé ýëåìåíò <xsl:stylesheet>.
Ñîçäàäèì, íàïðèìåð, êëþ÷ ñ èìåíåì COLOR, êîòîðûé âûáèðàåò
ýëåìåíòû <PLANET>, ïðîâåðÿÿ èõ àòðèáóò COLOR:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="COLOR" match="PLANET" use="@COLOR"/>
. . .
Âûáîð ýëåìåíòà <PLANET>, ó êîòîðîãî àòðèáóò COLOR èìååò
çíà÷åíèå BLUE ïðè ïîìîùè ôóíêöèè key() î÷åâèäåí:
<xsl:template match="/PLANETS">
102
<HTML>
<xsl:apply-templates select="key('COLOR', 'BLUE')"/>
</HTML>
</xsl:template>
Ÿ22. Ïðèìåíåíèå îïåðàöèè ÈËÈ
Ïðè ïîìîùè îïåðàöèè ÈËÈ, çàäàþùåéñÿ ñèìâîëîì |, ìîæíî îñóùåñòâëÿòü âûáîð ïî íåñêîëüêèì âîçìîæíûì îáðàçöàì, ÷òî
î÷åíü óäîáíî ñ ðîñòîì ñëîæíîñòè äîêóìåíòîâ:
<xsl:template match="NAME | MASS">
<B>
<xsl:apply-templates/>
</B>
</xsl:template>
Îïåðàöèþ | ìîæíî ïðèìåíÿòü ê ëþáûì äîïóñòèìûì îáðàçöàì, íàïðèìåð, PLANET | PLANET//NAME.
Ìîæíî èñïîëüçîâàòü íåñêîëüêî îïåðàöèé |, íàïðèìåð,
NAME | MASS | DAY.
Ÿ23. Ïðèìåðû îáðàçöîâ ñ ïðåäèêàòàìè
Ïðåäïîëîæèì, ÷òî òðåáóåòñÿ ïðåîáðàçîâàòü planets.xml â
planets.html, íî ñîõðàíèòü òîëüêî ïåðâóþ ïëàíåòó, Ìåðêóðèé. Ýòî
ìîæíî ñäåëàòü ïðè ïîìîùè ïðåäèêàòà [position() < 2]. ×òîáû
óáðàòü èç planets.xml äðóãèå ýëåìåíòû, äëÿ íèõ íóæíî çàäàòü ïóñòîé øàáëîí, ÷òî ìîæíî ñäåëàòü ïðè ïîìîùè ïðåäèêàòà [position()
>= 2]:
<xsl:template match="PLANET[position() < 2]">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
103
<xsl:template match="PLANET[position() >= 2]">
</xsl:template>
Êàê âûáðàòü òîëüêî ýëåìåíòû, èìåþùèå îáà àòðèáóòà, COLOR è POPULATED? Ìîæíî ïðèìåíèòü ïðåäèêàò
[@COLOR and @POPULATED]. Äëÿ óäàëåíèÿ äðóãèõ ýëåìåíòîâ
èç ðåçóëüòèðóþùåãî äîêóìåíòà ìîæíî ïðèìåíèòü ïðåäèêàò
[not(@COLOR) or not(@POPULATED)]:
<xsl:template match="PLANET[@COLOR and @POPULATED]">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
<xsl:template match="PLANET[not(@COLOR) or not(@POPULATED)]">
</xsl:template>
Ñêîïèðîâàòü planets.xml â íîâûé XML-äîêóìåíò è èçìåíèòü
òåêñò â ýëåìåíòå <NAME> ïëàíåòû Âåíåð íà ¾Ïëàíåòà ëþáâè.¿:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="NAME[text() = 'Venus']">
<NAME>
Ïëàíåòà ëþáâè.
</NAME>
</xsl:template>
Õîòÿ ýëåìåíòû <NAME> óäîâëåòâîðÿþò îáîèì ïðàâèëàì ýòîé òàáëèöû ñòèëåé, ïðàâèëî ñ îáðàçöîì NAME[text() = 'Venus'] îñóùåñòâëÿåò áîëåå óçêèé âûáîð, ïîýòîìó äëÿ ýëåìåíòà <NAME> Âåíåðû ïðîöåññîð XSLT ïðèìåíèò åãî.
 äåéñòâèòåëüíîñòè, â âûðàæåíèÿõ XPath ìîæíî ññûëàòüñÿ íà
êîíòåêñòíûé óçåë ïðè ïîìîùè ñèìâîëà ., è çíà÷åíèåì ïî óìîë÷à104
íèþ äëÿ óçëà ÿâëÿåòñÿ åãî òåêñò, ïîýòîìó ïîñëåäíåå ïðàâèëî ìîæíî
çàìåíèòü íà:
<xsl:template match="NAME[. = 'Venus']">
<NAME>
Ïëàíåòà ëþáâè.
</NAME>
</xsl:template>
Ïðèìåðû îáðàçöîâ âûáîðà
Íèæå ïðèâåäåíû ïðèìåðû îáðàçöîâ âûáîðà íà îñíîâå äîêóìåíòà planets.xml:
• PLANET âûáèðàåò äî÷åðíèå ýëåìåíòû <PLANET> êîíòåêñòíîãî
óçëà;
• /PLANETS âûáèðàåò êîðíåâîé ýëåìåíò äîêóìåíòà;
• * âûáèðàåò âñå äî÷åðíèå ýëåìåíòû êîíòåêñòíîãî óçëà;
• PLANET[3] âûáèðàåò òðåòüåãî ðåáåíêà <PLANET> êîíòåêñòíîãî
óçëà;
• PLANET[last()] âûáèðàåò ïîñëåäíåãî ðåáåíêà <PLANET> êîíòåêñòíîãî óçëà;
• PLANET[NAME] âûáèðàåò äåòåé <PLANET> êîíòåêñòíîãî óçëà,
èìåþùèõ äåòåé <NAME>;
• PLANET[DISTANCE]/NAME âûáèðàåò âñå ýëåìåíòû <NAME> ýëåìåíòîâ <PLANET>, ñîäåðæàùèõ ïî êðàéíåé ìåðå îäèí ýëåìåíò
<DISTANCE>;
• PLANET[DISTANCE]/PLANET[DAY] âûáèðàåò âñå ýëåìåíòû
<PLANET> ýëåìåíòîâ <PLANET>, â êîòîðûõ ýëåìåíò <PLANET>
ñîäåðæèò ïî êðàéíåé ìåðå îäèí ýëåìåíò <DISTANCE>, è
ýëåìåíò <PLANET> ñîäåðæèò ïî êðàéíåé ìåðå îäèí ýëåìåíò
<DAY>;
• PLANETS[PLANET/DAY] âûáèðàåò âñå ýëåìåíòû <PLANETS>, ñîäåðæàùèå ýëåìåíòû <PLANET> ñ êàê ìèíèìóì îäíèì ýëåìåíòîì <DAY>;
105
• PLANET[DISTANCE][NAME] âûáèðàåò âñå ýëåìåíòû <PLANET>,
èìåþùèå ýëåìåíòû <DISTANCE> è <NAME>;
• PLANETS/PLANET[last()] âûáèðàåò ïîñëåäíèé
<PLANET> â êàæäîì ýëåìåíòå <PLANETS>;
ýëåìåíò
• */PLANET âûáèðàåò âñåõ âíóêîâ <PLANET> êîíòåêñòíîãî óçëà;
• /PLANETS/PLANET[3]/NAME[2] âûáèðàåò âòîðîé ýëåìåíò
<NAME> òðåòüåãî ýëåìåíòà <PLANET> ýëåìåíòà <PLANETS>;
• //PLANET âûáèðàåò âñåõ ïîòîìêîâ <PLANET> êîðíÿ äîêóìåíòà;
• PLANETS//PLANET âûáèðàåò ïîòîìêîâ ýëåìåíòà <PLANET> äåòåé ýëåìåíòà <PLANETS> êîíòåêñòíîãî óçëà;
• //PLANET/NAME âûáèðàåò âñå ýëåìåíòû <NAME>, äî÷åðíèå ïî
îòíîøåíèþ ê ðîäèòåëþ <PLANET>;
• PLANETS//PLANET/DISTANCE//PERIHELION âûáèðàåò ýëåìåíòû
<PERIHELION> âåçäå âíóòðè ýëåìåíòà <DISTANCE> ýëåìåíòà
<PLANET>, âåçäå âíóòðè ýëåìåíòà <PLANETS>;
• @UNITS âûáèðàåò àòðèáóò UNITS êîíòåêñòíîãî óçëà;
• @* âûáèðàåò âñå àòðèáóòû êîíòåêñòíîãî óçëà;
• *[@UNITS] âûáèðàåò âñå ýëåìåíòû ñ àòðèáóòîì UNITS;
• DENSITY/@UNITS
<DENSITY>;
âûáèðàåò
àòðèáóò
UNITS â ýëåìåíòàõ
• PLANET[not(@COLOR) or not(@SIZE)] âûáèðàåò ýëåìåíòû
<PLANET>, íå èìåþùèå îáîèõ àòðèáóòîâ COLOR è SIZE;
• PLANETS[@STAR="Sun"]//DENSITY âûáèðàåò ëþáîé ýëåìåíò
<DENSITY> ñ ýëåìåíòîì-ïðåäêîì <PLANETS>, èìåþùèì àòðèáóò STAR ñî çíà÷åíèåì Sun
• PLANET[NAME="Venus"] âûáèðàåò äåòåé <PLANET> êîíòåêñòíîãî óçëà, èìåþùèõ äåòåé <NAME> ñ òåêñòîì Venus;
• PLANET[NAME[1]="Venus"] âûáèðàåò âñå ýëåìåíòû <PLANET>, ó
êîòîðûõ â ïåðâîì ýëåìåíòå <NAME> ñîäåðæèòñÿ òåêñò Venus;
106
• PLANET[@UNITS !="million miles"] âûáèðàåò âñå ýëåìåíòû
<PLANET>, àòðèáóò UNITS êîòîðûõ íå ðàâåí million miles;
• PLANET[@UNITS ="days"] âûáèðàåò âñåõ äåòåé <PLANET> êîíòåêñòíîãî óçëà, èìåþùèõ àòðèáóò UNITS ñî çíà÷åíèåì days;
• PLANET[6][@UNITS = "days"] âûáèðàåò øåñòîãî ðåáåíêà
<PLANET> êîíòåêñòíîãî óçëà, òîëüêî åñëè ó ýòîãî ðåáåíêà åñòü
àòðèáóò UNITS ñî çíà÷åíèåì days; ÷òî òàêæå ìîæíî çàïèñàòü
êàê PLANET[@UNITS = "days"][6];
• PLANET[@COLOR and @UNITS] âûáèðàåò âñåõ äåòåé <PLANET>
êîíòåêñòíîãî óçëà, èìåþùèõ îáà àòðèáóòà COLOR è UNITS;
• *[1][NAME] âûáèðàåò ëþáîé ýëåìåíò <NAME>, ÿâëÿþùèéñÿ
ïåðâûì ðåáåíêîì ñâîåãî ðîäèòåëÿ;
• *[position() < 5] âûáèðàåò ïåðâûõ ïÿòåðûõ äåòåé êîíòåêñòíîãî óçëà;
• *[position() < 5][@UNIT] âûáèðàåò ïåðâûõ ïÿòåðûõ äåòåé êîíòåêñòíîãî óçëà ñ àòðèáóòîì UNITS;
• text() âûáèðàåò âñå äî÷åðíèå òåêñòîâûå óçëû êîíòåêñòíîãî
óçëà;
• text()[starts-with(;, "In the course of human events")]
âûáèðàåò âñå äî÷åðíèå òåêñòîâûå óçëû êîíòåêñòíîãî óçëà,
íà÷èíàþùèåñÿ ñ In the course of human events;
• /PLANET[UNITS = "million miles"]@ âûáèðàåò âñå ýëåìåíòû <PLANET>, ó êîòîðûõ çíà÷åíèå àòðèáóòà UNITS ðàâíî
million miles;
• PLANET[/PLANETS/@UNITS = @REFERENCE] âûáèðàåò âñå ýëåìåíòû <PLANET>, ó êîòîðûõ çíà÷åíèå àòðèáóòà REFERENCE òàêîå æå, êàê çíà÷åíèå àòðèáóòà UNITS ýëåìåíòà <PLANETS> â
êîðíå äîêóìåíòà;
• PLANET/* âûáèðàåò
<PLANET>;
âñå
äî÷åðíèå
107
ýëåìåíòû
ýëåìåíòîâ
• PLANET/*/DAY âûáèðàåò âñå ýëåìåíòû <DAY> ïðàâíóêîâ ýëåìåíòîâ <PLANET>, ÿâëÿþùèõñÿ äåòüìè êîíòåêñòíîãî óçëà;
• */* âûáèðàåò ýëåìåíòîâ-âíóêîâ òåêóùåãî ýëåìåíòà;
• astrophysics:PLANET âûáèðàåò ýëåìåíò <PLANET> â ïðîñòðàíñòâå èìåí astrophysics;
• astrophysics:* âûáèðàåò ëþáûå ýëåìåíòû â ïðîñòðàíñòâå
èìåí astrophysics;
• PLANET[DAY and DENSITY] âûáèðàåò âñå ýëåìåíòû <PLANET>,
ó êîòîðûõ åñòü ïî êðàéíåé ìåðå îäèí ýëåìåíò <DAY> è îäèí
ýëåìåíò <DENSITY>;
• PLANET[(DAY or DENSITY) and MASS] âûáèðàåò âñå ýëåìåíòû
<PLANET>, ó êîòîðûõ åñòü ïî êðàéíåé ìåðå îäèí ýëåìåíò <DAY>
èëè îäèí ýëåìåíò <DENSITY>, à òàêæå ïî êðàéíåé ìåðå îäèí
ýëåìåíò <MASS>;
• PLANET[DAY and not(DISTANCE)] âûáèðàåò âñå ýëåìåíòû
<PLANET>, ó êîòîðûõ åñòü ïî êðàéíåé ìåðå îäèí ýëåìåíò <DAY>
è íåò ýëåìåíòîâ <DISTANCE>;
• PLANET[MASS = /STANDARD/REFERENCE/MASS] âûáèðàåò âñå
ýëåìåíòû <PLANET>, ó êîòîðûõ çíà÷åíèå ýëåìåíòà <MASS> ðàâíî çíà÷åíèþ ýëåìåíòà /<STANDARD>/<REFERENCE>/<MASS>.
Ÿ24. Èçìåíåíèå ñòðóêòóðû äîêóìåíòà íà îñíîâå âõîäíûõ
äàííûõ
Äî ñèõ ïîð íàøè øàáëîíû ñîçäàâàëèñü íà îñíîâå çàðàíåå îïðåäåëåííûõ ïðàâèëàõ, òî÷íî çàäàþùèõ, ÷òî äîëæíî ïîïàñòü â âûõîäíîé äîêóìåíò è â êàêîì ïîðÿäêå. Íî ïðè ïîìîùè òàêèõ ýëåìåíòîâ XSLT, êàê <xsl:element>, <xsl:attribute>, <xsl:text> è ò. ä.
ìîæíî ñîçäàâàòü íîâûå óçëû íà ëåòó, íà îñíîâå äàííûõ âõîäíîãî
äîêóìåíòà.
Ñîçäàíèå íîâûõ ýëåìåíòîâ íà ýòàïå âûïîëíåíèÿ
Ýëåìåíò <xsl:element> ñîçäàåò íîâûé ýëåìåíò íà ýòàïå âûïîëíåíèÿ. Ó ýòîãî ýëåìåíòà òðè àòðèáóòà:
108
• name (îáÿçàòåëüíûé). Èìÿ ñîçäàâàåìîãî ýëåìåíòà. Ïðèíèìàåò
çíà÷åíèå øàáëîíà çíà÷åíèé àòðèáóòà, âîçâðàùàþùåãî QName;
• namespace (íåîáÿçàòåëüíûé). URI ïðîñòðàíñòâà èìåí íîâîãî
ýëåìåíòà. Ïðèíèìàåò çíà÷åíèå øàáëîíà çíà÷åíèé àòðèáóòà,
âîçâðàùàþùåãî URI;
• use-attribute-sets (íåîáÿçàòåëüíûé). Çàäàåò ñåìåéñòâî
àòðèáóòîâ, ñîäåðæàùèõ àòðèáóòû ýòîãî ýëåìåíòà. Ïðèíèìàåò çíà÷åíèå ñïèñêà QName, ðàçäåëåííûõ ñèìâîëàìèðàçäåëèòåëÿìè.
Ýëåìåíò <xsl:element> ñîäåðæèò òåëî øàáëîíà.
Ïðèìåð: ñîçäàòü âìåñòî ýëåìåíòà <PLANET> ýëåìåíò ñ èìåíåì
ðàâíûì àòðèáóòó NAME è ñîäåðæàùèì âñå, ÷òî íàõîäèòñÿ â èñõîäíîì
ýëåìåíòå <PLANET>:
<xsl:output method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PLANET">
<xsl:element name="{@NAME}}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Ñîçäàíèå íîâûõ àòðèáóòîâ
Ïðè ïîìîùè ýëåìåíòà <xsl:attribute> ìîæíî ñîçäàâàòü
àòðèáóòû íà ýòàïå âûïîëíåíèÿ. Ó ýëåìåíòà äâà àòðèáóòà:
• name (îáÿçàòåëüíûé). Èìÿ íîâîãî àòðèáóòà. Ïðèíèìàåò çíà÷åíèå øàáëîíà çíà÷åíèé àòðèáóòà, âîçâðàùàþùåãî QName;
• namespace (íåîáÿçàòåëüíûé). Ïðîñòðàíñòâî èìåí íîâîãî àòðèáóòà. Óñòàíàâëèâàåòñÿ â URI.
109
Ýòîò ýëåìåíò ñîäåðæèò â ñåáå òåëî øàáëîíà, êîòîðîå óñòàíàâëèâàåò çíà÷åíèå àòðèáóòà.
Ïðèìåð: ñîçäàòü íîâûå ýëåìåíòû <PLANET> ñ àòðèáóòàìè, êîòîðûå ñîîòâåòñòâóþò ðàçëè÷íûì íàçâàíèÿì ïëàíåò, çíà÷åíèÿ áåðóòñÿ èç àòðèáóòà COLOR èñõîäíûõ ýëåìåíòîâ <PLANET>:
<xsl:template match="PLANET">
<PLANET>
<xsl:attribute name="{NAME}">
<xsl:value-of select="@COLOR"/>
</xsl:attribute>
</PLANET>
</xsl:template>
Ÿ25. Ñîçäàíèå è èñïîëüçîâàíèå ïåðåìåííûõ
Äëÿ ñîçäàíèÿ ïåðåìåííûõ â XSLT ñëóæèò
<xsl:variable>, îáëàäàþùèé ñëåäóþùèìè àòðèáóòàìè:
ýëåìåíò
• name (îáÿçàòåëüíûé). Èìÿ ïåðåìåííîé, óñòàíàâëèâàåòñÿ â
QName;
• select (íåîáÿçàòåëüíûé). Âûðàæåíèå XPath, çàäàþùåå çíà÷åíèå ïåðåìåííîé. Åñëè îïóñòèòü ýòîò àòðèáóò, çíà÷åíèå ïåðåìåííîé áóäåò îïðåäåëÿòüñÿ ñîäåðæèìûì <xsl:variable>.
Ýòîò ýëåìåíò ìîæåò áûòü ëèáî ýëåìåíòîì âåðõíåãî óðîâíÿ,
ëèáî ïðèìåíÿòüñÿ âíóòðè òåëà øàáëîíà.
Ýëåìåíò ìîæåò ñàì ñîäåðæàòü òåëî øàáëîíà, íî â òàêîì ñëó÷àå íåëüçÿ èñïîëüçîâàòü àòðèáóò select.
Ïðèìåðû ñîçäàíèÿ ïåðåìåííûõ:
<xsl:variable name="number_books" select="255"/>
<xsl:variable name="sandwich" select="'turkey'"/>
Ïîëó÷èòü çíà÷åíèå ïåðåìåííîé ìîæíî, äîáàâèâ ê åå èìåíè
ïðåôèêñ $:
110
<xsl:variable name="number_books" select="255"/>
<xsl:text>Â ìîåé áèáëèîòåêå </xsl:text>
<xsl:value-of select="$number_books"/>
<xsl:text> êíèã.</xsl:text>
Îáëàñòü âèäèìîñòè ïåðåìåííîé
Ïåðåìåííûå, ñîçäàííûå â ýëåìåíòàõ <xsl:variable> âûñîêîãî
óðîâíÿ, îáëàäàþò ãëîáàëüíîé îáëàñòüþ âèäèìîñòè, ñîçäàííûå â
òåëàõ øàáëîíà ëîêàëüíîé.
Îáëàñòüþ âèäèìîñòè ãëîáàëüíîé ïåðåìåííîé ÿâëÿåòñÿ âñÿ òàáëèöà ñòèëåé, âêëþ÷àÿ èìïîðòèðîâàííûå èëè âêëþ÷åííûå òàáëèöû
ñòèëåé. Ýòî îçíà÷àåò, ÷òî ïåðåìåííàÿ äîñòóïíà â ëþáîì ìåñòå òàáëèöû ñòèëåé, åñëè òîëüêî îíà íå áóäåò ïåðåêðûòà ëîêàëüíîé ïåðåìåííîé ñ òåì æå èìåíåì. Ìîæíî äàæå îáðàùàòüñÿ ê ãëîáàëüíîé
ïåðåìåííîé äî åå îáúÿâëåíèÿ. Îäíàêî íåëüçÿ ñîçäàâàòü öèêëè÷åñêèå ññûëêè, òî åñòü åñëè âû îáúÿâèëè a ÷åðåç b, íåëüçÿ îáúÿâëÿòü
b ÷åðåç a.
Îáëàñòü âèäèìîñòè ëîêàëüíîé ïåðåìåííîé îãðàíè÷åíà ñëåäóþùèìè çà íåé áðàòüÿìè, èëè ïîòîìêàìè ïîñëåäóþùèõ áðàòüåâ. Â
÷àñòíîñòè ýòî çíà÷èò, ÷òî åñëè âû îáúÿâèëè ïåðåìåííóþ âíóòðè
òàêèõ ýëåìåíòîâ, êàê <xsl:choose>, <xsl:if> èëè <xsl:for-each>,
îíà íå áóäåò äîñòóïíà âíå ýòèõ ýëåìåíòîâ.
Ïðèìåðû èñïîëüçîâàíèÿ ïåðåìåííîé
<xsl:variable name="copyright"
select="'(c)2007 ÑÏáÃÓ'"/>
<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="copyright">
<xsl:value-of select="$copyright"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="PLANETS">
<xsl:for-each select="PLANET">
111
<xsl:element name="{NAME}">
<xsl:variable name="contextnode" select="."/>
<xsl:for-each select="//PLANET">
<xsl:if test=". != $contextnode">
<xsl:element name="SIBLINGPLANET">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
112
ËÈÒÅÐÀÒÓÐÀ
1. Extensible Markup Language (XML) 1.0 (Third Edition).
http://www.w3.org/TR/2004/REC-xml-20040204
2. Õîëçíåð Ñ. XML. Ýíöèêëîïåäèÿ, 2-å èçä. ÑÏá.: Ïèòåð, 2004.
1101 ñ.
3. Charles F. Goldfarb, Paul Prescod Charles F. Goldfarb's XML
Handbook, 4th ed. Prentice Hall, 2002. 1147 p.
4. XSL
Transformations
(XSLT)
Version
1.0
http://www.w3.org/TR/1999/REC-xslt-19991116
5. XML
Path
Language
(XPath)
Version
1.0
http://www.w3.org/TR/1999/REC-xpath-19991116
6. Õîëçíåð Ñ. XSLT. Áèáëèîòåêà ïðîãðàììèñòà. ÑÏá.: Ïèòåð,
2002. 544 ñ.
7. G. Ken Holman Denitive XSLT and XPath. Prentice Hall,
2002. 373 p.
113
ÎÃËÀÂËÅÍÈÅ
Ãëàâà 1. Ðàñøèðÿåìûé ÿçûê ðàçìåòêè XML . . . . . . . . . . .
3
Ÿ 1.
Ÿ 2.
Ÿ 3.
Ÿ 4.
Ÿ 5.
Ÿ 6.
Ÿ 7.
Ÿ 8.
Ÿ 9.
Îáðàáîòêà òåêñòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Íà ïóòè ê XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
Ïðîñòîé XML-äîêóìåíò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
Èçâåñòíûå ñëîâàðè XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Ëîãè÷åñêàÿ è ôèçè÷åñêàÿ ñòðóêòóðû . . . . . . . . . . . . . . . . . . . 18
Êîìïîíåíòû XML-äîêóìåíòà . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Ôîðìàëüíàÿ êîððåêòíîñòü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Ïðîñòðàíñòâà èìåí XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Îïðåäåëåíèå DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Ãëàâà 2. Îáúåêòíàÿ ìîäåëü XMLDOM . . . . . . . . . . . . . . . . . 40
Ÿ 1. Óçëû îáúåêòíîé ìîäåëè DOM . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Ÿ 2. Ïåðåìåùåíèå ïî îáúåêòíîé ìîäåëè . . . . . . . . . . . . . . . . . . . . . 44
Ÿ 3. Ñîçäàíèå/èçìåíåíèå ñòðóêòóðû îáúåêòíîé ìîäåëè äîêóìåíòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ãëàâà 3. XSL-ñïåöèôèêàöèè . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 1. Ïðèìåíåíèå XSL-ïðåîáðàçîâàíèÿ ê XML-äîêóìåíòó . . . . .
Ÿ 2. XSLT-ïðåîáðàçîâàíèÿ â MS IE 6.0 è âûøå . . . . . . . . . . . . . .
Ÿ 3. Äåðåâüÿ è óçëû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 4. Ýëåìåíòû XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 5. Øàáëîí ïðåîáðàçîâàíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 6. Âûáîð ìåòîäà âûâîäà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 7. Âñòàâêà òàáëèöû ñòèëåé â äðóãóþ . . . . . . . . . . . . . . . . . . . . . .
Ÿ 8. Î øàáëîíàõ ïîäðîáíåå . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ 9. ×òåíèå çíà÷åíèé àòðèáóòîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ10. Ñîçäàíèå àòðèáóòîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ÿ11. Îáðàáîòêà ïðîáåëüíûõ ñèìâîëîâ . . . . . . . . . . . . . . . . . . . . . . .
Ÿ12. Ïðàâèëà ïî óìîë÷àíèþ â øàáëîíå . . . . . . . . . . . . . . . . . . . . . .
Ÿ13. Êîïèðîâàíèå óçëîâ â âûõîäíîé äîêóìåíò . . . . . . . . . . . . . . .
Ÿ14. Ïðèíÿòèå ðåøåíèé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
114
47
55
55
56
59
62
64
69
70
71
73
74
75
76
78
79
Ÿ15.
Ÿ16.
Ÿ17.
Ÿ18.
Ÿ19.
Ÿ20.
Ÿ21.
Ÿ22.
Ÿ23.
Ñîðòèðîâêà äàííûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Íóìåðàöèÿ â âûõîäíîì äîêóìåíòå . . . . . . . . . . . . . . . . . . . . . .
Ýëåìåíò <xsl:message> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Îáðàçöû âûáîðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ñîçäàíèå ïðåäèêàòîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Âûáîð ïî ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Âûáîð ïî êëþ÷ó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ïðèìåíåíèå îïåðàöèè ÈËÈ . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ïðèìåðû îáðàçöîâ ñ ïðåäèêàòàìè . . . . . . . . . . . . . . . . . . . . . .
83
85
89
89
96
102
102
103
103
Ÿ24. Èçìåíåíèå ñòðóêòóðû äîêóìåíòà íà îñíîâå âõîäíûõ äàííûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Ÿ25. Ñîçäàíèå è èñïîëüçîâàíèå ïåðåìåííûõ . . . . . . . . . . . . . . . . . 110
Ëèòåðàòóðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
115
Скачать