XSLT Padrão para Xtensible Stylesheet Language, e é uma linguagem de folha de estilos para dcoumentos XML XSL = Style Sheets for XML • XSL descreve como um documento XML deve ser exibido. • XSL é mais que uma folha de estilo: – XSL é uma linguagem para transformar documentos XML – XPATH uma linguagem que permite navegar entre documentos XML – XSL-FO, uma linguagem para formatar documentos XML. XSLT • XSLT é uma linguagem para transformar documentos XML em documentos HTML ou para outros documentos XML. • XSLT é a parte mais importante da XSL. • XSLT é uma recomendação da W3C. XSLT = XSL Transformations • XSLT é a mais importante parte da XSL. • XSLT é utilizada para transformar um documento XML em outro documento XML ou em outro tipo de documento que possa ser reconhecido por um navegador, como HMTL ou XHTML. • Normalmente isso é realizado pela transformação de cada elemento XML em um elemento (X)HTML. XSLT usa XPATH • XSLT utiliza XPATH para encontrar informações em um documento XML. • XPATH é utilizado para navegar através dos elementos e atributos XML. • No processo de transformação XSLT usa XPATH para encontrar dados pré definidos em um template. NAVEGADORES XSLT • • • • • Mozilla Firefox Internet Explorer 6 Google Chrome Opera Apple Safari XSLT - Transformação • Declaração de estilo, de acordo com a recomendação W3C XSLT. • <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansform"> • Ou • <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansform"> Exemplo • Crie um xml para catalogar coleções de uma loja de CD, com os elementos catalogo (raiz), cd, titulo, artista, país, gravadora, preço, ano. • Insira pelo menos 5 artistas e seus dados. • Salve como catalogo_cd.xml • Teste seu novo xml. <?xml version="1.0" encoding="ISO-8859-1"?> <catalogo> <cd> <titulo> </titulo> <artista> </artista> <pais> </pais> <gravadora> </gravadora> <preco> </preco> <ano> </ano> </cd> <cd> .......... </cd> </catalogo> Exemplo em www.ezmail.com.br/xml/catalogo.zip <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <tr> <td>.</td> <td>.</td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet> Salve como catalogo.xsl O elemento <xsl:template> O elemento <xsl:stylesheet> define que o documento é um folha de estilos XSLT, sua versão e o atributo namespace do XSLT. <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <tr> O elemento <xsl:template> • Um folha de estilos XSL consiste em um ou mais conjunto de regras que são chamados de TEMPLATES. • Um template contem regras a serem aplicados quando um nó especificado é encontrado. • O elemento <xsl:template> é utilizado para construir um template. <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <tr> <td>.</td> <td>.</td> <xsl:template match="/"> • O elemento <xsl:template define um template e match=“/” associa o atributo ao template com a raiz da fonte XML. • O conteúdo dentro do atributo <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <tr> <td>.</td> <td>.</td> <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <tr> <td>.</td> <td>.</td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CDs</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> O elemento <xsl:value-of> extrai o valor de um nó selecionado. <xsl:for-each select="catalogo/cd"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="artista"/></td> </tr> O valor do atributo select contém uma </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> expressão XPath. Ela funciona como a navegação num sistema de arquivos onde uma barra à frente (/) seleciona subdiretórios. Juntando xsl ao xml • Abra o catalogo.xml e adcione: <?xml version="1.0" encoding="ISO-88591"?> <?xml-stylesheet type="text/xsl" href="catalogo.xsl"?> <catalogo> Salve e verifique a modificação XSL = Style Sheets for XML • Recordando • XSL descreve como um documento XML deve ser exibido. • XSL é mais que uma folha de estilo: – XSL é uma linguagem para transformar documentos XML – XPATH uma linguagem que permite navegar entre documentos XML – XSL-FO, uma linguagem para formatar documentos XML. O elemento <xsl:for-each> • elemento XSL <xsl:for-each> pode ser usado para selecionar todo elemento XML de um conjunto de nós específico. • Funciona como o laço for de uma linguagem de programação. <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CDs</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="artista"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Filtrando a saída • Nós podemos filtrar a saída de um arquivo XML adicionando um critério ao atributo select de um elemento <xsl:for-each>. • <xsl:for-each select="catalog/cd[artist='Bob Dylan']"> • Operadores de filtragem válidos são: • = (igual) • != (diferente) • < (menor que) • > (maior que) Exemplo <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CD</h2> <table border="1"> <tr> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd[artista='Bob Dylan']"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="artista"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> O elemento <xsl:sort> • O elemento <xsl:sort> é usado para ordenar o resultado. • Onde colocar a Informação de Ordenação ? • Para gerar um arquivo XML como um arquivo XHTML, e ordená-lo ao mesmo tempo, simplesmente adicione um elemento sort dentro de um elemento for-each no seu arquivo XSL: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção CDs</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd"> <xsl:sort select="artista"/> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="artista"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> O atributo select indica qual elemento XML a ordenar. O elemento <xsl:if> • O elemento <xsl:if> contém um padrão que só será aplicado se uma condição específica for verdadeira. • Onde colocar a condição IF • Para colocar um teste condicional frente ao conteúdo de um arquivo, simplesmente adicione um elemento <xsl:if> no documento XSL como abaixo: • <xsl:if test="preco > 10"> alguma saida... </xsl:if> • O valor do atributo obrigatório test da expressão a ser avaliada. <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CD</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd"> <xsl:if test="preco > 10"> <tr> <td><xsl:value-of select="titulo"/></td> <td><xsl:value-of select="artista"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> O elemento <xsl:choose> • O elemento <xsl:choose> é usado em conjunto com <xsl:when> e <xsl:otherwise> para expressar múltiplos testes condicionais. • Onde colocar a condição Choose: • Para inserir o teste condicional choose frente ao conteúdo de um arquivo XML, simplesmente adicione os elementos <xsl:choose>, <xsl:when> e <xsl:otherwise> no seu arquivo XSL como abaixo: • <xsl:choose> <xsl:when test="price > 10"> ...algum código... </xsl:when> <xsl:otherwise> ...algum código... </xsl:otherwise> </xsl:choose> <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CDs</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd"> <tr> <td><xsl:value-of select="titulo"/></td> <xsl:choose> <xsl:when test="preco > 10"> <td bgcolor="FF000FF"> <xsl:value-of select="artista"/> </td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artista"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> O código irá colorir o fundo da coluna artista de rosa QUANDO (WHEN) o preço do cd for maior que 10. • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha Coleção de CD</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Titulo</th> <th>Artista</th> </tr> <xsl:for-each select="catalogo/cd"> <tr> <td><xsl:value-of select="titulo"/></td> <xsl:choose> <xsl:when test="preco > 10"> <td bgcolor="#ff00ff"> <xsl:value-of select="artista"/> </td> </xsl:when> <xsl:when test="preco > 9 and preco <= 10"> <td bgcolor="#CCCCCC"> <xsl:value-of select="artista"/> </td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artista"/></td> </xsl:otherwise> </xsl:choose> </tr> O código acima irá colorir o fundo </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> coluna artista de rosa QUANDO (WHEN) o preço do cd for maior que 10 e irá colorir de cinza QUANDO (WHEN) o preço do cd for maior que 9 e menor ou igual a 10. O elemento <xsl:applytemplates> • O elemento <xsl:apply-templates> aplica uma regra de molde ao elemento corrente ou aos nós filhos do elemento corrente. • Se nós adicionarmos um atributo de seleção ao elemento <xsl:apply-templates> ele irá processar somente o elemento filho que combinar com o valor do atributo. Nós podemos usar o atributo de seleção para especificar a ordem na qual os nós filhos são processados. <?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Minha coleção de CD</h2> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="cd"> <p> <xsl:apply-templates select="titulo" /> <xsl:apply-templates select="artista" /> </p> </xsl:template> <xsl:template match="titulo"> Titulo: <span style="color:#ff0000"> <xsl:value-of select="." /> </span> <br /> </xsl:template> <xsl:template match="artista"> Artista: <span style="color:#00ff00"> <xsl:value-of select="." /> </span> <br /> </xsl:template> </xsl:stylesheet> XSLT - No Cliente • Se o seu browser suporta XSLT, este pode ser usado para transformar o documento em XHTML no seu browser. • Anteriormente foi explicado como o XSLT pode ser usado para transformar um documento de XML para XHTML. Nós adicionamos uma folha de estilos XSL ao arquivo XML e deixamos o browser fazer a transformação. • Mesmo que isso funcione bem, nem sempre é desejável incluir uma referência a uma folha de estilos no arquivo XML (isto é, não funcionará num browser que não reconhece XSLT.) • Uma solução mais versátil seria usar um JavaScript para fazer a transformação XML em XHTML. O JAVA SCRIPT Usando JavaScript nós podemos: • fazer testes para browsers específicos • usar diferentes folhas de estilos de acordo com o browser e com as necessidades do usuário Essa é a beleza do XSLT. Um dos objetivos desenhados para o XSLT era o de tornar possível transformar dados de um formato para outro, suportando browsers diferentes e necessidades de usuários diferentes. A transformação XSLT do lado do cliente está para ser uma das maiores tarefas para os browsers no futuro, como nós veremos um crescimento no mercado de browsers especializados (Braille, browsers para deficientes auditivos, impressoras web, dispositivos handhelds, etc.) Exemplo • www.ezmail.com.br/xml/java.zip • • • • • • • • • • • • • • • • • • • • • • • <head> <script> function loadXMLDoc(fname) { var xmlDoc; // code for IE if (window.ActiveXObject) { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); } // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { function displayResult() { xml=loadXMLDoc("catalogo_cd.xml"); xsl=loadXMLDoc("catalogo.xsl"); // code for IE if (window.ActiveXObject) { ex=xml.transformNode(xsl); document.getElementById("exemplo").innerHTML=ex; } // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && xmlDoc=document.implementation.createDocument("","",nudocument.implementation.createDocument) ll); { xsltProcessor=new XSLTProcessor(); } xsltProcessor.importStylesheet(xsl); else resultDocument = { xsltProcessor.transformToFragment(xml,document); alert('Your browser cannot handle this script'); } xmlDoc.async=false; xmlDoc.load(fname); return(xmlDoc); } document.getElementById("exemplo").appendChild(result Document); } } </script> </head> <body onload="displayResult()"> <div id="exemplo" /> </body> </html> XSLT - No Servidor • Como nem todos os browsers suportam XSLT, uma solução é transformar o XML em XHTML no servidor. • Para fazer os dados XML disponíveis para todo tipo de browser, nós temos que transformar o documento XML no SERVIDOR e enviá-lo como XHTML puro para o BROWSER. • Essa é uma outra beleza do XSLT. Um dos objetivos desenhados para o XSLT era o de tornar possível transformar dados de um formato para outro em um servidor, retornando dados legíveis para todos os tipos de browsers futuros. • A transformação XSLT no servidor está para ser uma das maiores tarefas do Servidor de Informações de Internet (Internet Information Server) no futuro, assim como veremos um crescimento no mercado de browsers especializados (Braille, browsers para deficientes auditivos, impressoras web, dispositivos handheld, etc.) Editor XML • http://rs474.rapidshare.com/files/19718758 9/altxmol.zip • Tutorial http://www.altova.com/documents/XMLSpy Tutorial.pdf • Slide da aula: • www.ezmail.com.br/xml/xls.zip Próxima aula • • • • Revisão do conteúdo HTML/XML Avaliação em 05/10/2009 Conteudo : Avaliação conceitual de XML/DTD/CSS/XSL • 10 QUESTÕES DE MULTIPLA ESCOLHA. Exercicio • Crie uma página em html que exiba uma opção para o usuário selecionar o tipo de dados que deseja ver • 1 – Artistas por nome em ordem alfabética • 2 – Cd em ordem alfabética. • 3 – Que exiba todo o conteúdo do xml em tabelas. • Entregue no final da aula.