Upload
internet
View
104
Download
1
Embed Size (px)
Citation preview
1
© FEUP, Maio 2002 XML/XSL
FEUPFaculdade de Engenharia da Universidade do Porto
XSL
Gabriel David
Porto, Maio de 2002
2
© FEUP, Maio 2002 XML/XSL
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.
3
© FEUP, Maio 2002 XML/XSL
Maneiras de mostrar XML
Autor
DTDFolha de
estilos
Documentos
Apresentação
4
© FEUP, Maio 2002 XML/XSL
Maneiras de mostrar XML
XSLT
XSL
doc
Novodoc
XSLTstylesheet
DTD FO DTD
apresentação
5
© FEUP, Maio 2002 XML/XSL
Maneiras de mostrar XML
6
© FEUP, Maio 2002 XML/XSL
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...)
7
© FEUP, Maio 2002 XML/XSL
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
8
© FEUP, Maio 2002 XML/XSL
XML -> Árvore XML resultante
9
© FEUP, Maio 2002 XML/XSL
Árvores de partida
• Árvore XML para processador XML– Hierarquia de elementos
• Árvore XML para processador XSL– Nó raiz (diferente do elemento raiz)– Elementos– Texto– Atributos– Espaços de nomes– Instruções de processamento– Comentários
10
© FEUP, Maio 2002 XML/XSL
<?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>
<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>
Exemplo
11
© FEUP, Maio 2002 XML/XSL
12
© FEUP, Maio 2002 XML/XSL
Á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
13
© FEUP, Maio 2002 XML/XSL
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”?>
14
© FEUP, Maio 2002 XML/XSL
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}
15
© FEUP, Maio 2002 XML/XSL
Visualizador de XML por omissão (IE5)
16
© FEUP, Maio 2002 XML/XSL
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> </xsl:stylesheet>
Resultado<html><h1>Tabela periodica</h1></html>
17
© FEUP, Maio 2002 XML/XSL
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
18
© FEUP, Maio 2002 XML/XSL
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>
19
© FEUP, Maio 2002 XML/XSL
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)
20
© FEUP, Maio 2002 XML/XSL
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>
21
© FEUP, Maio 2002 XML/XSL
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
22
© FEUP, Maio 2002 XML/XSL
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"/> </body> </html> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <h1>Atomic Number vs. Atomic Weight</h1> <table> <th>Element</th> <th>Atomic Number</th> <th>Atomic Weight</th> <xsl:apply-templates select="ATOM"/> </table>
</xsl:template> <xsl:template match="ATOM"> <tr> <td><xsl:value-of select="NAME"/></td> <td><xsl:value-of select="ATOMIC_NUMBER"/></td> <td><xsl:value-of select="ATOMIC_WEIGHT"/></td> </tr> </xsl:template></xsl:stylesheet>
23
© FEUP, Maio 2002 XML/XSL
Tabela
24
© FEUP, Maio 2002 XML/XSL
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
25
© FEUP, Maio 2002 XML/XSL
Valor de um atributo
<xsl:template match="MELTING_POINT">
<xsl:value-of select="."/>
<xsl:value-of select="@UNITS"/>
</xsl:template>
26
© FEUP, Maio 2002 XML/XSL
Mais valores de nós
• Tipo de nó– Raiz– Elemento
– Texto– Atributo
– Espaço de nomes– Instrução de
processamento– Comentário
• 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
27
© FEUP, Maio 2002 XML/XSL
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>
28
© FEUP, Maio 2002 XML/XSL
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>
29
© FEUP, Maio 2002 XML/XSL
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>
30
© FEUP, Maio 2002 XML/XSL
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>
31
© FEUP, Maio 2002 XML/XSL
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)
32
© FEUP, Maio 2002 XML/XSL
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>
33
© FEUP, Maio 2002 XML/XSL
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
34
© FEUP, Maio 2002 XML/XSL
Testes
• city[church]/building : buildings das cities com church descendente directo
• building[@name] : buildings com atributo name• building[@name=“Louvre”] : buildings com nome Louvre
• Outros testes:– not()– first-of-type() : primeiro sibling do seu tipo– last-of-type()– first-of-any() : primeiro sibling de qualquer tipo– last-of-any()– comment() : comentário <!-- -->– pi() : processing instruction <? ?>
35
© FEUP, Maio 2002 XML/XSL
Relacões possíveis
36
© FEUP, Maio 2002 XML/XSL
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>
37
© FEUP, Maio 2002 XML/XSL
Elementos
• <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>
38
© FEUP, Maio 2002 XML/XSL
Elementos
• <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>
39
© FEUP, Maio 2002 XML/XSL
Elementos
• <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>
40
© FEUP, Maio 2002 XML/XSL
Document Object Model (DOM)
DOM 1.0 API
41
© FEUP, Maio 2002 XML/XSL
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
42
© FEUP, Maio 2002 XML/XSL
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>
43
© FEUP, Maio 2002 XML/XSL
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:– 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
44
© FEUP, Maio 2002 XML/XSL
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
45
© FEUP, Maio 2002 XML/XSL
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>
46
© FEUP, Maio 2002 XML/XSL
ArcWorld.dom
Start documentStart element: ArcWorldText: ""Start element: CountryAttribute: name="USA"End element: CountryText: ""Start element: CountryAttribute: name="France"End element: CountryText: ""Start element: CountryAttribute: name="China"End element: CountryText: "
"Start element: CityAttribute: name="Washington"Attribute: country="USA"End element: CityText: ""
Start element: CityAttribute: name="Paris"Attribute: country="France"End element: CityText: ""Start element: CityAttribute: name="Beijing"Attribute: country="China"End element: CityText: "
"Start element: BuildingAttribute: name="Lincoln Memorial"Attribute: city="Washington"End element: BuildingText: ""Start element: BuildingAttribute: name="National Gallery"Attribute: city="Washington"End element: Building
...
Start element: BuildingAttribute: name="Eiffel Tower"Attribute: city="Paris"End element: BuildingText: ""Start element: BuildingAttribute: name="Louvre"Attribute: city="Paris"End element: BuildingText: ""Start element: BuildingAttribute: name="Great Wall"Attribute: city="Beijing"End element: BuildingText: ""Start element: BuildingAttribute: name="Tiananmen"Attribute: city="Beijing"End element: BuildingText: ""End element: ArcWorld