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
Download

XSL - Universidade do Porto