1 FEUP Faculdade de Engenharia da Universidade do Porto XSL Porto, Maio de 2002 Gabriel David [email protected] © FEUP, Maio 2002 XML/XSL 2 Estilo vs Conteúdo • Reutilização de fragmentos de dados: o mesmo conteúdo pode ter um aspecto diferente em contextos diferentes. • Múltiplos formatos de saída: diferentes tipos de media (papel, online), tamanhos diferentes (manuais, relatórios), diferentes tipos de hardware de saída (palms, workstations). • Estilos talhados de acordo com as preferências do leitor: tamanho de impressão, côr, layout simplificado para dispositivos áudio. • Estilos normalizados: normas de estilo organizacionais podem ser aplicados em qualquer altura. • Autores não precisam de se preocupar com assuntos de estilo: podem escrever os seus artigos técnicos sem se preocuparem com o layout porque o estilo correcto pode ser aplicado depois. © FEUP, Maio 2002 XML/XSL 3 Maneiras de mostrar XML Folha de estilos DTD Autor Apresentação Documentos © FEUP, Maio 2002 XML/XSL 4 Maneiras de mostrar XML apresentação XSLT stylesheet XSL XSLT DTD © FEUP, Maio 2002 doc Novo doc FO DTD XML/XSL 5 Maneiras de mostrar XML © FEUP, Maio 2002 XML/XSL 6 XSL • Transformação opcional do documento inicial noutra estrutura • Descrição de como apresentar a informação transformada • Transformação: – Geração de texto “constante” – Supressão de conteúdo – Mover texto – Duplicar texto – Ordenação – Transformações mais complexas capazes de “gerar” nova informação a partir da existente • Descrição da informação: – Especificação do layout do ecrã ou página – Introdução do texto transformado em “containers” básicos (listas, parágrafos, tabelas...) – Especificação de propriedades de formatação (margem, fontes, alinhamento...) © FEUP, Maio 2002 XML/XSL 7 Componentes do XSL • XSL: Extensible Stylesheet Language – principais componentes – XPath: XML Path Language – uma linguagem para referenciar partes específicas de um documento XML – XSLT: XSL Transformations – uma linguagem para descrever como transformar um documento XML (representado como uma árvore) noutro. – Formatting Objects e Formatting Properties © FEUP, Maio 2002 XML/XSL 8 XML -> Árvore XML resultante © FEUP, Maio 2002 XML/XSL 9 Árvores de partida • Árvore XML para processador XML – Hierarquia de elementos • Árvore XML para processador XSL – – – – – – – © FEUP, Maio 2002 Nó raiz (diferente do elemento raiz) Elementos Texto Atributos Espaços de nomes Instruções de processamento Comentários XML/XSL 10 Exemplo <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="14-4.xsl"?> <PERIODIC_TABLE> <ATOM PHASE="GAS"> <NAME>Hydrogen</NAME> <SYMBOL>H</SYMBOL> <ATOMIC_NUMBER>1</ATOMIC_NUMBER> <ATOMIC_WEIGHT> 1.00794 </ATOMIC_WEIGHT> <BOILING_POINT UNITS="Kelvin"> 20.28 </BOILING_POINT> <MELTING_POINT UNITS="Kelvin"> 13.81 </MELTING_POINT> <DENSITY UNITS="grams/cubic centimeter"> <!-- At 300K --> 0.0899 </DENSITY> </ATOM> © FEUP, Maio 2002 <ATOM PHASE=“LIQUID"> <NAME>Helium</NAME> <SYMBOL>He</SYMBOL> <ATOMIC_NUMBER> 2 </ATOMIC_NUMBER> <ATOMIC_WEIGHT> 4.0026 </ATOMIC_WEIGHT> <BOILING_POINT UNITS="Kelvin"> 4.216 </BOILING_POINT> <MELTING_POINT UNITS="Kelvin"> 0.95</MELTING_POINT> <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K --> 0.1785 </DENSITY> </ATOM> </PERIODIC_TABLE> XML/XSL 11 © FEUP, Maio 2002 XML/XSL 12 Árvores resultantes • Outro documento XML – XHTML – Árvore contendo Formatting Objects • O facto de a árvore resultante ser um documento XML coloca algumas restrições – Não é possível produzir HTML genérico, que não seja ele próprio XML – As ferramentas para analisar as árvores são as mesmas © FEUP, Maio 2002 XML/XSL 13 Ligando XSL com XML • Incluir após a declaração do xml, uma directiva de processamento que aponta para o stylesheet a utilizar. • Exemplo: <?xml-stylesheet href=“14-2.xsl” type=“text/xsl”?> • Comparar com folha de estilo em cascata: <?xml-stylesheet href=“14-1n.css” type=“text/css”?> © FEUP, Maio 2002 XML/XSL 14 Folha de estilo PERIODIC_TABLE {display : block; text-align : center} NAME {display : block; font-size : 24pt} ATOM {color : red} SYMBOL {display : block; font-size : 18pt; color : yellow} ATOMIC_NUMBER, ATOMIC_WEIGHT, BOILING_POINT, MELTING_POINT, DENSITY {display : inline; font-size : 12pt} © FEUP, Maio 2002 XML/XSL 15 Visualizador de XML por omissão (IE5) © FEUP, Maio 2002 XML/XSL 16 Primeiro exemplo <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <h1> Tabela periodica </h1> </xsl:template> Resultado <html> <h1> Tabela periodica </h1> </html> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 17 Esquema básico de funcionamento • Uma especificação XSLT é constituída por um conjunto de regras (templates) – Cada regra só se aplica aos nós que correspondam ao padrão especificado no atributo match – Aplicar uma regra significa incluir na árvore de saída o conteúdo da regra, executando as instruções que este possa conter – Uma instrução <xsl:apply-templates> manda tentar aplicar as regras a cada um dos filhos directos do nó corrente • O processamento XSLT começa pelo nó raiz da árvore de entrada e tenta aplicar-lhe as regras que existem – O nó raiz é designado por "/" – Não confundir com o elemento raiz, que vem abaixo e é, neste exemplo, <PERIODIC_TABLE> – A distinção permite pendurar instruções de processamento em "/" mas que não têm, neste caso, nenhum template para activarem © FEUP, Maio 2002 XML/XSL 18 Folha de estilo simples <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <xsl:apply-templates/> </xsl:template> <xsl:template match="ATOM"> <P> <xsl:apply-templates/> </P> </xsl:template> <xsl:template match="NAME"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 19 Comentários • Tentativa de aplicação recursiva dos templates, percorrendo os filhos do nó corrente na árvore • A aplicação efectiva-se quando o nó a ser processado corresponde ao elemento indicado no match • A instrução <xsl:value-of select="."/> produz na árvore de saída o valor do nó seleccionado no atributo select – O valor de um nó é o texto do seu conteúdo (sem as marcas) – O "." refere-se ao nó corrente (neste caso o elemento NAME) © FEUP, Maio 2002 XML/XSL 20 Valor de um nó <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <xsl:apply-templates/> </xsl:template> <xsl:template match="ATOM"> <H1><xsl:value-of select="NAME"/></H1> <P> <xsl:value-of select="."/> </P> </xsl:template> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 21 Selecção de nós • Neste caso o nó corrente é o ATOM, por isso a segunda chamada a value-of produz o seu valor – A instrução <xsl:value-of select="NAME"/> produz o conteúdo de um elemento NAME, que seja filho do nó corrente (se houvesse mais do que um, teríamos apenas o primeiro; para ter todos seria necessário uma instrução xsl:apply-templates, para iterar, e um template para NAME com value-of de "." • A instrução <xsl:value-of select="NAME"/> tem o mesmo efeito que a do exemplo anterior – há mais do que uma maneira de especificar o mesmo resultado, jogando com a indicação de caminhos ao longo da árvore e com a posição corrente © FEUP, Maio 2002 XML/XSL 22 Definição de uma tabela <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head> <title>Atomic Number vs. Atomic Weight</title> </head> <body> <xsl:apply-templates select="PERIODIC_TABLE"/> </xsl:template> </body> <xsl:template match="ATOM"> </html> <tr> </xsl:template> <td><xsl:value-of <xsl:template match="PERIODIC_TABLE"> select="NAME"/></td> <h1>Atomic Number vs. Atomic Weight</h1> <td><xsl:value-of <table> select="ATOMIC_NUMBER"/></td> <th>Element</th> <td><xsl:value-of <th>Atomic Number</th> select="ATOMIC_WEIGHT"/></td> <th>Atomic Weight</th> </tr> <xsl:apply-templates select="ATOM"/> </xsl:template> </table> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 23 Tabela © FEUP, Maio 2002 XML/XSL 24 Aplicação selectiva • É possível especificar um critério de selecção em apply-templates de forma a só percorrer os filhos que satisfaçam o critério (nó do elemento indicado) • O atributo select nas primeiras regras é redundante pois os únicos filhos existentes já são nós desses elementos © FEUP, Maio 2002 XML/XSL 25 Valor de um atributo <xsl:template match="MELTING_POINT"> <xsl:value-of select="."/> <xsl:value-of select="@UNITS"/> </xsl:template> © FEUP, Maio 2002 XML/XSL 26 Mais valores de nós • Tipo de nó – Raiz – Elemento – Texto – Atributo – Espaço de nomes – Instrução de processamento – Comentário © FEUP, Maio 2002 • Valor – o do elemento raiz – concatenação de todos os dados de caracteres analisados do elemento, incluindo os dos descendentes – o próprio nó – o valor do atributo, com as entidades resolvidas e sem espaços – o URI respectivo – o valor da instrução, sem nome nem limitadores – o texto do comentário, sem limitadores XML/XSL 27 Má solução <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <html> <body> <xsl:value-of select="ATOM"/> </body> </html> </xsl:template> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 28 Ambiguidade • O problema da solução anterior é o facto de o elemento PERIODIC_TABLE ter vários filhos ATOM o que deixa a instrução value-of ambígua (só mostra o primeiro) • Melhor <xsl:template match="PERIODIC_TABLE"> <html> <body> <xsl:apply-templates select="ATOM"/> </body> </html> </xsl:template> <xsl:template match="ATOM"> <p><xsl:value-of select="."/></p> </xsl:template> © FEUP, Maio 2002 XML/XSL 29 Iteração • Uma solução alternativa é forçar a iteração com for-each <xsl:template match="PERIODIC_TABLE"> <html> <body> <xsl:for-each select="ATOM"> <p><xsl:value-of select="."/></p> </xsl:for-each> </body> </html> </xsl:template> © FEUP, Maio 2002 XML/XSL 30 Condições de selecção <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <html> <head><title>Gases</title></head> <body> <xsl:apply-templates select="ATOM[@PHASE='GAS']"/> </body> </html> </xsl:template> <xsl:template match="ATOM"> <P><xsl:value-of select="."/></P> </xsl:template> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 31 Condições • A condição [@PHASE='GAS'] filtra os átomos de forma a reter apenas os gasosos e procura regras apenas para esse (daí que não seja preciso repetir a condição no template de ATOM) © FEUP, Maio 2002 XML/XSL 32 Caminhos de comprimento variável <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <h1>Elements with known Melting Points</h1> <xsl:apply-templates select="//MELTING_POINT"/> </body> </html> </xsl:template> <xsl:template match="MELTING_POINT"> <p> <xsl:value-of select=".."/> </p> </xsl:template> </xsl:stylesheet> © FEUP, Maio 2002 XML/XSL 33 Pattern Matching <xsl: template match=“city/building”> XPath • city/building : building cujo pai é city • city//building : building com um antepassado city • ancestor(city)/building : buildings descendentes directos de um antepassado de city • */building : buildings que sejam filhos directos de qualquer elemento • building/* : elementos que tenham como antecedente directo building • ./building : buildings que sejam filhos do nó corrente • ../building : buildings que sejam sibling (filhos do pai) do nó corrente • city|building : buildings ou cities do nó corrente • id(identificador) : elemento marcado com identificador (absoluto) • node() : um nó • text() : um nó de texto (idem para processing-instruction() ) • /ArcWorld/ : caminho absoluto © FEUP, Maio 2002 XML/XSL 34 Testes • • • city[church]/building building[@name] building[@name=“Louvre”] • Outros testes: – not() – first-of-type() – last-of-type() – first-of-any() – last-of-any() – comment() – pi() © FEUP, Maio 2002 : : : buildings das cities com church descendente directo buildings com atributo name buildings com nome Louvre : primeiro sibling do seu tipo : primeiro sibling de qualquer tipo : comentário <!-- --> : processing instruction <? ?> XML/XSL 35 Relacões possíveis © FEUP, Maio 2002 XML/XSL 36 Requisitos p/ um stylesheet XSL • Todos os documentos XSL devem: – Ser documentos XML bem-formados – Cada tag deve usar o namespace xsl: – Começar com a tag <xsl:stylesheet> e acabar com </xsl:stylesheet> (root element) – Dentro da tag inicial o namespace xsl deve ser definido: <xsl: stylesheet xmlns:xsl=“http://www.w3.org/TR/WD-xsl”> – Após o root element podem importar-se ou incluir-se outros dados XSL usando <xsl: include> ou <xsl: import> – Depois podem usar-se quaisquer dos elementos seguintes: <xsl:preserve-space>, <xsl: strip-space>, <xsl: attribute-set>, <xsl:id>, <xsl:macro> ou <xsl:constant>. Sempre ANTES de quaisquer regras nossas usando o elemento <xsl:template> © FEUP, Maio 2002 XML/XSL 37 Elementos • • • • • • • • • • • • © FEUP, Maio 2002 <xsl:for-each> <xsl:if> <xsl:import> <xsl:include> <xsl:key> <xsl:message> <xsl:namespace-alias> <xsl:number> <xsl:otherwise> <xsl:output> <xsl:param> <xsl:preserve-space> XML/XSL 38 Elementos • • • • • • • • • • • © FEUP, Maio 2002 <xsl:processing-instruction> <xsl:sort> <xsl:strip-space> <xsl:stylesheet> <xsl:template> <xsl:text> <xsl:transform> <xsl:value-of> <xsl:variable> <xsl:when> <xsl:with-param> XML/XSL 39 Elementos • • • • • • • • • • • • © FEUP, Maio 2002 <xsl:apply-imports> <xsl:apply-templates> <xsl:attribute> <xsl:attribute-set> <xsl:call-template> <xsl:choose> <xsl:comment> <xsl:copy> <xsl:copy-of> <xsl:decimal-format> <xsl:element> <xsl:fallback> XML/XSL 40 Document Object Model (DOM) DOM 1.0 API © FEUP, Maio 2002 XML/XSL 41 DOM 1.0 • • • • • • Plataforma-neutral Linguagem-neutral API para manipular a estrutura e conteúdo de documentos XML Todas as marcas e declarações de tipos são disponibilizadas Também permite a criação integral de documentos em memória Produtos suportando DOM expõem interfaces para as suas estruturas internas © FEUP, Maio 2002 XML/XSL 42 Fragmento de documento <TABLE> <TBODY> <TR> <TD>Shady Grove</TD> <TD>Aeolian</TD> </TR> <TR> <TD>Over the River, Charlie</TD> <TD>Dorian</TD> </TR> </TBODY> </TABLE> © FEUP, Maio 2002 XML/XSL 43 DOM (Core) • Estabelece um conjunto de definições de objectos – suficientes para representar instâncias contidas em documentos HTML 4.0 e XML1.0 • Programas encontram objectos dos tipos: – – – – Node — um pai e vários filhos Element — conteúdo e lista de atributos DocFragment — nó raiz de um fragmento Document — raiz de um documento standalone • e podem encontrar também: – – – – – © FEUP, Maio 2002 NodeIterator — para iterar num conjunto especificado por um filtro AtributeList — colecção de atributos indexados por nome Attribute — atributo de um elemento DocumentContext — repositório de meta-informação DOM — operações dependentes da instância XML/XSL 44 DOM (XML) • Estende DOM (Core) para suportar DTDs, entidades, CDATA • Os objectos e interfaces de DOM (XML) são suficientes para escrever processadores usando DTDs – XMLNode — métodos adicionais – DocumentType — declarações de tipos de elementos, entidades e notações – ElementDefinition — definição de elemento – AtributeDefinition — atributo dentro de um elemento – ModelGroup — representa o modelo de conteúdo de elemento – EntityDefinition — definição de entidade – EntityReference — referência a entidade – Notation — notação © FEUP, Maio 2002 XML/XSL 45 ArcWorld.xml <?xml version="1.0" ?> <!-- ArcWorld.xml --> <!DOCTYPE ArcWorld SYSTEM "ArcWorld.dtd"> <ArcWorld> <Country name="USA"/> <Country name="France"/> <Country name="China"/> <City name="Washington" country="USA"/> <City name="Paris" country="France"/> <City name="Beijing" country="China"/> <Building name="Lincoln Memorial" city="Washington"/> <Building name="National Gallery" city="Washington"/> <Building name="The Capitol" city="Washington"/> <Building name="Washington Monument" city="Washington"/> <Building name="Arc de Triumph" city="Paris"/> <Building name="Eiffel Tower" city="Paris"/> <Building name="Louvre" city="Paris"/> <Building name="Great Wall" city="Beijing"/> <Building name="Tiananmen" city="Beijing"/> </ArcWorld> © FEUP, Maio 2002 XML/XSL 46 ArcWorld.dom Start document Start element: ArcWorld Text: " " Start element: Country Attribute: name="USA" End element: Country Text: " " Start element: Country Attribute: name="France" End element: Country Text: " " Start element: Country Attribute: name="China" End element: Country Text: " " Start element: City Attribute: name="Washington" Attribute: country="USA" End element: City Text: " " © FEUP, Maio 2002 Start element: City Attribute: name="Paris" Attribute: country="France" End element: City Text: " " Start element: City Attribute: name="Beijing" Attribute: country="China" End element: City Text: " " Start element: Building Attribute: name="Lincoln Memorial" Attribute: city="Washington" End element: Building Text: " " Start element: Building Attribute: name="National Gallery" Attribute: city="Washington" End element: Building ... Start element: Building Attribute: name="Eiffel Tower" Attribute: city="Paris" End element: Building Text: " " Start element: Building Attribute: name="Louvre" Attribute: city="Paris" End element: Building Text: " " Start element: Building Attribute: name="Great Wall" Attribute: city="Beijing" End element: Building Text: " " Start element: Building Attribute: name="Tiananmen" Attribute: city="Beijing" End element: Building Text: " " End element: ArcWorld XML/XSL