340 likes | 544 Views
Изобразяване на XML документи -XSL. XSL (eXtensible Stylesheet Language). За извеждане на XML документи е необходим механизъм за описание на начина на извеждане. Един такъв механизъм е XSL (e X tensible S tylesheet L anguage) . XSL – Повече от стилова страница
E N D
XSL (eXtensible Stylesheet Language) • За извеждане на XML документи е необходим механизъм за описание на начина на извеждане. • Един такъв механизъм е XSL (eXtensible Stylesheet Language). • XSL – Повече от стилова страница • XSL се състои от две части: • Метод за трансформиране на XML документи • Метод за форматиране на XML документи • XSLе език, който може да трансформира XML в HTML, да филтрира и сортира XML данни, както и да ги форматира, на базата на стойностите им. • XSL трансформира XML файла във формат, разпознаваем от браузера (HTML). XSL трансформира всеки XML елемент в HTML елемент, като може да добавя нови елементи или да премахва такива, да пренарежда и сортира и т.н.
XSL (eXtensible Stylesheet Language) Трансформиране на XML в HTML XML документ <?xml version="1.0" encoding="ISO8859-1" ?> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> . . . </CATALOG>
XSL (eXtensible Stylesheet Language) Трансформиране на XML в HTML <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="CATALOG/CD"> <tr> <td><xsl:value-of select="TITLE"/></td> <td><xsl:value-of select="ARTIST"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> XSL документкато HTML темплейт
XSL (eXtensible Stylesheet Language) Трансформиране на XML в HTML • Елементътxsl:for-eachлокализира елементите в XML документа и повтаря темплейта за всеки един. • Атрибутselectописва елемента.Синтаксисът му се нарича XSL Patternи действа като навигатор (/ - избира поддиректория). • Елементът xsl:value-ofизбира childв йерархията и вмъква съдържанието му в темплейта. • XSLстиловата страница е XMLфайл (елемент xsl:stylesheetопределя документа като стилова страница). • Темплейтът се намира вxsl:template match="/", което определя, че това е темплейт, който съответства на корена (/) на XML.
XSL (eXtensible Stylesheet Language) Трансформиране на XML в HTML • Ако в оригиналния XML документ се добави указване към така създадената стилова страница, браузерът ще трансформира XML документа в HTML. <?xml version="1.0" encoding="ISO8859-1" ?> <?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> . . . </CATALOG> Резултат TITLE ARTIST . . . . . .
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за клиент • Освен разгледаният начин за трансформиране на XML документ в HTML чрез добавяне на XSL стилова страница към XML файла и оставяне браузера да направи трансформацията, има по-гъвкаво решение чрез използването на JavaScript. • Това решение позволява: • Да се използват различни стилови страници в зависимост от браузер и потребителски нужди. • Разрешава се да се извърши специфичното за браузера тестване.
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за клиент • Файловете XML и XSL са същите (които бяха разгледани), но нито в XML, нито в XSL има указване към другия. • Следователно XML файлът може да се трансформира с използване на много различни XSL файлове. Зареждане на XML <html> <body> <script language="javascript"> var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog.xsl") document.write(xml.transformNode(xsl)) </script> </body> </html> Зареждане на XSL Трансформиране на XML чрез XSL и запис на резултата в HTML
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за клиент • Първият блок създава обект на Microsoft XML parser (XMLDOM) и зарежда XML документа в паметта. • Вторият блоксъздава друг обект на парсера и зарежда XSL документа в паметта. • Последният (трети блок) трансформира XML документа, използвайки XSL документа и записва резултата в HTML документ.
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за сървър • Показано беше как JavaScript използваuse XML парсер за трансформацията. Това решение няма да е валидно за браузер, който не подържа XML парсер. • За да може XML данните да се ползват от всички видове браузери, трябва да се трансформира XML документа на сървъра и да се изпрати като HTML към браузера. • Една от целите на проектирането на XSL е била да направи възможна трансформацията на данни от един формат в друг на сървъра и връщане на читаеми данни към всички видове браузери. • XSL трансформацията на сървъра е една от важните части на Internet Information Server за бъдещето.
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за сървър • Използват се същите XML и XSL файлове, но в нито един от тях няма указване към другия. Трансформиране на XML в HTML от страна на сървъра <% 'Load the XML set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(Server.MapPath("cd_catalog.xml")) 'Load the XSL set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.async = false xsl.load(Server.MapPath("cd_catalog.xsl")) Response.Write(xml.transformNode(xsl)) %>
XSL (eXtensible Stylesheet Language) Парсер за трансформиране на XML в HTML за сървър • Примерът еASPфайл, а кодът е на VBScript. Информация за ASP и VBScript може да получите на адрес:take a trip to ASP School. • Първият блок създава обект на Microsoft XML parser (XMLDOM)и зарежда XMLфайла в паметта. • Вторият блок създава друг обект на парсера и зарежда XSL в паметта. • Последният блок трансформира XML документ, ползвайки XSL документ и връща резултата към браузера.
XSL (eXtensible Stylesheet Language) Сортиране • За извеждане на XML файла като HTML файл, но сортиран в същото време трябва да се добави атрибут order-byкъм елемента for-each(във XSL файла). • Атрибутът има знак (+) или (-) за да се дефинира нарастващ или намаляващ е реда на сортировка, както и името на елемента по който се прави сортировката. <xsl:for-each select="CATALOG/CD" order-by="+ ARTIST">
XSL (eXtensible Stylesheet Language) <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="CATALOG/CD" order-by="+ ARTIST"> <tr> <td><xsl:value-of select="TITLE"/></td> <td><xsl:value-of select="ARTIST"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Сортиране Поставяне на сортиращата информация в XSL файла
XSL (eXtensible Stylesheet Language) Сортиране и трансформиране от страна на клиента <html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") // Load the XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog_sort.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> Резултат от сортирана в нарастваш азбучен ред информация на Artist
XSL (eXtensible Stylesheet Language) Филтриране • За филтриране на информацията на XML файла, трябва да се добави филтър към атрибутаselectна елемента for-each: • Филтриращи оператори: • = (равно) • =! (различно) • <& по-малко от • >& по-голямо от <xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']">
XSL (eXtensible Stylesheet Language) <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']"> <tr> <td><xsl:value-of select="TITLE"/></td> <td><xsl:value-of select="ARTIST"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Филтриране Поставяне на филтрираща информация в XSL файла
XSL (eXtensible Stylesheet Language) Филтриране и трансформиране от страна на клиента <html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") // Load the XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog_filter.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> Резултат от филтрираната информация
XSL (eXtensible Stylesheet Language) Поставяне на условие (if) • За добавяне на условие добави елементxsl:ifв XSL документа: <xsl:if match=".[ARTIST='Bob Dylan']">... Някакъв изход ...</xsl:if>
XSL (eXtensible Stylesheet Language) <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="CATALOG/CD"> <xsl:if match=".[ARTIST='Bob Dylan']"> <tr> <td><xsl:value-of select="TITLE"/></td> <td><xsl:value-of select="ARTIST"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Поставяне на условие (if) Поставяне на условие (if) в XSL файла
XSL (eXtensible Stylesheet Language) Поставяне на условие (if) от страна на клиента <html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") // Load the XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog_filter.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> Резултат от поставеното условие
XSL (eXtensible Stylesheet Language) Поставяне на условие за избор (choose) • За добавяне на условиеза избор добави xsl:choose, xsl:when и xsl:otherwiseелементи в XSL документа: <xsl:choose> <xsl:when match=".[ARTIST='Bob Dylan']"> ... Някакъв код ... </xsl:when> <xsl:otherwise> ... Някакъв код .... </xsl:otherwise></xsl:choose>
XSL (eXtensible Stylesheet Language) <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="CATALOG/CD"> <tr> <td><xsl:value-of select="TITLE"/></td> <xsl:choose> <xsl:when match=".[ARTIST='Bob Dylan']"> <td bgcolor="#ff0000"><xsl:value-of select="ARTIST"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="ARTIST"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Поставяне на условие за избор (choose) Поставяне на условие за избор в XSL файла
XSL (eXtensible Stylesheet Language) Поставяне на условие за избор от страна на клиента <html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") // Load the XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog_filter.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> Резултат от поставеното условие
Създаване на XML документи от приложение • Огледалното на парсера е генератор. • Чрез DOM – предпочита се при модифициране на документ • Чрез собствен генератор – създаване на документи от не XML данни. • Създаването на XMLдокументи е много по-лесно от четенето (при създаването, потребителят решава какво от синтаксиса на XML да ползва – например може без нотации, единици и т.н.). Модифициране на документи с DOM • DOM обектите имат методи за създаване и модифициране на XMLдокументи. • DOM Document обекта има методи за създаване на елементи, текстови върхове, коментари, инструкции,... • DOM Node обект има методи за: добавяне и премахване на върхове от дървото.
Създаване на XML документи от приложение Модифициране на документи с DOM <?xml version='1.0'?> <products> <product> <name>XML Editor</name> <pricecurrence = “usd”>499.00</price> <pricecurrence = “eur”>475.00</price> </product> <product> <name>XML Training</name> <price currence = “usd”>99.00</price> <pricecurrence = “eur”>85.00</price> </product> . . . </products> С промени в оригиналното приложение могат да се добавят нови цени в документа в еврои атрибут за валутата
Създаване на XML документи от приложение Модифициране на документи с DOM function walkProduct(node,document,rate) { if(node.NodeType==1 && node.nodeName==‘product) { var price, children, i; children = node.childNodes; for(i=0; i< children.length; i++) { var child = children.item(i); if(child.nodeType == 1) if(child.nodeName == “price”) price=child; } var element=document.createElement(“price”), text=document.createTextNode(getText(price)*rate); element.setAttribute(“currency”,”eur”); element.appendChild(text); node.appendChild(element); price.setAttribute(“currency”,”usd”); } } JavaScript за нов елемент <price> в евро и добавяне на атрибут за валута <price currency=“usd”>…
Създаване на XML документи от приложение • DOM методи за създаване и модифициране на документи. • Documentдефинира следните допълнителни методи за създаване на обекти: • CreateAttribute(name) – създава обект атрибут с име name • CreateCDATASection(data) – създава обект низ с данни data • CreateElement(name) • CreateEntityReference(name) • CreateProcessingInstruction(target, data) • CreateTextNode(data)
Създаване на XML документи от приложение • Node дефинира методи за добавяне или премахване на обекти. DOMобектите са производни и наследяват тези методи. • appendChild(child) • insertBefore(child,before) • replaceChild(child, toraplace) • removeChild(child) • Група методи за елементи • Група методи за символни данни
Използване създадените на XML документи • Приложението може да съхрани документа във файл или да го изпрати на сървъра. Изпращане на документа на сървър • Чрез HTML форма • Поставя се в HTML форма и се изпраща чрезнея, ползвайки: JavaBean или ActiveX control. • Тагът FORMизползва атрибут ACTION като полетоINPUTот BUTTONсе променя в SUBMIT. • TEXTAREAсе променя вHIDDEN поле за да не се появява на екрана. • Webсървъра получава XMLдокумента чрез параметър output. • Трябва да се пише сървлет или CGIскрипт за извличане на документа. • Удобството е, че документът се връща във форма и сървлетът трябва да има само достъп до параметрите на формата.
Използване създадените на XML документи Изпращане на документа на сървър • Чрез Internet Explorer XMLHTTP и ActiveX control • XML документа се изпраща чрез JavaScript • Обект ActiveX използва методите: • open(protocol,url,asynchronous)за връзка към url • setRequestHeader(keyword,value) добавя ключова дума • send(data) изпраща данните към сървъра functionsend() { var http=new ActiveXObject(“Microsoft.XMLHTTP”); http.open(“POST”, “http:// адрес_сървър… ”,false); http.setRequestHeader(“Content-type”, “application/xml”); http.send(makeXML()); document.open(); document.write(http.responseText); } Как да се използва XMLHTTP за изпращане на резултатите в web сайт.
Използване създадените на XML документи Изпращане на документа на сървър • Чрез Internet Explorer XMLHTTP и ActiveX control • Необходим е отново сървлет или CGIскрипт на сървъра за извличане на документа. <INPUT TYPE=“SUBMIT” VALUE=“Send in XML” “ONCLICK”=“send()”> Трябва да се промени бутона в HTML формата за да се извиква функцията send
Използване създадените на XML документи Съхраняване на документа • Не се съхранява XML документ във файл на браузера, а само на сървъра. • Ако XML е създаден със собствен генератор, то той се съхранява като всеки друг файл. • При създаване на XML с MS DOM парсър се използва функция save() (но тя се ползва не на браузера, а при писане на CGI скрипт или ASP страница) Съхраняване на файл от JavaScript в ASP сървър <% var xmldoc=new ActiveXObject(“Microsoft.XMLDOM”); //създава се XML документ xmldoc.save(Server.MapPath(“request.xml”)); %>
Използване създадените на XML документи Съхраняване на документа • За създаване на XML парсер отASP, не се използва показаното включване на XML документ в HTML, а се създава директно катоActiveXObject обект. var xmldoc=new ActiveXObject(“Microsoft.XMLDOM”);