TUTORIAL: LINGUAGENS XSL E XSLT Versão 1.0 1/29
Apresentação Este tutorial foi desenvolvido com a finalidade de orientar as Casas Legislativas, que utilizam o SAPL na elaboração de documentos e/ou proposições legislativas, a realizarem customizações nas respectivas folhas de estilo armazenadas em XML. Para isso, utiliza as linguagens XSL (extensible Stylesheet Language Linguagem de folha de estilo extensível) e a XSLT ( extensible Stylesheet Language Transformations Transformaçãos do XSL) para a estilização e a formatação desses documentos. Esta é a versão 1.0 que já se encontra à disposição para uso. A Comunidade Legislativa poderá sugerir e/ou promover melhorias que julgar pertinentes segundo suas necessidades. Requisitos Técnicos Mínimos Conhecimentos básicos nas linguagens XML, HTML, CSS e edição de textos. 2/29
Sumário Apresentação...2 Requisitos Técnicos...2 1. XML (extensible Markup Language)...4 1.1. XML BÁSICO...4 2. XML (extensible Stylesheet Language)...6 2.1. XSL BÁSICO...6 2.2. ESTRUTURA DE UM XSL BÁSICO...8 2.3. PRINCIPAIS ELEMENTOS XSL...10 2.4. EXTENSÕES XSL...14 2.5. XSL aplicado ao SAPL...14 3/29
1. XML (EXtensible Markup Language) Para falar da linguagem XSL, primeiramente, é necessário conhecer a estrutura de um documento ou arquivo em XML. Pelo menos uma introdução básica com vistas ao melhor entendimento para o desenvolvimento do assunto. 1.1. XML BÁSICO O XML é uma linguagem de marcação de dados, cuja função é prover um formato que descreva as informações/dados de modo estruturado. Ou seja, um arquivo de textos marcado por tags dispostas de forma estruturada e hierárquica para armazenar informações. O arquivo de texto deve ter a extensão xml. Essa tecnologia permite o uso de uma infinidade de tags (extensible) e, ainda, utilizar n funções como p.ex. guardar textos para impressão em vários formatos, banco de dados, utilização da mesma informação por sistemas diferentes, etc. Sua estrutura é bastante simples, como pode ser observada no exemplo abaixo, de uma informação em e mail e a sua representação em XML: INFORMAÇÃO REPRESENTAÇÃO EM XML De: Pedro <?xml version="1.0"?> Para: Mário <email> Saudações Mário! Solicito verificação e envio do comprovante de pagamento da fatura da faculdade deste mês. <from>pedro</from> Desde já, obrigado! <to>mário</to> Pedro Magalhães <message>saudações Mário! Solicito verificação e envio do comprovante de pagamento da fatura da faculdade deste mês. </message> <thank>desde já, obrigado!</thank> <sign>pedro Magalhães</sign> </email> Observe que: Um documento xml tem um Document type definition no cabeçalho, representado pela tag <?xml?>. Também, poderá ter novos atributos ou variações dos mesmos, como por exemplo: <?xml version="1.0" encoding="iso8859-1"?>, onde encoding é um atributo do elemento xml, que define a língua, (códigos, números, letras, símbolos,...) no caso o padrão 4/29
ISO8859 1; Há uma hierarquia entre as tags/elementos ou nós. Observe que as indentações, além das tags, ajudam a representar melhor a hierarquia numa estrutura do tipo pai, filhos, netos..., conforme segue: <raiz> </raiz> <filho1> </filho1> <neto1> </neto1> Toda tag/elemento deve iniciar com o padrão < > e terminar/fechar com a mesma tag iniciada, porém, acrescida de uma barra </ >, p. ex: <teste>exemplo</teste>; Um par de tags representa um elemento. No exemplo acima foi utilizada a tag teste para representar/marcar o elemento exemplo, mas poderia ser utilizado qualquer texto ou conjunto de palavras no lugar da palavra teste; As tags em XML são cases sensitive, ou seja, <teste> é diferente de <TESTE> ou <Teste> e assim por diante ; todas tags/nós podem ter atributos para descrever os elementos: EXEMPLO 1 EXEMPLO 2 <?xml version="1.0"?> <?xml version="1.0"?> <pessoa> <pessoa sexo= masculino > <sexo>masculino</sexo> <nome>pedro</nome> <nome>pedro</nome> <sobrenome>mário</sobrenome> <sobrenome>mário</sobrenome > </pessoa> </pessoa> No exemplo 1, sexo é um elemento, porém já no exemplo 2 é um atributo do elemento pessoa. 5/29
A escolha de uma forma ou de outra deve ser orientada pela solução que se quer dar, sendo que se deve evitar o uso de atributos quando o elemento possuir múltiplos valores para o mesmo atributo, uma vez que os mesmos não podem ser expandidos (cada atributo deve ter apenas um valor), não podem descrever estruturas e, ainda, são de difícil manutenção. FONTES: CURSO GRATUITO: http://www.w3schools.com/xml TESTE DE CONHECIMENTO: http://www.w3schools.com/xml/xml_quiz.asp CERTIFICAÇÃO XML (U$95): http://www.w3schools.com/cert 2. XSL (extensible Stylesheet Language) 2.1. XSL BÁSICO A linguagem XSL (Linguagem de Folha de Estilos Extensível) surgiu da necessidade de se melhorar a apresentação/estilização/formatação de um documento XML em HTML. A XSL foi criada para dar uma forma prática de leitura aos dados em formato XML num navegador, ou seja, ela permite apresentar os dados de uma maneira mais inteligível. Abaixo será demonstrado o texto (código fonte) do documento aviso.xml que está em um computador local e o modo como é apresentado no navegador de internet (browser) na forma pura: CÓDIGO FONTE aviso.xml <?xml version="1.0"?> <aviso> <para>janice data="01/04/2000"</para> <de>jefferson</de> <cabecalho>lembre se</cabecalho> <corpo>amanha voce tem prova de matematica</corpo> </aviso> APRESENTAÇÃO VIA BROWSER 6/29
A linguagem XSL pode apresentar as informações de um modo mais amigável ao usuário, bastando referenciar no documento XML o arquivo XSL que é uma linguagem de estilos padrão para arquivos XML, podendo ainda utilizar a combinação das linguagens HTML + CSS no arquivo XSL. Para referenciar, basta acrescentar a seguinte tag no arquivo XML após o cabeçalho: <?xml stylesheet type="text/xsl" href="/var/www/xxxx.xsl"?> Obs: O xxxx.xsl é o nome do arquivo XSL que está no diretório indicado acima. Após referenciado o XML, deve se criar o arquivo com a extensão XSL, usar elementos/tags do XSL para ler as informações do XML, definir os formatos/estilos/lugares onde cada informação deverá estar em sua apresentação utilizando HTML e CSS. Antes de mostrar a eficácia do XSL, que também é uma linguagem de marcação XML (por isso a declaração <?xml?> usada no cabeçalho), será necessária uma especificação por meio de comentários de sua estrutura/código fonte e obrigatoriedade, observando a indicação SIM = obrigatório para todos XSL; e, DEPENDE quando depender da lógica do documento, ou seja, é variável/não obrigatória. Observe a estrutura de hierarquia apresentada nas indentações do código fonte a seguir: CÓDIGO FONTE COMENTÁRIOS Obrigatório? 1 <?xml version="1.0"?> Declaração/especificação do tipo de documento, que neste caso é XML. SIM 2 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xs L/Transform"> Declaração/especificação PADRÃO da linguagem XSL de acordo com os padrões da W3C para Transformações no XML. SIM 3 <xsl:template match="/"> 4 <xsl:for each select="xxxxx"> 5 </xsl:for each> 6... Elemento de Início padrão da raiz principal ('/') do XSL Exemplo do uso do elemento for each do XSL para fazer loop quando se quer aplicar os estilos para cada elemento x encontrado no xml Todo elemento iniciado deve ser finalizado/fechado! Neste caso foi finalizado o for each. Qualquer outro elemento do XSL, assim como o for each, desde que não se esqueça de fecha lo. SIM DEPENDE DEPENDE DEPENDE 7 </xsl:template> Todo elemento iniciado deve ser SIM 7/29
finalizado/fechado! Neste caso é o fechamento do template raiz. 8 </xsl:stylesheet> Fim do documento XSL. SIM O código fonte apresentado acima é apenas a estrutura do XSL puro, onde temos: as declarações de cabeçalho (stylesheet); o início da raiz/diretório principal (template match); a lógica adequada para leitura do XML (for each); finalizações da tag raiz. OBS: As indentações representam a hierarquia, obedecendo as mesmas regras de pais, filhos, netos..., do XML. 2.2. ESTRUTURA DE UM XSL BÁSICO O XSL divide se em três partes: XSL Transformations (XSLT): Linguagem para transformar XML; XPath: Linguagem para acessar e referir as partes de documento XML; XSL FO: Vocabulário XML para especificar semânticas de formatação. As três são importantes, porém só trataremos a XSLT, necessária à criação dos modelos/leiautes de documentos legislativos no SAPL. Como exemplo, será criado o arquivo aviso.xsl para testes em computador local, especificando cada linha de código, pelos comentários abaixo, passo a passo de modo a permitir maior clareza, como segue: 1º PASSO criar, nomear e salvar um arquivo vazio de texto como aviso.xsl; 2º PASSO copiar as tags básicas do padrão XSL conforme abaixo e, em seguida, salva las: <?xml version="1.0"?> CÓDIGO FONTE aviso.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> 8/29
</xsl:template> </xsl:stylesheet> 3º PASSO criar a estrutura HTML + CSS e, em seguida, salva la: OBS: o CSS pode ser usado dentro da tag style (nó filho no html) ou em cada elemento do próprio HTML. <?xml version="1.0"?> CÓDIGO FONTE aviso.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <styletype="text/css"> </style> <body> </body> </html> </xsl:template> </xsl:stylesheet> Esta é a estrutura básica do XSL e está pronta para iniciar o configuração/programação dos estilos dos XML s. Observe que: Elementos do HTML e/ou CSS só podem estar dentro dos elementos template, assim como níveis filhos, netos, etc... Ou seja, entre as tags <xsl:template match="/"> e </xsl:template> nenhum elemento deve constar após </xsl:tamplate> e de </xsl:stylesheet>; A partir deste ponto, pode se utilizar todas as ferramentas/recursos que o HTML e/ou CSS fornecem para uma página/documento da tag <html> até </html>; 9/29
2.3. PRINCIPAIS ELEMENTOS XSL Neste momento, a parte mais importante e esperada é a de busca das informações do arquivo XML para povoar a página html; ou, o documento de saída tratado neste escopo. Para que cada informação específica apareça na página/documento, é necessário conhecer os elementos do XSL, pois, é através deles que, por sua semântica, serão buscadas as informações no/do documento XML dado a tag/nó referente, destinadas ao plano/configuração feita no arquivo fonte XSL. Elementos XSL apply imports apply templates attribute attribute set call template choose comment copy copy of decimal format element fallback for each if import Aplica uma regra do template de uma folha de estilo importado. Aplica uma regra do template no elemento corrente ou nos níveis filhos do elemento corrente. Adiciona um atributo. Define um conjunto de atributos. Faz uma chamada a um template. Usado em conjunto com <when> and <otherwise> para expressar múltiplos testes condicionais. Cria um nó comentado na árvore resultante. Cria uma cópia do nó corrente (sem os níveis filhos e atributos). Cria uma cópia do nó corrente (com os níveis filhos e atributos). Define os caracteres e símbolos a serem usados quando se converte números em strings, com a função format number(). Cria um elemento no documento de saída. Especifica um código alternativo para rodar se o processador não suportar um elemento XSLT. Comando de repetição para cada nó em um nó específico. Aplica template(s) apenas se a condição especificada for verdadeira. Importa o conteúdo de uma folha de estilo em outra. Nota: Uma folha de estilo importada terá prioridade inferior à daquela que a importou. 10/29
include key message namespace alias number otherwise output param preserve space processing instruction sort strip space stylesheet template text transform value of variable when with param Inclui o conteúdo de uma folha de estilo em outra. Nota: Uma folha de estilo inclusa terá a mesma prioridade da folha de estilo que a incluiu. Declara uma chave nomeada, que pode ser usada na folha de estilo com a função key(). Escreve uma mensagem de saída (usado para reportar erros). Substitui um namespace na folha de estilo com um namespace diferente na saída. Determina a posição inteira do nó corrente e formata um número. Especifica uma ação default para o elemento <choose>. Define o formato do documento de saída. Declara um parâmetro local ou global. Define o elemento para cada espaço em branco a ser preservado. Escreve uma instrução de processamento na saída. Ordena a saída. Define o elemento espaço em branco a ser removido. Define o elemento raiz da folha de estilo. Regras a serem aplicadas ao nó especificado. Escreve o texto literal na saída. Define o elemento raiz da folha de estilo. Extrai o valor do nó selecionado. Declara uma variável local ou global. Especifica uma ação para o elemento <choose>. Define o valor de um parâmetro a ser passado no template. 2.4. ESTRUTURA DO ELEMENTOS XSL 11/29
Para utilizar corretamente os elementos XSL, deve se observar a forma sintática padrão, pois há algumas variações que será demonstrada e comentada na tabela abaixo: ELEMENTOS <xsl:text> e mail: </xsl:text> <xsl:value of select= aviso/corpo /> <xsl:for each select= aviso > </xsl:for each> <xsl:apply templates select= nome do nó /> ou <xsl:apply templates/> <xsl:choose> <xsl:when test= test situation > stylesheet commands </xsl:when> <xsl:otherwise> stylesheet commands </xsl:otherwise> </xsl:choose> <xsl:if test= test situation > </xsl:if> COMENTÁRIO Inserção de caracteres/texto Elemento usado para inserir caracteres textuais no documento de saída. No exemplo, será impresso e mail: diretamente no local onde for usado na pagina de estilo. Buscar elementos/atributos do nó Elemento que busca toda informação marcada do xml pela tag/nó corpo no nível filho do aviso e apresentada no documento de saída. Laço for each Elemento de repetição que precede outro elemento XSL, usado para aplicar uma lógica/programação repetida a um conjunto de nodos/elemento do XML, que, neste caso, nos níveis filhos de aviso. Este outro elemento pode ser qualquer elemento desta tabela e do XSL. Aplicar templates Elemento usado para aplicar o elemento nome do nó. Caso esteja sem o select, aplicará todo o template. Laço Condicional Choose Trata se de um laço condicional, sendo que se o primeiro teste (when) for bem sucedido serão executados os seus comandos, caso contrário, executará outros comandos da condição otherwise. O uso do otherwise é obrigatório e, quando não houverem comandos para ele, deve se usar apenas </xsl:otherwise> ao invés do bloco todo. Laço Condicional simples (if) Só executa 12/29
<xsl:variable name= x > atribuir um valor a x aqui... </xsl:variable> o comando caso a condição test seja satisfeita. Criar variável Elemento que cria a variável x, com valor igual a atribuir um valor a x aqui. <xsl:value of select= $x /> <xsl:element name= aviso2 > <xsl:attribute name= valor > <xsl:text>2013</xsl:text> </xsl:attribute> </xsl:element> <xsl:sort select="ano" data type="number" order="ascending"/> Usar valor da Variável Elemento que acessa o valor da variável x criada acima Criar novo elemento + atributo Criar novo elemento aviso2 com atributo valor= 2013 para ser utilizado no documento de saída. Elemento de ordenação Elemento que ordena/agrupa informações de acordo com parâmetros/filtros. Neste caso, obtém se todas as informações do nó ano e organiza por data em ordem crescente. 2.4. EXTENSÕES XSL Podem ser adicionadas novas funcionalidades à linguagem XSL usando extensões que devem ser declaradas como atributos da tag <xsl:stylesheet>. A tabela abaixo demonstra algumas para exemplificação: EXTENSÃO LINGUAGEM <xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:stylesheet xmlns:html="http://www.w3.org/1999/xhtm"> <xsl:stylesheet xmlns:gx="http://www.google.com/kml/ext/2.2"> JAVA XSL HTML OGC KML (Google Earth) 2.5. XSL para o SAPL O SAPL é o sistema que automatiza as atividades legislativas, tornando mais fácil a produção legislativa, como forma de apoiar as Casas Legislativas nas suas atividades relacionadas ao processo 13/29
legislativo em geral, tais como: elaboração de proposições, protocolo e tramitação de matérias legislativas, organização da pauta da sessão, registro de votações nas sessões plenárias, manutenção atualizada da base de leis, entre outras. Por exemplo, as Proposições digitadas são armazenadas segundo o padrão XML. Após deliberação, votação e encaminhamento para o executivo sancionar ou vetar, a matéria poderá retornar ao sistema, na forma de lei, quando passa a fazer parte da base de Leis Municipais ou Normas Jurídicas. Documentos como Indicação, Moção, Ofício, Parecer, Projeto de Lei, Requerimento, etc, possuem estilos diferentes entre si, e podem ser ajustados/estilizados conforme a necessidade de cada casa legislativa com a linguagem XSL configurada no ZOPE. Para acessar os arquivos XSL de cada documento descrito acima, basta digitar no browser a URL: http://localhost:8080/manage, indicar usuário e senha (autenticação), acessar no painel, no lado esquerdo da tela, as pastas sapl; e, em seguida, XSLT e por último HTML, ou seja, /sapl/xslt/html. No repositório HTML, têm se todos os modelos XSL disponíveis para os documentos. Observe o printscreem abaixo: Será usado o modelo pl.xsl que é o estilizador do documento Projeto de Lei do SAPL. Ao clicar no arquivo acima referido, tem se acesso ao seu código fonte, que, neste tutorial, será expandido gradualmente e comentado para facilitar o entendimento conforme segue: 14/29
CÓDIGO FONTE GRUPO BASE COMENTÁRIO <?xml version="1.0" Encoding="ISO 8859 1"?> Declaração obrigatória do arquivo XSL para ler XML. Neste caso, sob regras do padrão ISO 8859 1. Declaração obrigatória para arquivo XSL, que indica início da programação dos <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform estilos, buscando extensão / " xmlns:pl="/xsd/projlei"> <xsl:output encoding="iso 8859 1"/> <xsl:template match="/pl:pl"> funcionalidades do site w3c (conforme o endereço) e com a extensão do arquivo /XSD/ProjLei que será locada no ZOPE. Elemento que força a saída do XSL na codificação do padrão ISO 8859 1. Início/montagem da Raiz absoluta (principal) indicada por /pl, que será a mãe de todo os outros elementos. Elementos de HTML + CSS integrados e posteriormente o XSL. </xsl:template> </xsl:stylesheet> Finalização da raiz absoluta. Finalização das folhas de estilos. 15/29
Abaixo será apresentado o grupo do HTML + CSS e comentados. Também serão mostrados elementos do grupo XSL somente para efeito de localização, os quais estarão num tom mais claro e somente serão explicados na próxima tabela. CÓDIGO FONTE GRUPO HTML + CSS COMENTÁRIO 16/29
Início do HTML. Início do HEAD, que trata das propriedades do documento de saída, como TITLE (título da página HTML), STYLE (estilos / formatações), referenciar / importar um documento externo / outra localidade), META (metadados / informações que facilitam buscas na rede através de palavras chaves), entre outros. Margem direita de 1cm e esquerda de 2cm da página saída. No exemplo, todo e qualquer parágrafo será fonte tamanho 12 e em Times New Roman. <html> <head> <title> <xsl:value of select="@id"/> </title> <style type="text/css"> Todo parágrafo da classe epígrafe será centralizado, letra maiúscula e em negrito. Todo parágrafo da classe ementa será justificado com a margem esquerda alinhada a partir da metade do documento. Todo parágrafo da classe preâmbulo será em maiúscula e avançado de 1cm da margem esquerda. body {margin left: 2cm; margin right: 1cm;} p {font family: Times; font size: 12pt;} Todo parágrafo da classe artigo será justificado e avançado de 2 cm da margem esquerda. Todo parágrafo da classe 17/29 p.epigrafe {text align: center; text transform: uppercase; font weight: bold;}
p.paragrafo {text align: justify; text indent: 2cm;} p.inciso {text align: justify; text indent: 1cm;} p.alinea {text align: justify; text indent: 1cm;} p.item {text align: justify; text indent: 1cm;} p.justificativa {text align: justify; text indent: 7cm;} p.mensagem {text align: justify;} p.data_apresentacao {text align: justify;} p.autor {text align: center; text transform: uppercase;} p.cargo {text align: center;} h3.cab_secao {text align: center; font size: 12pt;} parágrafo será justificado e avançado de 2 cm da margem esquerda. Todo parágrafo da classe inciso será justificado e avançado de 1 cm da margem esquerda. Todo parágrafo da classe alínea será justificado e avançado de 1 cm da margem esquerda. Todo parágrafo da classe item será justificado e avançado de 1cm da margem esquerda. Todo parágrafo da classe justificativa será justificado e avanço de 7cm da margem esquerda. Todo parágrafo da classe mensagem será justificado. Todo parágrafo da classe data_apresentacao será justificado. Todo parágrafo da classe autor será centralizado e em maiúsculas. Todo parágrafo da classe cargo será alinhado no centro da página. Todo título com tag h3 que faz parte da classe cab_secao será centralizado com tamanho de fonte 12. 18/29
artigo[rotulo] {font weight: bold;} </style> </head> <body> <table> <tr align="right" > <td width="77" heigth="81"> <img src="/sapl/portal_skins/sk_sapl/imagens/logo_casa.gif"> Deixa em negrito todos atributos rótulo do elemento artigo, ou seja Art 1º, Art 2º, etc. Fechamento dos estilos (style) e propriedades (head) desta página/documento. Início do modelo/conteúdo da página/documento. Criação de uma tabela para melhor alinhamento da logomarca da Casa Legislativa e do texto/cabeçalho. Criação de uma linha na tabela com conteúdo alinhado a direita. Início de inserção de dados na linha criada acima. Inserção da imagem do Brasão/Logo da Casa Legislativa pelo endereço que está no atributo src, localizado no ZOPE. </img> </td> Finalização do elemento imagem e de inserção de dado na linha. Início de inserção de dado/ Texto exemplo (Câmara <td align="left" heigth="40"> Câmara Municipal de Piraí Municipal de Piraí) que, neste caso, está na mesma linha da <br/>estado do Rio de Janeiro</td> imagem. A tag br força a quebra de linha do texto para que o restante seja escrito na próxima linha. 19/29
</tr> </table> Finalização da linha (tr) e finalização da tabela (table). <br/> Pula linha. <xsl:apply templates/> <hr color="#8b4513" size="4" width="90%"></hr> <hr color="#8b4513" size="1" width="90%"></hr> Cria linha horizontal com a cor #8B4513, com espessura 4 e que ocupa 90% da folha. <p align="center"> Rua Dr. Luiz Antonio G. da Início de um parágrafo cujo conteúdo estará centralizado. Silveira, 16 Centro, Piraí/RJ Cep: 27175/000</p><p Neste caso, trata se do rodapé e align="center">e mail:<a href="mailto:cmpirai@pirai.rj.leg.br"> foi colocado neste local para que cmpirai@pirai.rj.leg.br</a></p><p align="center" padding="0"> seja mostrado independente de Telefax: (24) 2411 9500</p> qualquer elemento. A posição correta seria no final do código fonte? Não! Pois estaria fora da tag </html> que é o fim do documento. </body> </html> Término do modelo e corpo do documento. Caso especial: observe que apenas dois elementos XSL foram mostrados em um tom mais claro na tabela acima no GRUPO HTML + CSS, pois o local é o mais importante a saber, ou seja, <xsl:value of select="@id"/> e <xsl:apply templates/>. O primeiro XSL busca a informação marcada pelo atributo id (vide a presença do símbolo @ ) e o coloca na TITLE do documento, que será gerado, dando o mesmo nome/código do XML para o documento de saída. Já o segundo, serve para chamar todos elementos XSL do arquivo XSL e aplicá los nas posições em que se encontram, ou seja, não importa se os elementos XSL estão após a TAG de finalização </html>, pois o <xsl:apply templates/> localiza todos e aplica na mesma sequência em que se encontram definidos no local indicado por <xsl:apply templates/>. 20/29
Após conhecer os dois elementos especiais e suas utilidades, falta apenas conhecer os restantes dos elementos XSL, que serão aplicados a cada elemento do XML conforme será demonstrado e comentado a seguir. Veja como identificar primeiramente os elementos XML: Este exemplo tratará da proposição de Projeto de Lei no SAPL. Os campos acima (Proposição, Justificativa, Data de Apresentação, Autor e Mensagem de Encaminhamento) são filhos do pl (Pojeto de Lei). Exemplificando, a estrutura do XML seria da seguinte forma: <?xml version="1.0"?> <pl> <proposicao> <epigrafe> <epigrafe_text></epigrafe_text> </epigrafe> <ementa> <ementa_text></ementa_text> </ementa> <preambulo> <preambulo_text></preambulo_text> </preambulo> <parte> <livro> <titulo> <capitulo> <artigo> <artigo_text> 21/29
<paragrafo> <paragrafo_text></paragrafo_text> </paragrafo> </artigo_text> </artigo> </capitulo> </titulo> </livro> </parte> </proposicao> <justificativa></justificativa> <datadeapresentacao></datadeapresentacao> <autor></autor> <mensagem></mensagem> </pl> CÓDIGO FONTE GRUPO XSL <xsl:template match="pl:proposicao"> <xsl:apply templates select="./*"/> </xsl:template> <xsl:template match="pl:epigrafe"> <p class="epigrafe"> <xsl:value of select="pl:epigrafe_text"/> </p> </xsl:template> COMENTÁRIO Elemento XSL que inicia o conjunto de estilos para o elemento proposição do XML. Elemento que aplica estilos XSL em um conjunto de elementos do XML. Neste caso, o select aponta para todos os elementos (*) da mesma hierarquia/nível (/) sendo que o elemento root será a proposição. Fechamento do primeiro template. Elemento XSL que inicia conjunto de estilos para o elemento/nó epígrafe do XML. HTML: marcação de início de parágrafo da classe epígrafe. Busca a informação tagueada /marcadas por epígrafe_text. HTML: Fecha o parágrafo Fecha folhas de estilos para a epígrafe. 22/29
<xsl:template match="pl:ementa"> <br/><br/> <p class="ementa"> <xsl:value of select="pl:ementa_text"/> </p> </xsl:template> <xsl:template match="pl:preambulo"> <p class="preambulo"> <xsl:value of select="pl:preambulo_text"/> </p> </xsl:template> <xsl:template match="pl:artigo_text"> <p class="artigo"> <b> <xsl:value of select="../@rotulo"/> </b> <xsl:value of select="concat(' ',text())"/> Inicializa estilos para o elemento ementa do XML. HTML: Salta 2 linhas. HTML: Início de parágrafo da classe ementa. Busca a informação tagueada / marcadas por ementa_text. HTML: Fecha parágrafo do grupo ementa. Fecha as folhas de estilos para a ementa. Inicializa estilos para elemento preâmbulo do XML. HTML: Início de parágrafo da classe preâmbulo. Busca a informação tagueada / marcadas por preambulo_text. HTML: Fecha parágrafo do grupo ementa. Fecha as folhas de estilos para preambulo. Busca a informação tagueada / marcadas por artigo_text. HTML: Início de parágrafo da classe artigo. HTML: Início de negrito. Busca o valor do atributo de Rotulo que não esta no nó atual e sim no anterior, ou seja, o capitulo. HTML: Término de negrito. Busca no elemento artigo_text, os valores que 23/29
</p> </xsl:template> <xsl:template match="pl:paragrafo_text"> <p class="paragrafo"> <xsl:value of select="concat(../@rotulo,' ',text())"/> </p> </xsl:template> <xsl:template match="pl:inciso_text"> <p class="inciso"> <xsl:value of select="concat(../@rotulo,' ',text())"/> </p> </xsl:template> <xsl:template match="pl:alinea_text"> a função text() retornar (que será todo o texto) concatenado com um espaço em branco no início. HTML: Término do parágrafo da classe artigo. Fecha folhas de estilos para artigo_text. Busca a informação tagueada / marcadas por paragrafo_text. HTML: Início de parágrafo da classe paragrafo. Busca no elemento paragrafo_text os valores do atributo Rotulo do elemento anterior e concatena com um espaço em branco, mais o valor retornado por text(). HTML: Fechamento de parágrafo da classe paragrafo. Fecha folhas de estilos de paragrafo_text. Inicia estilos para o elemento inciso_text do arquivo XML. HTML: Início de parágrafo da classe inciso. Busca no elemento inciso_text os valores do atributo Rotulo do elemento anterior e concatena/junta com o e mais o valor retornado por text(). HTML: Término de parágrafo da classe inciso. Fecha folhas de estilos de inciso_text. Busca a informação tagueada / marcadas por 24/29
alinea_text. <p class="alinea"> <xsl:value of select="concat(../@rotulo,' ',text())"/> </p> </xsl:template> <xsl:template match="pl:item_text"> <p class="item"> <xsl:value of select="concat(../@rotulo,' ',text())"/> </p> </xsl:template> HTML: Início de parágrafo da classe alinea. Busca no elemento alinea_text os valores do atributo Rotulo do elemento anterior e concatena/junta com um espaço em branco mais o valor retornado por text(). HTML: Fecha parágrafo da classe alinea_text. Fecha folhas de estilos de alinea_text. Inicia estilos para o elemento item_text do arquivo XML. HTML: Início de parágrafo da classe item. Busca no elemento item_text os valores do atributo Rotulo do elemento anterior e concatena/junta com um espaço em branco mais o valor retornado por text(). HTML: Fecha parágrafo da classe item. Fecha folhas de estilos de item_text. Inicia estilos para o elemento <xsl:template match="pl:data_apresentacao_text"> data_apresentacao_text do arquivo XML. <p class="data_apresentacao"> <xsl:value of select="text()"/> </p> HTML: Início de parágrafo da classe data_apresentacao. Busca no elemento data_apresentacao os valores Retornados da função text(), cuja retorna todo o texto/palavras que estão tagueadas por este elemento. HTML: Fecha parágrafo da classe data_apresentacao. 25/29
</xsl:template> <xsl:template match="pl:autor_text"> <br/><br/> <p class="autor"> <xsl:value of select="text()"/> </p> </xsl:template> <xsl:template match="pl:cargo_text"> Fecha folhas de estilos de data_apresentacao_text. Inicia estilos para o elemento autor_text do arquivo XML. HTML: Salta duas linhas. HTML: Início de parágrafo da classe autor. Busca no elemento alinea_text os valores do atributo Rotulo do elemento anterior e concatena/junta com um espaço em branco mais o valor retornado por text(). HTML: Término de parágrafo autor. Fecha folhas de estilos de autor_text. Inicia estilos para o elemento cargo_text do arquivo XML. <p class="cargo"> <xsl:value of select="text()"/> </p> <br/><br/><br/> </xsl:template> <xsl:template match="pl:justificativa"> HTML: Início de parágrafo da classe cargo. Busca no elemento cargo_text os valores do retornados pela função text(), que retorna apenas texto. HTML: Início de parágrafo da classe cargo. HTML: Salta 3 linhas. Fecha folhas de estilos de cargo_text. Inicia estilos para o elemento justificativa do arquivo XML. <br/><br/> HTML: Salta duas linhas. HTML: Cria o referido texto centralizado 26/29
<b><p align="center">j U S T I F I C A T I V A :</p></b> <br/> <p class="justificativa"> <xsl:value of select="pl:justificativa_text"/> </p> <br/> </xsl:template> <xsl:template match="pl:mensagem"> <h3 class="cab_secao">m E N S A G E M :</h3> <br/> <p class="mensagem"> <xsl:value of select="pl:mensagem_text"/> </p> HTML: Salta uma linha. HTML: Início de parágrafo da classe justificativa. Busca a informação tagueada / marcadas por justificativa_text. HTML: Fim do parágrafo da classe justificativa. HTML: Salta uma linha. Fecha folhas de estilos de justificativa. Inicia estilos para o elemento mensagem do arquivo XML. HTML: Cria o texto na página no tamanho de h3. HTML: Salta uma linha. HTML: Início de parágrafo da classe mensagem. Busca a informação tagueada / marcadas por mensagem_text. HTML: Fim do parágrafo da classe mensagem. </xsl:template> </xsl:stylesheet> Fecha folhas de estilos de mensagem. Finaliza todas folhas de estilos. 27/29
Após preencher os campos do Projeto de Lei no SAPL (vide figura anterior) e as folhas de estilos programadas conforme a tabela acima, tem se o seguinte documento de saída estilizado pela linguagem XSL conforme abaixo: 28/29
29/29
30/29
31/29