ÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ Ôàêóëüòåò ïðèêëàäíîé ìàòåìàòèêè ïðîöåññîâ óïðàâëåíèÿ À. Â. ÌÀÒÐÎÑΠÒÅÕÍÎËÎÃÈÈ ÐÀÇÐÀÁÎÒÊÈ ÈÍÒÅÐÍÅÒ-ÏÐÈËÎÆÅÍÈÉ ×ÀÑÒÜ 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, "&lt;") errorString = errorString.replace(/\>/g, "&gt;") 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>&InvisibleTimes;</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>&InvisibleTimes;</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 &amp; äëÿ & &lt; äëÿ < &gt; äëÿ > &apos; äëÿ ' &quot; äëÿ " • Çàêëþ÷àòü â êàâû÷êè èëè àïîñòðîôû çíà÷åíèÿ àòðèáóòîâ. ÑÎÂÅÒ Åñëè â ñèìâîëüíûõ äàííûõ ñëèøêîì ìíîãî ñèìâîëîâ ðàçìåòêè, òî èñïîëüçóéòå ñåêöèþ ñèìâîëüíûõ äàííûõ 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 ïðåäîïðåäåëåíû ïÿòü ñèìâîëüíûõ ñóùíîñòåé (ññûëîê íà ñèìâîëû): &lt;, &gt;, &amp;, &quot; è &apos;. Îáùèå ñóùíîñòè Âíóòðåííèå ãî ýëåìåíòà: ñóùíîñòè çàäàþòñÿ â 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 (íåîáÿçàòåëüíûé) Îïðåäåëÿåò ðåæèì çàìåíû ñèìâîëîâ ðàçìåòêè ¾>¿, ¾<¿, ¾"¿, ¾'¿ è ¾&¿ íà ñèìâîëüíûå ññûëêè ¾&gt;¿, ¾&lt;¿, ¾&quot;¿, ¾&apos;¿ è ¾&amp;¿. Çíà÷åíèå ýòîãî àòðèáóòà 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> &lt;&lt;</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>&gt;&gt; </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 èñïîëüçóéòå &lt;); • <= îçíà÷àåò ¾ìåíüøå èëè ðàâíî¿ (â äîêóìåíòàõ XML èëè XSL èñïîëüçóéòå &lt;=); • = îçíà÷àåò ¾ðàâíî¿ (ïðîãðàììèñòû íà 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() &lt; 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() &lt; 5] âûáèðàåò ïåðâûõ ïÿòåðûõ äåòåé êîíòåêñòíîãî óçëà; • *[position() &lt; 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