1 © feup, maio 2002xml/xsl feup faculdade de engenharia da universidade do porto xsl gabriel david...

Post on 17-Apr-2015

104 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

© FEUP, Maio 2002 XML/XSL

FEUPFaculdade de Engenharia da Universidade do Porto

XSL

Gabriel David

gtd@fe.up.pt

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

top related