Escolar Documentos
Profissional Documentos
Cultura Documentos
XML by Example
Lus Ferreira
verso 3.0
Setembro 2014
XML
A verso 3.0 deste documento apresenta:
Algumas correces ortogrficas
Processamento de XML em plataformas especficas;
Comparao entre XML e Json
ndice
ISI
ndice
Figuras .............................................................................................................................................................. 8
Tabelas ........................................................................................................................................................... 10
XML
ndice
PARTE II - XSD
Introduo ......................................................................................................................................................35
Tipos de Dados em XML Schemas ...................................................................................................................35
Simple Types ................................................................................................................................................. 35
Enumerao ............................................................................................................................................. 38
Padres (pattern) ..................................................................................................................................... 40
Espaos em branco (whiteSpaces) ........................................................................................................... 41
Tipos complexos (complexType) ................................................................................................................... 41
Elementos vazios: ..................................................................................................................................... 43
Resumindo: ....................................................................................................................................................... 45
Bibliografia: ....................................................................................................................................................46
Exerccios resolvidos .......................................................................................................................................47
Exerccios propostos .......................................................................................................................................53
ndice
ISI
Navegao ................................................................................................................................................ 73
Indexao de Conjuntos de nodos............................................................................................................ 73
Operaes sobre conjuntos ...................................................................................................................... 74
XML StyleSheets ................................................................................................................................................ 74
xsl:stylesheet ................................................................................................................................................. 74
Referenciar uma StyleSheet ..................................................................................................................... 75
Templates ................................................................................................................................................. 76
Templates por omisso ............................................................................................................................ 77
Exemplo de StyleSheet (I) ......................................................................................................................... 79
Exemplo de StyleSheet (II) ........................................................................................................................ 81
Pattern Matching .......................................................................................................................................... 83
Nodo Raz .................................................................................................................................................. 84
Nodo Elemento ......................................................................................................................................... 84
Nodos Texto .............................................................................................................................................. 85
Matching condicional ............................................................................................................................... 85
Expresses XSLT essenciais ............................................................................................................................... 86
<xsl:value-of> ................................................................................................................................................ 86
<xsl:apply-templates/> ................................................................................................................................. 88
Tutorial XSLT ...................................................................................................................................................... 92
<xsl:value-of> ................................................................................................................................................ 92
<xsl:template> .............................................................................................................................................. 93
<xsl:for-each> ................................................................................................................................................ 94
not ................................................................................................................................................................. 95
<xsl:if> ........................................................................................................................................................... 97
<xsl:choose> .................................................................................................................................................. 99
<xsl:sort> ..................................................................................................................................................... 100
<xsl:element> .............................................................................................................................................. 101
<xsl:number> .............................................................................................................................................. 103
<xsl:param> ................................................................................................................................................. 104
<xsl:variable> .............................................................................................................................................. 105
6
XML
ndice
<xsl:call-template>...................................................................................................................................... 106
document() ................................................................................................................................................. 108
Mltiplos XML/StyleSheets ............................................................................................................................. 112
ANEXO ..........................................................................................................................................................159
Expresses Regulares em XML Schemas ......................................................................................................... 159
Classes de caracteres .................................................................................................................................. 159
Subtraco de Classes de caracteres .......................................................................................................... 160
Alternncia.................................................................................................................................................. 160
Agrupamentos ............................................................................................................................................ 161
Ocorrncias ................................................................................................................................................. 161
Lus Ferreira - IPCA-EST 2014
Figuras
ISI
Figuras
Figura 1 - Hierarquia num documento XML .......................................................................................................... 15
Figura 2 - Processo de transformao via XSL ....................................................................................................... 58
Figura 3 - rvore XML ............................................................................................................................................ 61
Figura 4 - rvore XML ............................................................................................................................................ 64
Figura 5 - Nodo de Contexto .................................................................................................................................. 64
Figura 6 - Todos os descendentes C ....................................................................................................................... 64
Figura 7 - Filhos E do elemento C .......................................................................................................................... 65
Figura 8 - Elementos F filhos de E .......................................................................................................................... 65
Figura 9 - Axes em XPath ....................................................................................................................................... 66
Figura 10 - Resultado de aplicao de uma StyleSheet ......................................................................................... 80
Figura 11 - Resultado de aplicao de uma xsl ...................................................................................................... 81
Figura 12 - Lista de Contactos (I) ........................................................................................................................... 90
Figura 13 - Lista de Contactos (II) .......................................................................................................................... 91
Figura 14 - Exemplo de Aplicao de Multiplos XSL ............................................................................................ 115
Figura 15 - Exemplo PHP/XML: Login................................................................................................................... 121
Figura 16 - Resultado PHP/XSL............................................................................................................................. 126
Figura 17 - Frontend de Gesto do CV ................................................................................................................. 128
Figura 18 - Estrutura de um CV em XML .............................................................................................................. 129
Figura 19 - Dicionrio de termos em XML ........................................................................................................... 130
Figura 20 - Transformao de CV com Javascript ................................................................................................ 130
Figura 21- Estrutura XML de um livro .................................................................................................................. 131
Figura 22 - Classes envolvidas no processamento XML com C# .......................................................................... 133
Figura 23 - Navegar em XML com C# ................................................................................................................... 133
Figura 24 Seleco das seces pertendidas do Livro ...................................................................................... 134
Figura 25 - Preparar Navigator do XML em C# .................................................................................................... 134
XML
Tabelas
Tabelas
ISI
Tabelas
Tabela 1 - Documento XML ................................................................................................................................... 60
Tabela 2 - Abreviao de Axes ............................................................................................................................... 66
Tabela 3 Funes particulares ............................................................................................................................ 67
Tabela 4 - XML StyleSheet indevidamente estruturada ........................................................................................ 83
Tabela 5- Exemplo de Registo XML ...................................................................................................................... 116
Tabela 6 - Exemplo de Template com document() .............................................................................................. 116
10
PARTE I
XML - Extensible Markup Language
DTD Document Type Definition
XML
Apresentao
Apresentao
O XML (Extensible Markup Language) foi criado a partir do Standard Generalized Markup Language (SGML),
procurando evitar o carcter pesado e complexo que caracteriza este standard. Surge fundamentalmente
para descrever a estrutura (dos dados) de documentos. Em XML, os dados, o formato e a estrutura dos
documentos so anotados de forma separada. As regras que controlam a escrita de documentos XML assentam
nos Document Type Definition (DTD) ou XML Schemas (XSD).
Um documento que respeite a norma XML1.0 dever ser construdo baseado em restries sintcticas que
incluem elementos, definies de NameSpaces, atributos, processing instructions (PI), comentrios e texto.
Seguidamente cada um destes elementos sumariamente apresentado.
Breve aluso histrica
1980 SGML - for Standard Generalized Markup Language (1986 ISO-Standard ISO 8879)
Adaptao: A adaptao infinita. Marcaes personalizadas podem ser criadas para qualquer
necessidade.
Manuteno: o XML fcil de manter. Ela contm somente idias e marcaes. Folhas de estilos e
links vm em separado e no embebidas no documento.
Portabilidade: o XML de fcil portabilidade. A razo da sua existncia e expano fora da sua
portabilidade. O mesmo aconteceu com o html no seu incio.
O nmero de recursos opcionais em XML deveria ser mantido num mnimo absoluto, idealmente zero;
Os documentos XML deveriam ser legveis pelos seres humanos e razoavelmente claros;
13
XML
XML Pointer Language (XPointer) e XML Linking Language (XLink): define um padro para
representar os links entre os recursos. Alm dos links simples, como a tag <A> da HTML, o XML possui
mecanismos para ligar recursos mltiplos e diferentes. A XPointer descreve como enderear um
recurso, e o XLink descreve como associar dois ou mais recursos;
Extensible Style Language (XSL): define a linguagem de folhas de estilos padro para o XML.
XML ou Json?
(em desenvolvimento)
Markup
Markup representa o conjunto das marcas ou anotaes utilizadas num documento XML e define a forma de
identificar as distintas partes ou dados de um documento. So essencialmente Elementos. O exemplo seguinte
define uma instncia do elemento trilho.
<trilho>Soajo Castrejo</trilho>
Elementos
Elementos so unidades bem identificadas que definem o essencial de um documento XML. Devem ter um
identificador (nome do elemento) expressivo, comeado por uma letra, underscore (_) ou dois-pontos (:).
Podem tambm conter dgitos (0,19), pontos (.) ou traos (-). Os whitespaces (espao, tabs e CR/LF)
devem ser evitados a no ser na estruturao da escrita do XML.
Maisculas e minsculas so distintas, no existe limitao para o tamanho do nome e no existe nenhum
conjunto pr-definido de nomes de elementos. Um elemento pode conter texto ou outros elementos (sub14
XML
elementos). Possuem uma marca de incio (start-tag) e uma marca de fim (end-tag) de elemento (excepto nos
elementos vazios, nos quais existe uma nica marca, <trilho/>, por exemplo). Entre as duas marcas est o
contedo (texto) desse elemento. A ordem e a precedncia tm de ser respeitadas
Hierarquia de elementos
Como vimos antes, um elemento ao possuir outros elementos constitui uma hierarquia. O topo dessa
hierarquia identificado como a raiz (root). O elemento root de um documento XML constitui o topo de todos
os elementos existentes nesse documento, sendo por isso nico. Cada elemento pode ser anotado com um
conjunto de atributos, cuja a ordem no obrigatria.
Ficha
poca
Nome
Distncia
Tipo
Actividade
Responsvel
Contacto
Datas
Data
Tcnicos
Tcnico
Atributos
Atributos so pares de valores nomeados que ocorrem dentro das marcas de incio aps o nome do elemento.
Por exemplo, o seguinte excerto xml
15
XML
define o elemento trilho com um atributo id cujo valor 1. Em XML, todos os valores de atributos devem
estar entre aspas. Cada elemento pode possuir um ou mais atributos, em qualquer ordem, mas no se podem
repetir dentro do mesmo elemento.
Parsing
O conceito de Parsing est associado necessidade de interpretar o contedo de documentos. No contexto do
XML, o parsing consiste no processo da interpretao do XML no sentido de identificar e distinguir as marcas (o
markup) dos contedos (dados) do documento. Assim tambm possvel verificar a existncia de erros (ex.
sintcticos).
Modelar documentos
Os documentos com estrutura idntica ou similar devem possuir o mesmo tipo de elementos de forma a
constiturem um modelo. Um modelo de documento, para alm de identificar o conjunto de elementos a
utilizar, define um conjunto de regras, quais os elementos permitidos, quais os opcionais, qual a ordem e grau
de ocorrncia, que atributos possuem, etc. Estas regras so armazenadas em ficheiros (no obrigatrios) ditos
validadores. Exemplos destes ficheiros so os Document Type definition (DTD ) e os XML Schemas (XSD). Um
parser responsabiliza-se ento por averiguar se um documento XML respeita ( vlido) as regras explcitas num
documento tipo DTD ou XSD. Mais frente voltaremos a este assunto.
Referncias a Entidades
Na introduo de contedo de um documento XML, poder acontecer, nomeadamente em textos
matemticos, a necessidade de inserir smbolos como o >, <, etc. A fim de evitar confuso com os caracteres <
e > que identificam as marcas XML, estes caracteres tm de ser apresentados de forma particular. Em XML, so
usadas entidades para representar estes caracteres especiais. As entidades podem tambm ser usadas para
referenciar um texto frequentemente repetido ou alterado ou includo no contedo de arquivos externos.
Cada entidade deve ter um nome nico. Para usar uma entidade, referencia-se pelo nome, com & e terminam
com um ponto-e-vrgula (&nome_entidade;).
Por exemplo, a entidade < insere o caracter < no documento. A cadeia de caracteres <element> pode
ser representada num documento XML como <<element>.
16
XML
Para inserir caracteres que no podem ser digitados directamente pelo teclado (caracteres Unicode), utilizamse referncias a caracter, utilizando uma das seguintes formas: referncias decimais, ℞ ou referncias
hexadecimais, ℞. Ambas se referem ao caracter Unicode nmero U+211E. A tabela seguinte resume
algumas das referncias possveis:
>
>
<
<
&
&
'
"
&
&
 
non-breaking space
em HTML
Comentrios
Tal como acontece com o HTML, os comentrios iniciam com <!- e terminam com
-->. Os comentrios no so processados.
<!-- Isto um comentrio -->
documento XML. A palavra chave xml (<?xml ?>). Se existir, esta declarao dever ser escrita no
incio do documento. Vejamos alguns exemplos possveis:
Lus Ferreira - IPCA-EST 2014
17
XML
<?xml version=1.0?>
<?xml version=1.0 encoding=iso-8859-1?> <!- Portugus-->
<?xml version=1.0 encoding=UTF-8 standalone=yes?>
Pode conter vrios parmetros:
Declarao de Markup
A declarao de markup ou Declarao do Tipo de Documento, utilizada para identificar importantes
caractersticas do documento, para criar comentrios, reutilizar partes do documento (entities), para identificar
o DTD ou mesmo cri-lo. A declarao faz-se com os limitadores <! e >. Alguns exemplos possveis:
<!DOCTYPE trilhos SYSTEM trilhos.dtd>
<!DOCTYPE receita SYSTEM http://www.xpto.com/receita.dtd>
<!DOCTYPE receita SYSTEM http://www.xpto.com/receita.dtd
[
]
>
Seces CDATA
Num documento XML, uma seco CDATA permite a utilizao de caracteres especiais, como so o caso da
acentuao, pontuao dos textos, ou os prprios caracteres < e >. Muito til na escrita portuguesa. O seguinte
exemplo mostra isso mesmo:
<!CDATA[
*p = &q;
b = (i <= 3);
]]>
Outro exemplo:
<MarkupSample>
Isto um exemplo correcto de uso XMl com <![CDATA[<tags>]]
</MarkupSample>
18
XML
Entre o incio da seco, <![CDATA[, e o fim da seo, ]]>, todos os caracteres so passados directamente
para a aplicao, sem qualquer interpretao. A nica cadeia de caracteres que no pode ocorrer numa seco
CDATA "]]>".
19
XML
20
XML
Qual o significado deste documento? Embora sintacticamente correcto, este documento no oferece grande
clarividncia naquilo que descreve. Seria bom conseguir definir algumas restries na sequncia e
aninhamento das marcas que se utilizam. Como apresentado antes, isto conseguido atravs de um DTD
Document Type Definition ou XML XSchema (abordado noutro documento desta srie).
Mais genericamente, um DTD corresponde a meta-informao que rege o nome das marcas passveis de
utilizar, as suas possveis sequncias e aninhamentos, os valores dos seus atributos e seus tipos e padres, os
nomes de arquivos externos que podem ser referenciados e se eles podem ou no conter XML, o formato de
algum dado (no-XML) externo que pode ser referenciado e as entidades que podem ser encontradas.
H quatro tipos de definies em XML: definies de tipos de elementos, declaraes de listas de atributos,
definies de entidades e definies de notaes.
21
XML
Esta declarao identifica o elemento com nome percursos, com um modelo de contedo (parte entreparntesis) que define aquilo que um elemento pode conter, neste caso, um contacto, um tipo
(opcional) e vrios percurso. As vrgulas entre os nomes dos elementos indicam que eles devem ocorrer
nessa ordem. O sinal de adio aps percurso indica que ele pode ser repetido mais do que uma vez, mas
deve ocorrer pelo menos uma vez. O ponto de interrogao aps o elemento tipo? indica que ele opcional
(pode estar ausente ou ocorrer somente uma vez). Um nome sem pontuao, como contacto, deve ocorrer
somente uma vez. O quadro seguinte resume a cardinalidade que possvel representar em DTDs.
A?
A opcional
A*
Zero ou mais As
A+
Um ou mais As
A,B
Um A seguido de um B
Alm dos nomes de elementos, o smbolo especial #PCDATA reservado para indicar texto. A clusula
PCDATA significa texto interpretvel (Parsed Character Data) e aplica-se na definio de elementos.
Os elementos que contm s outros elementos so ditos como tendo contedo de elementos. Os elementos
que contm outros elementos e #PCDATA, tm contedo misto.
Por exemplo, uma definio possvel para Nome poder ser
<!ELEMENT Nome (#PCDATA | Apelido)*>
A barra vertical | indica um relacionamento "ou" e o asterisco indica que o contedo opcional (pode ocorrer
zero ou mais vezes); desta definio, portanto, Nome pode conter zero ou mais caracteres e marcas Apelido,
misturadas em qualquer ordem. Todos os modelos de contedo misto devem ter esta forma: #PCDATA deve
aparecer primeiro, todos os elementos devem ser separados por barras verticais e o grupo inteiro deve ser
opcional.
Outros dois modelos de contedo possveis so: EMPTY que indica que o elemento no possui contedo (e,
consequentemente, no necessita de ter marca de fim de elemento) e ANY que indica que qualquer contedo
22
XML
permitido. O modelo de contedo ANY pode ser til durante a anlise de documentos, mas deve ser evitado
ao mximo numa verso final de um validador.
Neste exemplo, o elemento percurso possui trs atributos: id, que do tipo ID e obrigatrio; tipo, que
uma das quatro palavras enumeradas e no obrigatrio; e grau, que poder ser um dos cinco dgitos
apresentados e que, caso nenhum valor seja especificado, ter o valor 1.
Existem seis tipos de atributos possveis:
1. CDATA
Atributos CDATA representam um conjunto de caracteres; qualquer texto permitido. No confundir
atributos CDATA com seces CDATA.
2. ID
O valor de um atributo ID deve ser um nome. Todos os valores usados para IDs num documento so
nicos, ie, no podem ser repetidos.
3. IDREF
ou IDREFS
O valor de um atributo IDREF deve ser o valor de um nico atributo ID de algum elemento no documento. O
valor de um atributo IDREFS pode conter valores IDREF mltiplos separados por espaos em branco.
4. ENTITY
ou ENTITIES
O valor de um atributo ENTITY deve ser o nome nico de uma entidade. O valor de um atributo ENTITIES pode
conter valores de entidades mltiplos separados por espaos em branco.
5. NMTOKEN
ou NMTOKENS
23
XML
Atributos de smbolos de nome so uma forma restrita do atributo de cadeia de caracteres. Em geral, um
atributo NMTOKEN deve consistir de uma nica palavra, mas no h restries adicionais para a palavra; no
tem que estar associado com outro atributo ou declarao. O valor de um atributo NMTOKENS pode conter
valores NMTOKEN mltiplos separados por espaos em branco.
6. Uma lista de nomes
Pode especificar-se o conjunto de valores possveis de atributo. feito atravs de enumerao dos nomes
pretendidos.
H quatro valores padro possveis:
#REQUIRED
O atributo deve ter um valor explicitamente especificado em cada ocorrncia do elemento no documento.
#IMPLIED
O valor do atributo no obrigatrio, e nenhum valor padro fornecido.
"valor"
Qualquer valor vlido pode ser dado a um atributo como padro. O valor do atributo no obrigatrio.
#FIXED
"value"
Uma declarao de atributo pode especificar que um atributo tem um valor fixo. Neste caso, o atributo no
obrigatrio, mas se ele ocorrer deve ter o valor especificado. Se no estiver presente, ser dado a ele o valor
padro.
O processador XML executa a normalizao dos valores dos atributos nos valores dos atributos: as referncias
de caracter so substitudas por caracteres referenciados, referncias a entidades so resolvidas
(recursivamente) e espaos em branco so normalizados.
Definies de Entidades
As definies de entidades permitem associar um nome com algum outro fragmento de contedo. Essa
construo pode ser um pedao de texto normal, um pedao de uma declarao de tipo de documento ou uma
referncia a um documento externo que contm ou texto ou dados binrios.
<!ENTITY IPCA
<!ENTITY extDoc
<!ENTITY IPCAlogo
SYSTEM
"/standard/legalnotice.xml">
24
XML
Entidades internas associam um nome com uma cadeia de caracteres ou texto literal. A definio de IPCA no
caso anterior um exemplo de entidade interna. Usando &IPCA; em qualquer lugar do documento inserir
"Instituto Politcnico do Cvado e do Ave " naquele local.
Entidades internas podem incluir referncias para outras entidades internas, mas errado elas serem
recursivas.
A especificao XML pr-define cinco entidades internas:
< produz o sinal de menor, <
> produz o sinal de maior, >
& produz o E comercial, &
' produz um apstrofo, '
" produz aspas, "
Entidades Externas
Entidades externas associam um nome com o contedo de um outro documento. Permitem ao documento
XML referenciar o contedo de um outro documento; elas contm ou texto ou dados binrios. Se elas contm
texto, o contedo do documento externo inserido no ponto de referncia e analisado como parte do
documento referente. Dados binrios no so analisados e podem somente ser referenciados num atributo;
eles so usados para referenciar figuras e outro contedo no-XML no documento.
extDoc e IPCAlogo so exemplos de entidades externas.
O uso de &extDoc; inserir o contedo do arquivo /standard/ legalnotice.xml no local da
referncia da entidade. O processador XML analisar o contedo deste arquivo como se ele ocorresse
literalmente no local.
A entidade IPCAlogo tambm uma entidade externa, mas o seu contedo binrio. A entidade
IPCAlogo pode ser usada somente como o valor de um atributo ENTITY (ou ENTITIES) (num elemento
graphic, talvez). O processador XML passar esta informao para a aplicao, mas ele no tenta processar o
contedo de /images/logo.gif.
Entidades Parmetro
Uma entidade parmetro s pode ocorrer na declarao de tipo de documento. Uma declarao de uma
entidade parmetro identificada por "% " (porcento e espao) a seguir ao seu nome na declarao. O sinal de
% tambm usado em referncias para entidades parmetro, ao invs do &. As referncias a entidade
parmetro so imediatamente expandidas na declarao de tipo de documento e o seu texto de substituio
parte da declarao, onde as referncias a entidades normais no so expandidas. Entidades parmetro no
so reconhecidas no corpo de um documento.
Lus Ferreira - IPCA-EST 2014
25
XML
26
XML
Resumo
Identificao da linguagem
Muitas aplicaes de processamento de documentos podem beneficiar da informao sobre a linguagem
natural com a qual o documento foi escrito. O XML define o atributo xml:lang para identificar a linguagem.
Visto que o propsito deste atributo padronizar a informao entre as aplicaes, a especificao XML
tambm descreve como as linguagens devem ser identificadas.
Resumo
Os documentos XML so compostos por marcas e contedos. Existem seis tipos de marcas que podem ocorrer
num documento XML. So elas elementos, referncias a entidades, comentrios, instrues de processamento
(PI), seces marcadas e definies de tipos de documento (DTD).
<?xml version="1.0"?>
<!DOCTYPE actividades SYSTEM "actividade.dtd">
<actividades ano="2003" by="lufer">
<actividade id="1" tipo="caminhada">
<nome>Caminhada Sombra</nome>
<distancia units="km">8</distancia>
<dificuldade>1</dificuldade>
<epoca>Verao</epoca>
<datas>
<data>12-06</data>
<data>14-07</data>
</datas>
<track tipo="gps">waypoints_soajo.txt</track>
<tecnicos>
<nome>Lufer</nome>
</tecnicos>
</actividade>
<actividade id="3" tipo="tt">
<nome>Rota do Geres</nome>
<distancia units="km">140</distancia>
<dificuldade>2</dificuldade>
<epoca>Primavera</epoca>
<datas>
<data>10-04</data>
</datas>
<track tipo="roadbook">roadbook_geres.txt</track>
<tecnicos>
<nome>Romeu</nome>
<nome>Lufer</nome>
</tecnicos>
Lus Ferreira - IPCA-EST 2014
27
Bibliografia
XML
</actividade>
</actividades>
Bibliografia
URLs
http://www.xmlfiles.com
http://www.4guysfromrolla.com/webtech/xml.shtml
http://www.topxml.com
http://www.ipca.pt/prof/lufer/2005-2006/sia/
Outros URLs
o
http://www.w3.org/TR/charmod/
28
http://www.unicode.org/charts/symbols.html
http://www.kerrycomputers.com/ref/xml/index.htm
XML
Exerccios resolvidos
http://www.cs.tut.fi/%7Ejkorpela/perl/regexp.html
Exerccios resolvidos
1.
Resoluo
<entrada numero=24 data=02-03-2006>
...
</entrada>
2.
Represente num documento XML a hierarquia de um Livro com ndice, Captulos, Autor e Anexos. O
Autor possui um nome e um endereo.
Resoluo
<livro>
<ndice> </ndice>
<capitulos>
<capitulo> </capitulo>
<capitulo> </capitulo>
</capitulos>
<autor>
<nome> </nome>
<ender> </ender>
</autor>
</livro>
3.
Defina uma instncia de um documento XML capaz de ser validado pelo seguinte DTD:
<!ELEMENT A (B,C,D?)>
<!ELEMENT B (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT D (B | #PCDATA)*>
Resoluo
<A>
<B> </B>
<C> </C>
<D>
<B> </B>
<B> </B>
</D>
</A>
29
Exerccios propostos
4.
XML
epoca,
Exerccios propostos
1.
2.
Um veculo automvel
Uma Receita
Um catlogo de CDs
Um animal
30
XML
Exerccios propostos
3.
4.
Elabore um documento XML que descreva uma biblioteca. Defina tambm um documento DTD que o
certifique.
31
PARTE II
XSD - XML Schemas
XSD
Introduo
Introduo
Este documento constitui a segunda parte do documento Tecnologias XML e vai debruar-se sobre validao
de documentos XML com XML Shchemas. Na primeira parte foram abordados os conceitos fundamentais da
linguagem de Markup XML e validadores DTD.
Para complemento deste documento, recomenda-se a leitura atenta e com calma das recomendaes W3C
Recomendation sobre Xml schemas.1
Um XML Schema (doravante abreviado por XSD) mais uma forma de validar um documento XML.
Contrapondo com os Document Type Definition (DTD), os XSD so eles prprios escritos em XML e, uma vez
que sero validadores, tero de salvaguardar as condies sobre os elementos, os atributos e os contedos. Os
XSD j permitem controlar o tipo de contedo e a forma com podem ser escritos, i.e., alguma semntica passa
a ser garantida
Existem tipos de dados, expresses regulares, etc, tudo mecanismos que tornam esta
tecnologia bem mais poderosa que os DTD, mas tambm mais complexa.
vlido
<name>Porto 2007</name>
invlido
Simple Types
atomic:
list:
union:
http://www.w3.org/TR/xmlschema-0/.
35
XSD
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="18"/>
</xsd:restriction>
</xsd:simpleType>
Qualquer simpleType uma restrio de um outro simpleType, dito como o seu tipo base. Um simpleType no
pode ser expandido (extended), a no ser adicionando atributos. Neste caso resulta num complexType.
O seguinte exemplo mostra um simpleType derivado do tipo atmico integer:
<xsd:simpleType name="SizeType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="18"/>
<xsd:pattern value="\d{1,2}"/>
</xsd:restriction>
</xsd:simpleType>
Neste caso, restringe-se SizeType a um conjunto de dois inteiros entre os valores 2 e 18.
O exemplo seguinte mostra um outro simpleType derivado de um outro tipo construdo (SizeType),
<xsd:simpleType name="MediumSizeType">
<xsd:restriction base="SizeType">
<xsd:minInclusive value="8"/>
<xsd:maxInclusive value="12"/>
</xsd:restriction>
36
XSD
</xsd:simpleType>
Um tipo derivado tem de ser mais restrito que o seu tipo base. No exemplo seguinte tal no respeitado.
<xsd:simpleType name="SmallDSizeType">
<xsd:restriction base="SizeType">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="6"/>
</xsd:restriction>
</xsd:simpleType>
Sempre que se pretenda evitar que determinado regra seja restrita, deve utilizar-se activar o atributo fixed.
Somente as facetas enumeration e pattern que no podem ser fixadas2. Por exemplo,
<xsd:simpleType name="SizeType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2" fixed="true"/>
<xsd:maxInclusive value="18" fixed="true"/>
<xsd:pattern value="\d{1,2}"/>
</xsd:restriction>
</xsd:simpleType>
Caso se pretenda permitir valores vazios (empty) num dado elemento (a maioria dos tipos atmicos no
permitem valores nulos). Para conseguir isto pode utilizar uma unio (union) onde refira o tipo que pretende
(tipo inteiro xsd:integer) e a string nula (). Por exemplo,
<xsd:simpleType name="SizeType">
<xsd:union>
<xsd:simpleType>
<xsd:restriction base=xsd:integer>
<xsd:minInclusive value="8"/>
<xsd:maxInclusive value="12"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:simpleType>
<xsd:restriction base=xsd:string>
<xsd:enumeration value=/>
</xsd:restriction>
<xsd:simpleType>
2
37
XSD
</xsd:union>
</xsd:simpleType>
Nota:
As facetas totalDigits e fractionDigits permitem controlar o nmero mximo de dgitos de um nmero e o
mximo de dgitos na parte decimal de um nmero, respectivamente. totalDigits deve ser um nmero positivo.
fractionDigits aplica-se a nmeros decimais (xsd:decimal).
Enumerao
Permite especificar o conjunto de valores possveis para um dado elemento. O valor enumerado tem de ser
nico e tem de ser vlido para o tipo base. Veja os seguintes exemplos:
<xsd:simpleType name="SMLXSizeType">
<xsd:restriction base="xsd:token">
<xsd:enumeration value="small"/>
<xsd:enumeration value="medium"/>
<xsd:enumeration value="large"/>
<xsd:enumeration value="extra large"/>
</xsd:restriction>
</xsd:simpleType>
38
XSD
<xsd:enumeration value="large"/>
<xsd:enumeration value="extra large"/>
</xsd:restriction>
</xsd:simpleType>
Trata-se de uma restrio invlida pois pretende acrescentar mais um valor que no faz parte do conjunto
inicial. Como o posso fazer ento para acrescentar mais um valor numa restrio? Atravs de um tipo union.
Vejamos:
<xsd:simpleType name="XSMLXSizeType">
<xsd:union memberTypes="SMLXSizeType">
<xsd:simpleType>
<xsd:restriction base="xsd:token">
<xsd:enumeration value="extra small"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
S no sero vlidas no caso em que o tipo base seja string, isto porque a string 2 diferente de 02.
39
XSD
Padres (pattern)
Permite restringir valores para um determinado padro, seguindo Expresses Regulares3, utilizando a faceta
xsd:pattern. No exemplo seguinte,
<xsd:simpleType name="DressSizeType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="18"/>
<xsd:pattern value="\d{1,2}"/>
</xsd:restriction>
</xsd:simpleType>
restringe-se aos inteiros de um ou dois dgitos, compreendidos entre 2 e 18. Para restringir um pattern deve-se
usar o classificador xsd:restriction como se mostra no seguinte exemplo:
<xsd:simpleType name="SmallDressSizeType">
<xsd:restriction base="DressSizeType">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="6"/>
<xsd:pattern value="\d{1}"/>
</xsd:restriction>
</xsd:simpleType>
Neste caso, o tamanho agora admitido condiciona a valores com um dgito. Uma instncia possvel poder ser:
<valor>4</valor>
<valor>3</valor>
40
XSD
</xsd:simpleType>
replace: substitui todas as ocorrncias de tabs (#x0), linefeed (#xA) e carriage return (#xD) por um
espao simples (#x20).
collapse: Tal como em replace. Mas neste caso se existirem vrias ocorrncias consecutivas de
espaos, so colapsadas a um.
string
normalizedstring
token
Ola mundo
Ol mundo
Ol mundo
Ol mundo
Ol
Ol
Ol mundo
Ol mundo
Mundo
Mundo
Ol..mundo
Ol..mundo
Ol.mundo
Ol.mundo
->
->
->
Ol mundo
Ol mundo
..Ol mundo
Ol mundo
..Ol mundo
Ol mundo
..Ol mundo
Ol mundo
41
XSD
<xsd:restriction base="string">
<enumeration value="lufer" />
</xsd:restriction>
</xsd:simpleType>
Se agora pretendermos colocar um atributo neste elemento, temos de decidir se queremos ou no que existam
outros elementos na sua definio. Vamos supor que no. Ento ficaria:
<xsd:complexType name="novoMeuNomeType">
< xsd:simpleContent>
< xsd:extension base="nomeType ">
< xsd:attribute name="apelido" type=" xsd:string" />
</ xsd:extension>
</ xsd:simpleContent>
</ xsd:complexType>
42
XSD
Elementos vazios:
Numa lgica semelhante, retiram-se as regras para o contedo. UM elemento vazio no pode possuir
elementos.
<xsd:complexType name="novoMeuNomeType">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:attribute name="apelido" type="string" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Simplificando,
<xsd:complexType name="novoMeuNomeType">
<xsd:attribute name="apelido" type="string" />
</xsd:complexType>
43
XSD
<xsd:restriction base="xsd:anyType">
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="novoMeuNomeType"/>
44
XSD
Resumindo:
Tipos de Dados intrnsecos ao XML Schema:
45
Bibliografia:
XSD
no
complexType
simpleType
Ter elementos?
Derivado por:
sim
complexContent
(permite elementos, texto
e atributos)
Derivado por:
<restriction>
contedo?
atributos?
</restriction>
ou
<extention>
contedo?
atributos?
</extension>
<restriction>
ou
<list>
ou
<union>
no
simpleContent
(permite texto e atributos)
Derivado por:
<restriction>
<simpleType>
facetas?
atributos?
</restriction>
ou
<extention>
contedo?
atributos?
</extension>
Bibliografia:
1.
DVD da Disciplina
2.
3.
4.
URLs
46
http://www.xml.com/pub/a/2001/08/22/easyschema.html
http://www.w3c.org
http://www.xmlfiles.com
http://www.4guysfromrolla.com/webtech/xml.shtml
XSD
Exerccios resolvidos
http://www.topxml.com
Exerccios resolvidos
1.
1.1
Resposta possvel:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!Elementos -->
<xs:element name="dificuldade" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="epoca" type="xs:string"/>
<xs:element name="nome" type="xs:string"/>
<xs:element name="telef" type="xs:string"/>
<!-- Tipos de dados -->
47
Exerccios resolvidos
XSD
<xs:complexType name="contactoType">
<xs:sequence>
<xs:element ref="nome"/>
<xs:element ref="email"/>
<xs:element ref="telef"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="distanciaType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="units" type="xs:string"
use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="percursoType">
<xs:sequence>
<xs:element ref="nome"/>
<xs:element name="distancia" type="distanciaType"/>
<xs:element ref="dificuldade"/>
<xs:element ref="epoca"/>
<xs:element name="track" type="trackType"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="tipo" type="xs:string" use="required"/>
<xs:attribute name="grau" type="xs:boolean" use="required"/>
</xs:complexType>
<xs:element name="percursos">
<xs:complexType>
<xs:sequence>
<xs:element name="contacto" type="contactoType"/>
<xs:element name="percurso" type="percursoType"/>
</xs:sequence>
<xs:attribute name="by" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
48
XSD
Exerccios resolvidos
<xs:complexType name="trackType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="tipo" type="xs:string"
use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
2.
49
Exerccios resolvidos
XSD
2.1
Resposta possvel:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="unqualified">
<xsd:element name="City" type="xsd:string"/>
<xsd:element name="Conditions" type="xsd:string"/>
<xsd:element name="ContractText" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Term" type="xsd:string"/>
<xsd:complexType name="AuthorisationType">
50
XSD
Exerccios resolvidos
<xsd:simpleContent>
<xsd:restriction base="xsd:string">
<xsd:attribute name="authorisationCode"
type="xsd:string"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="Contract">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Title"/>
<xsd:element name="Parties" type="PartiesType"/>
<xsd:element name="ContractAgreement"
type="ContractAgreementType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="ContractAgreementType">
<xsd:sequence>
<xsd:element name="ContractBody" type="ContractBodyType"/>
<xsd:element name="Authorisation" type="AuthorisationType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ContractBodyType">
<xsd:sequence>
<xsd:element name="Terms" type="TermsType"
maxOccurs="unbounded"/>
<xsd:element ref="Conditions" maxOccurs="unbounded"/>
<xsd:element ref="ContractText" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ContractorType">
<xsd:sequence>
<xsd:element ref="Name"/>
<xsd:element name="Address" type="AddressType"/>
<xsd:element name="ContactMethod" type="ContactMethodType"/>
</xsd:sequence>
51
Exerccios resolvidos
XSD
</xsd:complexType>
<xsd:complexType name="AddressType">
<xsd:sequence>
<xsd:element name="Office" type="xsd:string"/>
<xsd:element name="Street" type="xsd:string" maxOccurs="2"/>
<xsd:element name="City" type="xsd:string"/>
<xsd:element ref="Province" minOccurs="0"/>
<xsd:element name="Code" type="CodeType"/>
<xsd:element ref="Country" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Province">
<xsd:complexType>
<xsd:choice>
<xsd:element name="County" type="xsd:string"/>
<xsd:element name="State" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="CodeType">
<xsd:choice>
<xsd:element name="PostCode" type="xsd:string"/>
<xsd:element name="ZipCode" type="xsd:integer"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="ContactMethodType">
<xsd:annotation>
<xsd:documentation>Utilize o atributo PreferredContact
indicar o contacto preferido</xsd:documentation>
para
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Email" type="xsd:string" minOccurs="0"/>
<xsd:element name="Fax" type="xsd:string" minOccurs="0"/>
<xsd:element name="Telephone" type="xsd:integer"/>
</xsd:sequence>
<xsd:attribute name="PreferredContact" type="xsd:string"/>
</xsd:complexType>
52
XSD
Exerccios propostos
<xsd:element name="Country">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="UK"/>
<xsd:enumeration value="USA"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:complexType name="PartiesType">
<xsd:sequence>
<xsd:element name="Contractor" type="ContractorType"/>
<xsd:element name="Contractee" type="ContractorType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TermsType">
<xsd:sequence>
<xsd:element ref="Term" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Title" type="xsd:string"/>
</xsd:schema>
Exerccios propostos
Defina um XML Schema para cada um dos seguintes contextos:
Um curso do IPCA
Um armazm de stocks
53
PARTE III
XSLT - XML StyleSheets Transformation
XSD
Introduo
Introduo
Este documento constitui a terceira parte deste documento Tecnologias XML. Na primeira parte foram
abordados os conceitos fundamentais da Linguagem de Markup XML e a sua validao com DTD. Na segunda
parte foi abordado a validao de documentos XML por XML Schemas. Nesta terceira parte sero abordados os
principais fundamentos da tecnologia de transformao de XML via XML StyleSheets, vulgo XSLT.
XSLT
Basicamente o XSL (conjunto de tecnologias XSLT + XSL-FO + XPath) corresponde forma tecnolgica de
processamento de documentos XML noutro tipo de documento. A estrutura de um documento XSL (muitas
vezes tambm dito documento XSLT), ao ser um documento em XML, ter de respeitar todas as regras
sintcticas inerentes a este tipo de documentos. O NameSpace associado corresponde na generalidade dos
casos ao URL: http://www.w3.org/1999/XSL/Transform. Convencionou-se utilizar xsl como prefixo.
Um documento XML original mapeado numa estrutura em rvore. Um motor XSL percorre toda essa rvore
e vai analisando nodo a nodo com todas as instrues presentes na XML Stylesheet. O resultado ser uma nova
rvore XML que ser posteriormente serializada na aplicao final (que, por exemplo, poder ser um browser,
caso se tenha gerado HTML). A Figura 2 procura representar este processo.
Sendo a maioria dos casos aplicados a sistemas na Web (temtica a explorar mais frente), existem trs
hipteses de contextos no processamento de um documento XML atravs de uma stylesheet. O quadro
seguinte apresenta-os:
57
XSLT
XSD
58
XSD
XSLT
<font face=areal>Titulo</font>
<xsl:text>Titulo</xsl:text>
Ttulo
A execuo do seguinte template de uma stylesheet (cuja explicao detalhada vir mais frente),
XPath
Para entender de forma adequada como implementar uma XML stylesheet e como a aplicar a um documento
XML, essencial entender como se percorre (muitas vezes dito navega) numa rvore de num documento XML.
Tal como apresentado na primeira parte desta sebenta, um documento XML deve ser visto como estruturado
em forma de rvore invertida (Tabela 1 e Figura 3).
semelhana do que acontece com o sistema de ficheiros de vrios sistemas operativos, existem vrias regras
e alternativas de caminhar pelos diferentes caminhos (paths) entre os diferentes ficheiros (aqui elementos,
atributos ou valores). A linguagem XPath uma linguagem XML que implementa o conjunto de regras que
regem este processo e suporta os mtodos capazes de aplicar determinadas operaes sobre estes caminhos.
59
XSLT
XSD
/actividades/actividade
/actividades/ano
/actividades/actividade/../by
./actividade/tecnicos/nome
/actividade/actividades/tipo
/actividades/tipo
uma vez que, analisando a rvore do documento, deparamos com uma sequncia de elementos que no est
correcta. Por exemplo, o elemento actividade no tem nenhum descendente actividades.
60
XSD
XSLT
(<a></a>)
http://www.w3.org/TR/xpath
61
XSLT
XSD
Atributo
(<a x=v>..</a>)
Comentrio
(<!-- -->)
Processing Instruction
(<?..?>)
NameSpace
(xsl:template </xsl:templates)
Texto
(<actividade>BTT</actividade)
Nota:
elemento raiz versus nodo raiz
O elemento raiz representa todo o documento. o primeiro elemento da rvore XML. O nodo raiz
representa o acesso a todo documento.
O nodo raiz representa-se por / e o elemento raiz pelo nomo do primeiro elemento da rvore. No nosso
exemplo <actividades>..</actividades)
Expresses
Uma expresso XPath representa o percurso a percorrer na rvore XML e a aco a executar aquando a
execuo desse percurso.
Exemplo: encontrar o nome dos tcnicos das actividades do tipo BTT que so realizadas no vero:
Expresso XPath:
/actividades/actividade[@tipo=BTT and epoca=Vero]/tcnicos/nome
Para interpretar devidamente uma expresso XPath essencial ter em ateno alguns conceitos adicionais,
nomeadamente o conceito de Nodo (ou Posio) de Contexto.
Como j referimos anteriormente, uma expresso XPath deve indicar a posio na rvore XML por onde
comear (nodo de contexto) o percurso, a direco a percorrer e o critrio de seleco ou identificao. O
nodo que indica por onde comear a avaliar a expresso constitui o Nodo de Contexto, que poder ser:
O nodo corrente: o nodo na rvore origem para o qual se aplicou a expresso (acedido por .)
Uma posio: a posio de um nodo na lista de nodos a serem processados (acedido por
position())
62
XSD
XSLT
Convm ainda referir que, tal como acontece com a Path de um SO, os caminhos entre nodos podem ser
absolutos ou relativos.
Absolutos: comeam numa localizao conhecida como a raz (/) ou um nodo particular
(identificado por um ID)
Direco de navegao/especificao
o
Qualificao
o
valor
/actividades/actividade[@tipo=BTT][3]>
path
nodo de teste
predicado
teste de posio
63
XSLT
XSD
Analisemos alguns exemplos de expresses XPath atravs do seguinte documento XML (representado em
rvore):
64
XSD
XSLT
Nas primeiras verses de XPath, a um conjunto de nodos resultante da aplicao de uma expresso XPath
denominava-se Axis. Embora nas verses actuais ainda se possa utilizar essa nomenclatura (e em alguma
bibliografia ainda se utiliza), algum dos nomes de predicados (Figura 9 ) foram abreviados por expresses mais
simples7.
65
XSLT
XSD
Expresso Axis
Expresso abreviada
self::node()
parent:node()
..
descendant-or-self::node()/
//
/child::rcp:collection/child::rcp:recipe/child::rcp:ingredient
rcp:collection/rcp:recipe/rcp:ingredient
/child::rcp:collection/child::rcp:recipe/child::rcp:ingredient/attri
rcp:collection/rcp:recipe/rcp:ingredient/
bute::amount
@amount
Tabela 2 - Abreviao de Axes
O resultado da aplicao de uma expresso XPath deriva sempre ou num conjunto de nodos ou no conjunto de
valores atmicos (numricos, boleanos, strings, tipos). Cada nodo no conjunto identificado e pode por isso
ser manipulado.
Descrio
Operador Filho; selecciona o filho directo da coleco esquerda. Quando este operador
inicia a expresso, refere-se ao nodo raiz.
//
66
XSD
XSLT
@*
()
[]
[]
Funes
Descrio
node()
Nodo corrente (pode ser elemento, texto, atributo, PI, comentrio, NameSpace)
text()
comment()
Comentrio
processing-instruction()
name()
Expresses Literais
Representam valores atmicos.
Exemplos:
123
123.4
Viva o Benfica
6.12E3
O Benfica o maior
67
XSLT
XSD
Expresses Aritmticas
Representam expresses com valores numricos. Operadores:
+
Adio.
Subtraco.
div
diviso em vrgula-flutante
Multiplicao.
mod
Exemplo: //quantidade[2]*2
Multiplica por 2 o valor do segundo elemento quantidade.
Referncia a variveis
Uma varivel define-se em XSLT (a analisar a seguir). Acede-se ao seu valor atravs do smbolo $.
Exemplos:
$total*2
($total+2)-//quantidade/[2]
Sequncia de Expresses
Para associar expresses utiliza-se o operador ,
Domnios de inteiros podem ser definidos atravs do operador to
Existem os operadores: union, intercept e except
Exemplos:
1 to 9
1,2,3,4,5,6,7,8,9
(1,2,3),4,5,6,7,(8,9)
68
XSD
XSLT
Expresses de Filtragem
Combinando operadores em predicados
O operador . Representa o nodo contexto
Exedmplo:
(10 to 40)[. mod 5 = 0 and position()>20]
d como resultado:
30,35,40
Comparao de Valores
69
XSLT
XSD
Expresses Boleanas
Operadores: and, or, not
Funes: true(), false()
Exemplos:
author[degree and award]
author[degree and not(publication)]
degree[@from != "Harvard"]
Funes8
Existe um conjunto vasto de funes agrupadas por domnio de actuao, tais como: strings, valores
numricos, valores booleanos, etc9.
Exemplos:
Funes aritmticas
abs(-23.4) = 23.4
ceiling(23.4) = 24
floor(23.4) = 23
round(23.4) = 23
round(23.5) = 24
Funes Booleanas
not(0) = true()
not(true()) = false()
not("") = true()
not((1)) = false()
8
9
70
http://www.w3.org/2004/07/xpath-functions
Consultar lista significativa de funes em http://www.stylusstudio.com/docs/v60/d_xpath86.html#wp919260
Lus Ferreira - IPCA-EST 2014
XSD
XSLT
Funes RegExp
contains("XML book","XML") = true()
matches("XML book","XM..[a-z]*") = true()
matches("XML book",".*Z.*") = false()
replace("XML book","XML","Web") = "Web book"
replace("XML book","[a-z]","8") = "XML 8888"
Funes de Cardinalidade
exists(()) = false()
exists((1,2,3,4)) = true()
empty(()) = true()
empty((1,2,3,4)) = false()
count((1,2,3,4)) = 4
count(//actividade) = 5
Funes de Sequncias
distinct-values((1, 2, 3, 4, 3, 2)) = (1, 2, 3, 4)
insert-before((2, 4, 6, 8), 2, (3, 5)) = (2, 3, 5, 4, 6, 8)
Lus Ferreira - IPCA-EST 2014
71
XSLT
XSD
Funes de coeso
xs:integer("5") = 5
xs:integer(7.0) = 7
xs:decimal(5) = 5.0
xs:decimal("4.3") = 4.3
xs:decimal("4") = 4.0
xs:double(2) = 2.0E0
xs:double(14.3) = 1.43E1
xs:boolean(0) = false()
xs:boolean("true") = true()
xs:string(17) = "17"
xs:string(1.43E1) = "14.3"
xs:string(true()) = "true"
Tutorial XPath
De seguida apresentamos um conjunto de exemplos de expresses XPath no intuito de demonstrar a
respectiva aplicabilidade sobre documentos XML. Vamos continuar a utilizar o nosso exemplo sobre
Actividades Desportivas.
Expresso XPath
Resultado
./actividade
actividades//actividade
72
XSD
XSLT
//actividade[3]
terceira actividade
Expresso XPath
./actividade/@tipo
Resultado
valores dos atributos tipo de todos os elementos actividade existentes a
partir da posio actual
//actividade[@tipo=BTT]
Expresso XPath
Resultado
./actividade[../@ano=2003]/nome
//epoca[.=Primavera]/../tipo
Navegao
Expresso XPath
Resultado
/actividades/*/nome
//actividade/*
Expresso XPath
Resultado
/actividades/actividade[3]
//actividades/actividade[last()]
73
XSLT
XSD
//track[@tipo="gps"]/text()
Expresso XPath
Resultado
count(//actividade)
sum(//actividade[@tipo=caminhada]/distancia)
//track[@tipo="gps"]/text()
Estes e vrios outros exemplos sero de novo explorados aquando a explanao do conceito de XSL
Templates, no captulo que se segue.
XML StyleSheets
Falta agora perceber como estruturar ento uma XML Stylesheet e como aplicar a as expresses XPath.
xsl:stylesheet
O elemento xsl:stylesheet (ou xsl:transform) constitui a raiz de uma XML stylesheet, i.e., o primeiro elemento
aps a raiz do documento e o Prolog xml. Possui dois atributos obrigatrios: version e xmlns. Assim, a estrutura
base de uma XML Stylesheet pode ser vista como:
ou
Na essncia uma XML Stylesheet, constituda por um conjunto de Templates, que no so mais que um
conjunto de aces que sero executadas em determinados contextos.
A ttulo de exemplo, se considerarmos a seguinte XML Stylesheet (doravante abreviada somente por
stylesheet),
74
XSD
XSLT
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Foo">
<Bar>Viva</Bar>
</xsl:template>
</xsl:stylesheet>
xsl:stylesheet
xmlns:xsl
"http://www.w3.org/" representa um URI. No existe contudo qualquer contacto remoto via web. Trata-se
de uma referncia local, por exemplo, para o browser saber qual verso de XSLT.
xsl:template
<Bar>Viva</Bar>
Por exemplo:
<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="MyStyle.xsl"?>
<Etc>
Blah blah blah.
</Etc>
75
XSLT
XSD
Templates
Uma XML stylesheet corresponde a um conjunto de regras, definidas sob a forma de templates. Estes
templates (comparveis s funes ou mtodos na teoria das linguagens de programao), para os quais se
podero tambm definir parmetros, sero utilizados em circunstncias especficas de contexto. Um template
poder possuir texto ou instrues XSLT.
Um corpo de uma XML stylesheet possui no mnimo dois templates, que corresponde aos templates por
omisso (a ver mais frente).
Os templates so definidos com a instruo xsl:template e so compostos por uma sequncia de instrues
XSL. A estrutura normal de um template respeita a sintaxe:
<xsl:template match=...>
.........
</xsl:template>
Existem dois tipos de templates: template com nome (named template) e template com match (matched
template). Paralelamente, existem duas formas de utilizar um template: ou invocando-o pelo respectivo nome
ou aplicando-o.
Se um template tem um nome, i.e., com o atributo name, s poder ser utilizado atravs da instruo xsl:calltemplate. Caso possua um atributo match, ser utilizado de duas formas possveis: quer manualmente
atravs da instruo xsl:apply-template quer automaticamente pela prpria mquina que, ao analisar o
documento xml, vai remetendo a interpretao de cada elemento ao template que sobre ele estiver definido
(veremos melhor este conceito ao analisar vrios exemplos). Contudo, um template pode possuir os dois
atributos.
Um outro atributo pode estar presente, mode, que se aplica somente a matched templates e serve para
permitir a distino de dois templates que se apliquem em iguais circunstncias de match.
Em casos mais complexos (a no explorar neste documento) poder ter um nome e ter tambm uma condio
de match.
Basicamente um template utilizado da seguinte forma:
medida que a rvore XML original percorrida pelo processador XSLT, as regras dos templates so
verificadas. Sempre que uma regra verificada (faz-se o match) esse template executado e o
resultado da sua execuo passa para a rvore resultante.
76
XSD
XSLT
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Este template percorre recursivamente a rvore inicial XML, fazendo match com o nodo raiz (/) e com todos os
restantes elementos (*). Garante-se assim que qualquer outro template existente, seja aplicado.
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
Este template faz match com nodos do tipo texto (pela instruo text()). Em cada nodo encontrado,
apresentado o respectivo contedo. Isto feito pelo operador self (.).
Uma stylesheet vazia deve ser vista como uma stylesheet que s possui definidos os templates por omisso
(que naturalmente no so visveis). Assim, a estrutura de uma stylesheet vazia (mas completa), tem a seguinte
composio:
Analisando de novo o nosso exemplo inicial de documento XML (Tabela 1, pag. 60) que descreve uma
actividade, aplicando-lhe uma stylesheet vazia (percurso.xsl), o resultado seria (tente verificar voc mesmo!):
77
XSLT
XSD
Como se pode observar, os prprios caracteres de indentao (espaos e tabs), esto presentes no documento
resultado.
Caso se pretenda anular estes templates ocultos, deve-se redefini-los. Por exemplo, a seguinte definio faz
com que eles no executem nada sobre o XML fonte:
<xsl:template match="*|/">
</xsl:template>
<xsl:template match="text()">
</xsl:template>
Nota:
Todos os caracteres no visveis (espaos, tabs, ect) so convertidos em elementos xsl:text() e so
integralmente copiados para o documento destino.
78
XSD
XSLT
Os atributos no so analisados
79
XSLT
XSD
Linha 6
Definio de template. Este template ser executado quando ocorrer na rvore (quando fizer
o match com) o elemento /.
Linhas 7,8
Linha 9
Linha 10
Aps aplicar os templates aos filhos de /, deve terminar correctamente o documento HTML,
ie, fechar as tags <body> e <html> que tinham sido abertas nas linhas 7 e 8.
Linha 13
Template que faz match com nomes. Significa que este template ser executado sempre
que ocorrer um elemento nomes da rvore XML. Na sua definio consta a instruo
<xsl:apply-templates> que determina que continue a serem processados os templates que se
apliquem aos elementos filhos do nodo actual (nomes), ie, aos elementos nome.
Linha 19
Template que faz match com nome. Significa que este template ser executado sempre
que ocorrer um elemento nome da rvore XML. Na essncia o que este template faz
apresentar o valor existente em cada elemento nome, como parte de um elemento <li> de
html.
Linha 21
<xsl:value-of select=text()/>. Instruo xsl que escreve o valor do elemento do nodo actual
(nome). A funo text() devolve o contedo do elemento actual.
80
XSD
XSLT
81
XSLT
XSD
class="BlueWho"><xsl:value-of select="nome"/></td>
<td
class="BlueWho"><xsl:value-of
select="distancia/@units"/></td>
select="distancia"/>
<xsl:value-of
<td class="BlueWho">
<xsl:choose>
<xsl:when test="dificuldade = 2">Mdia</xsl:when>
<xsl:otherwise>Fcil</xsl:otherwise>
</xsl:choose>
</td>
<td class="BlueWho"><xsl:value-of select="epoca"/></td>
<td class="BlueWho">
<xsl:value-of select="responsavel/respnome"/><br/>
<xsl:value-of select="responsavel/contacto"/><br/>
<xsl:value-of select="responsavel/email"/>
</td>
82
XSD
XSLT
</tr>
</xsl:for-each>
<tr>
<td colspan="5" class="BlueWho"><b>BTT</b></td>
</tr>
<xsl:for-each select="percursos/percurso[@tipo='btt']">
<tr>
<td class="BlueWho"><xsl:value-of select="nome"/></td>
<td
class="BlueWho"><xsl:value-of
select="distancia/@units"/></td>
select="distancia"/>
<xsl:value-of
<td class="BlueWho">
<xsl:choose>
<xsl:when test="dificuldade = 2">Mdia</xsl:when>
<xsl:when test="dificuldade =5">Exigente</xsl:when>
<xsl:otherwise>Fcil</xsl:otherwise>
</xsl:choose>
</td>
<td class="BlueWho"><xsl:value-of select="epoca"/></td>
<td class="BlueWho">
<xsl:value-of select="responsavel/respnome"/><br/>
<xsl:value-of select="responsavel/contacto"/><br/>
<xsl:value-of select="responsavel/email"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Pattern Matching
O pattern matching define as regras de acesso aos seguintes contextos:
Nodo raiz
83
XSLT
XSD
Muitos dos exemplos a seguir apresentados foram analisados aquando a explanao do XPath. Na essncia, as
expresses com eles definidos so puras expresses XPath. Vejamos cada caso com algum detalhe:
Nodo Raz
<xsl:template match=/>
<!Colocar aqui o que se pretende no incio do documento resultado.
Por exemplo, se for para gerar HTML, colocar aqui as tags HTML e BODY
-->
<!--esta instruo xsl permite processar os restantes elementos do XML
-->
<xsl:apply-templates/>
<!Colocar aqui o que se pretende para terminar o documento resultado.
Por exemplo, se for para gerar HTML, colocar aqui as tags que fecham o
HTML e BODY -->
</xsl:template>
Exemplo:
<xsl:template match="/">
<html><body>
<xsl:apply-templates/>
</body></html>
</xsl:template>
Nodo Elemento
<xsl:template match=nomeElemento>
Exemplo:
<xsl:template match=moon>
</xsl:template>
84
XSD
XSLT
Esta expresso far match com as Especificaes de todos os Veculos, sejam eles
Carros,
Avies ou Motorizadas.
Nodos Texto
Feito atravs do operador text(). Basicamente consiste no contedo dos valores que cada nodo possui,
sejam eles elementos ou atributos.
<!-- mostra em itlico todos os nmeros de telefone -->
<xsl:template match="Phone/text()">
<i><xsl:value-of select="."/></i>
</xsl:template>
Nota:
Os operadores text() e . Podem parecer executar o mesmo. Na realidade no. O operador text()
identifica o texto existente no nodo actual (elemento ou atributo). O operador . recursivo,
identificando o valor do actual nodo assim como de todos os que o sucedem na rvore.
Matching condicional
Muitos dos predicados XPath aplicados em templates permitem a identificao de elementos com regras de
seleco, ie, nem todos os elementos que se enquadrem numa dada expresso devero ser considerados. Isto
consegue-se atravs de indexadores no conjunto de elementos identificados. Vejamos alguns exemplos:
Lus Ferreira - IPCA-EST 2014
85
XSLT
XSD
O seguinte template identifica todos os elementos Company existentes no documento XML, apresentando o
nome (Name) de cada uma delas.
<xsl:template match="Company">
<b><xsl:value-of select="Name"/></b>
</xsl:template>
Agora, caso pretenda somente a segunda Company, a expresso XPath do template deveria ser alterada para:
<xsl:template match="Company[2]">
<b><xsl:value-of select="Name"/></b>
</xsl:template>
Este exemplo identifica somente aqueles Person que possuem o elemento NEW definido:
<xsl:template match="//Person[NEW]">
<xsl:value-of select="Name"/>
<i><xsl:value-of select="Phone"/></i>
</xsl:template>
Este outro exemplo identifica somente as Company que possuam o atributo territory definido:
<xsl:template match="Company[@territory]">
Territory: <xsl:value-of select="@territory"/>
</xsl:template>
O seguinte template faz matching com todas as pessoas (Pessoa) com Bilhete de Identidade (atributo bi) com
um dos valores apresentados.
<xsl:template match=Pessoa[@bi="P2234123" or @bi="23P25644"]'>
Este outro identifica somente as pessoas que no possuam idade (como atributo) igual a 33:
<xsl:template match=Pessoa[not(@idade="33"])'>
<xsl:value-of>
Escreve para o output o valor do contedo de um elemento ou atributo.
Considere-se o seguinte exemplo:
86
XSD
XSLT
E o seguinte template:
<xsl:template match="planet">
<xsl:value-of select=/>
</xsl:template>
Resultado
<xsl:value-of select="."/>
<xsl:value-of select="moons"/>
Phobos Deimos
<xsl:value-of select="moon"/>
<xsl:value-of select="planet"/>
<xsl:value-of select="@number"/>
<xsl:value-of select="@diameter"/>
6747 km
Se tivessemos o template:
<xsl:template match="planet/moons/moon">
<p>
<xsl:value-of select="."/> uma lua de
<xsl:value-of select="../../name"/>
</p>
</xsl:template>
O resultado seria:
Phobos uma lua de Marte
Deimos uma lua de Marte
87
XSLT
XSD
Isto porque o operador ../../name permite aceder ao contedo do elemento pai de moons. Neste caso, o
elemento pai de moons Marte.
<xsl:apply-templates/>
Esta instruo apresenta-se em vrias formas. Desde a mais genrica, <xsl:apply-templates/>, at forma com
identificao do critrio de matching: <xsl:apply-templates select=Pessoa/>. Vejamos as diferenas:
Expresso
Significado
<xsl:apply-templates/>
<xsl:apply-templates select=A/>
<xsl:apply-templates
mode=x/>
select=A
Analisemos o seguinte exemplo. Considere-se o documento XML contacts.xml que pretende descrever os
contactos de uma empresa:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Contacts.xsl"?>
<!-- contacts.xml -->
<Companies>
<Company id="C1"
territory="WEST" >
88
XSD
XSLT
</Company>
<Company
id="C2" >
<Name>Whamco International</Name>
<Contacts>
<Primary>
<Person
id="P4" >
<Name>Wanda Kalwicki</Name>
<Phone>873-9823</Phone><img>Phone.jpg</img>
</Person>
</Primary>
<Billing>
<Person id="P5">
<Name>Steve Franklin</Name>
<Phone>873-2387</Phone>
</Person>
</Billing>
<Sales>
<Person id="P6">
<Name>Earl Young</Name>
<Phone>873-3489</Phone><NEW/><img>Phoni.jpg</img>
</Person>
</Sales>
</Contacts>
</Company>
</Companies>
89
XSLT
XSD
Suponhamos agora retirar a condio select da instruo da linha 9. O resultado seria agora:
90
XSD
XSLT
O que significa que se pretende analisar somente os templates que fazem matching com os elementos Name
descendentes de Contacts. Neste caso o elemento Name correspondente ao elemento Company no
considerado. Logo, o resultado obtido (Figura 12) somente mostra os nomes dos membros das empresas (ex.
Wanda Kalwicki, Steve Franklin e Earl Young). Mas o nome da empresa (Company) no volta a ser apresentado.
No segundo caso, a expresso da linha 9 ficaria:
<xsl:apply-templates/>
O que significa que se pretende aplicar todos os templates que faam matching com elementos que estejam
por baixo de Company (contexto actual). Neste caso o elemento Name de Company j considerado, assim
como todos os restantes nomes (Name) dos membros da empresa. O resultado ser ento o apresentado na
Figura 13. Repare-se que o nome da empresa apresentado duas vezes!
Caso se pretenda definir vrios templates que se apliquem no mesmo contexto de matching mas que convm
que sejam executados em circunstncias distintas, utiliza-se o atributo mode na definio de cada template.
<xsl:template match="Company">
<p>Company:
<!-- nome em italic -->
<xsl:apply-templates select="Name" mode="C"/> </p>
<!-- nome em bold -->
<xsl:apply-templates select="Contacts//Name" mode="P"/>
</xsl:template>
91
XSLT
XSD
De seguida apresentamos mais informao sobre estas e outras instrues XSLT, analisando vrios exemplos de
cdigo.
Tutorial XSLT
Nesta seco pretendemos apresentar, sob a forma de tutorial, muitos outros conceitos que, devido sua
extenso no seria possvel explicar neste documento. Referimo-nos nomeadamente a estruturas de controlo
(estruturas de deciso e ciclos), a passagem de parmetros e a utilizao de variveis.
<xsl:value-of>
XML:
<?xml version="1.0"?>
<!--by lufer-->
<?xml:stylesheet type="text/xsl" href="livro.xsl"?>
<livro isbn="1234">
<isbn>1234</isbn>
<autores>
<autor>Benfica</autor>
<autor>Porto</autor>
</autores>
<titulo>Rua do Sobe e Desce por Entre Apertos</titulo>
<preco>738 2838</preco>
</livro>
XMl StyleSheet:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="livro">
<b><i>Titulo:</i></b><xsl:text> </xsl:text><xsl:value-of select="titulo"/><br/>
<b><i>ISBN:</i></b><xsl:text> </xsl:text><xsl:value-of select="@isbn"/>
</xsl:template>
92
XSD
XSLT
</xsl:stylesheet>
Resultado:
<xsl:template>
XMl:
<?xml version="1.0"?>
<!DOCTYPE ADDRESSLIST SYSTEM "AddressList.dtd">
<?xml:stylesheet type="text/xsl" href="AddressesList.xsl"?>
<ADDRESSLIST>
<ADDRESS NAME="Miss. Ex M. Elle">
<WORK>
<STREET>22, WWW Street</STREET>
<CITY>Cambridge</CITY>
<STATE>MA</STATE>
<COUNTRY>Portugal</COUNTRY>
</WORK>
<WORK>
<STREET>44, Triple W Street</STREET>
<CITY>Cambridge</CITY>
<STATE>MA</STATE>
<COUNTRY>USA</COUNTRY>
</WORK>
</ADDRESS>
<ADDRESS NAME="Mr. Ex S. Elle">
<WORK>
<STREET>34 WWW Street</STREET>
<CITY>Palo Alto</CITY>
<STATE>CA</STATE>
<COUNTRY>USA</COUNTRY>
</WORK>
<HOME>
<STREET>23 WWW Street</STREET>
<CITY>Palo Alto</CITY>
<STATE>CA</STATE>
<COUNTRY>USA</COUNTRY>
</HOME>
</ADDRESS>
<ADDRESS NAME="Mr. Ex S. Elle">
<WORK>
<STREET>34 WWW Street</STREET>
<CITY>Palo Alto</CITY>
<STATE>CA</STATE>
<COUNTRY>POrtugal</COUNTRY>
</WORK>
<HOME>
<STREET>23 WWW Street</STREET>
<CITY>Palo Alto</CITY>
<STATE>CA</STATE>
<COUNTRY>USA</COUNTRY>
</HOME>
</ADDRESS>
</ADDRESSLIST>
93
XSLT
XSD
XML Stylesheet
<?xml version="1.0" encoding="ISO-8859-1"?>
<!by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/ADDRESSLIST">
<html>
<body>
<hr/>
<h3>Endereos:</h3>
<xsl:apply-templates/>
<hr/>
</body>
</html>
</xsl:template>
<xsl:template match="ADDRESS/WORK">
<b><xsl:value-of select="COUNTRY"/></b><br/>
</xsl:template>
</xsl:stylesheet>
Resultado:
<xsl:for-each>
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--by lufer -->
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
<catalog>
<cd>
<title>Os Mais</title>
<artist>Marco Paulo</artist>
<country>PT</country>
<company>Columbia</company>
<price>07.90</price>
<year>1985</year>
</cd>
<cd>
<title>Eu e s Ns</title>
<artist>Paulo Marco</artist>
<country>USA</country>
<company>Columbia</company>
<price>12.90</price>
<year>1988</year>
</cd>
<cd>
<title>Eu e s Ele</title>
<artist>Amlia</artist>
<country>PT</country>
<company>Columbia</company>
94
XSD
XSLT
<price>10.90</price>
<year>1987</year>
</cd>
</catalog>
XML Stylesheet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/catalog">
<html>
<body>
<h2>Os meus CDs</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Ttulo</th>
<th align="left">Artista</th>
<th align="left">Preo</th>
</tr>
<xsl:apply-templates select="cd"/>
<!ou executar directamente sem invocar outro template -->
<!-<xsl:for-each select="cd">
<xsl:sort select="title" order="ascending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
-->
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Resultado:
not
XML:
Lus Ferreira - IPCA-EST 2014
95
XSLT
XSD
XML StyleSheet:
<?xml version="1.0" encoding="iso-8859-1"?>
<!by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Recipe">
<HTML>
<HEAD>
<TITLE>
<xsl:value-of select="Name"/>
</TITLE>
</HEAD>
<BODY>
<H3>
<xsl:value-of select="Name"/>
</H3>
<i>
<xsl:value-of select="Description"/>
</i>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<!-- Format ingredients -->
<xsl:template match="Ingredients">
<H4>Ingredientes</H4>
<TABLE BORDER="1">
<TR BGCOLOR="#308030">
<TH>Qty</TH>
<TH>Units</TH>
<TH>Item</TH>
</TR>
<xsl:for-each select="Ingredient">
<TR>
96
XSD
XSLT
<xsl:if test='Qty[not(.="")]'>
<TD>
<xsl:value-of select="Qty"/>
</TD>
</xsl:if>
<xsl:if test='Qty[.=""]'>
<TD BGCOLOR="red"> </TD>
</xsl:if>
<TD>
<xsl:value-of select="Qty/@unit"/>
</TD>
<TD>
<xsl:value-of select="Item"/>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
<!-- Format instructions -->
<xsl:template match="Instructions">
<H4>Instruces</H4>
<OL>
<xsl:apply-templates select="Step"/>
</OL>
</xsl:template>
<xsl:template match="Step">
<LI>
<xsl:value-of select="."/>
</LI>
</xsl:template>
<xsl:template match="*" priority="-1"/>
</xsl:stylesheet>
Resultado:
<xsl:if>
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Inventory.xsl"?>
<inventory>
<item>
<name>Austin</name>
<rating>7</rating>
</item>
<item>
97
XSLT
XSD
<name>Morris</name>
<rating>3</rating>
</item>
<item>
<name>Ford</name>
<rating>11</rating>
</item>
</inventory>
XML StyleSheet:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/inventory">
<html>
<head>
<basefont face="Arial" size="2"/>
</head>
<body>
<ul>
<xsl:apply-templates select="item"/>
<!-- ou
<xsl:apply-templates select="item" mode="xpto"/>
-->
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li><xsl:value-of select="name" /></li>
<xsl:if test="rating < 5">
*
</xsl:if>
</xsl:template>
<xsl:template match="item" mode="xpto">
<xsl:for-each select="*">
<xsl:if test="name()='name'">
<b><xsl:value-of select="name()"/> :</b> <xsl:value-of select="."/>
</xsl:if>
<xsl:if test="name()='rating'">
<i><xsl:value-of
select="name()"/> :</i> <xsl:value-of
select="."/>
<br/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Resultado:
98
XSD
XSLT
<xsl:choose>
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- by lufer -->
<?xml-stylesheet type="text/xsl" href="Portfolio.xsl"?>
<portfolio>
<stock>
<symbol>HHDT</symbol>
<oprice>100</oprice>
<cprice>25</cprice>
</stock>
<stock>
<symbol>DFKS</symbol>
<oprice>250</oprice>
<cprice>150</cprice>
</stock>
<stock>
<symbol>NHSJ</symbol>
<oprice>20</oprice>
<cprice>1000</cprice>
</stock>
<stock>
<symbol>DJSK</symbol>
<oprice>425</oprice>
<cprice>2</cprice>
</stock>
<stock>
<symbol>MDSH</symbol>
<oprice>50</oprice>
<cprice>50</cprice>
</stock>
<stock>
<symbol>TRVB</symbol>
<oprice>90</oprice>
<cprice>86</cprice>
</stock>
</portfolio>
XML StyleSheet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/portfolio">
<html>
<head>
<basefont face="Arial" size="2"/>
</head>
<body>
<h3>Portflio:</h3>
<ul>
<xsl:apply-templates />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="stock">
<xsl:choose>
<!-- preo excede -->
99
XSLT
XSD
Resultado:
<xsl:sort>
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Loop.xsl"?>
<top_five>
<movie>
<name>Star Wars: A New Hope</name>
<cast>Mark Hamill, Carrie Fisher, Harrison Ford</cast>
<director>George Lucas</director>
<rank>1</rank>
</movie>
<movie>
<name>The Patriot</name>
<cast>Mel Gibson, Heath Ledger, Jason Isaacs</cast>
<director>Roland Emmerich</director>
<rank>5</rank>
</movie>
<movie>
<name>The Whole Nine Yards</name>
<cast>Bruce Willis, Matthew Perry</cast>
<director>Jonathan Lynn</director>
<rank>3</rank>
</movie>
<movie>
<name>Gladiator</name>
<cast>Russell Crowe, Connie Nielsen, Joaquin Phoenix</cast>
<director>Ridley Scott</director>
<rank>4</rank>
100
XSD
XSLT
</movie>
<movie>
<name>Unbreakable</name>
<cast>Bruce Willis, Samuel L. Jackson</cast>
<director>M. Night Shyamalan</director>
<rank>2</rank>
</movie>
</top_five>
XML StyleSheet:
<?xml version="1.0"?>
<!--by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<basefont face="Arial" size="4" />
</head>
<body>
<ol>
<xsl:apply-templates />
</ol>
</body>
</html>
</xsl:template>
<xsl:template match="top_five">
<xsl:for-each select="movie">
<xsl:sort select="name" order="descending" />
<li><xsl:value-of select="name" /></li>
<br />
<font size="2"><xsl:value-of select="cast" /> | <xsl:value-of
select="director" /> -> <xsl:value-of select="rank"/></font>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Resultado:
<xsl:element>
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="radio.xsl"?>
<tudo>
101
XSLT
XSD
<opcao>Um</opcao>
<opcao>Dois</opcao>
<opcao>Tres</opcao>
<label>BI</label>
<label>Nome</label>
<label>BI</label>
<label>Nome</label>
</tudo>
XML StyleSheet:
<?xml version='1.0' encoding='iso-8859-1' ?>
<!-- by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<!--radio butons -->
<xsl:template match="tudo">
<xsl:for-each select="opcao">
<xsl:element name="input">
<xsl:attribute name="type">
<xsl:value-of select="'radio'"/>
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:if test="text() = 'Tres'">
<xsl:attribute name="checked"/>
</xsl:if>
</xsl:element>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:apply-templates select="label"/>
</xsl:template>
<xsl:template match="label">
<p/>
<xsl:value-of select="text()"/>:
<xsl:element name="input">
<xsl:attribute name="type">
<xsl:value-of select="'text'"/>
</xsl:attribute>
<xsl:attribute name="size">
<xsl:value-of select="'20'"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Resultado:
102
XSD
XSLT
<xsl:number>
XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Ingredientes.xsl"?>
<recipe>
<ingredients>
<item>Boneless chicken breasts</item>
<item>Chopped onions</item>
<item>Ginger</item>
</ingredients>
<process>
<step>Cut chicken into cubes, wash and apply lime juice and salt</step>
<step>Add ginger, garlic, chili, coriander and lime juice in a separate
bowl</step>
<step>Mix well, and add chicken to marinate for 3-4 hours</step>
<step>Place chicken pieces on skewers and barbeque</step>
<step>Remove, apply butter, and barbeque again until meat is
tender</step>
<step>Garnish with lemon and chopped onions</step>
<step>Final</step>
</process>
</recipe>
XML StyleSheet:
<?xml version="1.0"?>
<!-- by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
Preparation:
<xsl:apply-templates select="recipe/process" />
</body>
</html>
</xsl:template>
<xsl:template match="process/step">
<br/><xsl:number count="step" format="1 - " />
<xsl:value-of select="." />
</xsl:template>
</xsl:stylesheet>
Resultado:
103
XSLT
XSD
<xsl:param>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<!-- by lufer -->
<?xml-stylesheet type="text/xsl" href="data.xsl"?>
<dias>
<data>
<dia>7</dia>
<mes>12</mes>
<ano>2006</ano>
<msg>Dezembro</msg>
</data>
<data>
<dia>7</dia>
<mes>10</mes>
<ano>2006</ano>
<msg>Outubro</msg>
</data>
</dias>
XML StyleSheet:
<?xml version="1.0" encoding="UTF-8"?>
<!-- by lufer -->
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:param name="dia" select="7"/>
<xsl:param name="mes" select="12"/>
<xsl:param name="ano" select="2006"/>
<xsl:template match="/">
<xsl:param name="total">
<!--$total tem o resultado da invocao-->
<xsl:call-template name="y">
<xsl:with-param name="mes" select="$mes"/>
</xsl:call-template>
</xsl:param>
<!--DATA = <xsl:value-of select="$total"/>-->
<xsl:value-of select="$total"/>
</xsl:template>
<xsl:template name="y">
<xsl:param name="mes"/>
<xsl:variable
name="Data"
select="/dias/data[dia=$dia
ano=$ano]/msg"/>
<xsl:value-of select="$Data"/>
</xsl:template>
and
mes=$mes
and
</xsl:stylesheet>
Resultado:
104
XSD
XSLT
<xsl:variable>
XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- by lufer -->
<!DOCTYPE AVISOS SYSTEM "aviso.dtd">
<?xml-stylesheet type="text/xsl" href="aviso.xsl"?>
<AVISOS>
<AVISO>
<data>12_12_2003</data>
<de>Luisa</de>
<para>Paula</para>
<assunto>Tratar de tudo...</assunto>
</AVISO>
<AVISO>
<data>12_12_2002</data>
<de>Luis</de>
<para>Paulo</para>
<assunto>Ainda no foi tudo tratado</assunto>
</AVISO>
<AVISO>
<data>12_12_2002</data>
<de>Pedro</de>
<para>Paulo</para>
<assunto>Importante no esquecer</assunto>
</AVISO>
</AVISOS>
XML Stylesheet:
<?xml version="1.0"?>
<!-- by lufer -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:variable name="Data">24-11-2009</xsl:variable>
<xsl:template match="/AVISOS">
<html>
<head>
<title>AVISOS</title>
</head>
<body class="bg">
<center><h4>AVISOS</h4>(<xsl:value-of select="$Data"/>)</center>
<table width="100%" border="1"><thead>
<th>Origem</th>
<th>Destino</th>
<th>Assunto</th>
<th>Data</th>
</thead>
<tbody>
<xsl:apply-templates/>
</tbody>
<tr><td>
</td></tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="AVISO">
<tr>
<td width="20%">
105
XSLT
XSD
Resultado:
<xsl:call-template>
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="soccer1.xsl"?>
<results group="A">
<match>
<date>1998-06-10</date>
<team score="2">Brazil</team>
<team score="1">Scotland</team>
</match>
<match>
<date>1998-06-16</date>
<team score="3">Brazil</team>
<team score="0">Morocco</team>
</match>
<match>
<date>1998-06-23</date>
<team score="1">Brazil</team>
<team score="2">Norway</team>
</match>
<match>
<date>1998-06-10</date>
<team score="2">Morocco</team>
<team score="2">Norway</team>
</match>
<match>
<date>1998-06-16</date>
<team score="1">Scotland</team>
<team score="1">Norway</team>
</match>
<match>
<date>1998-06-23</date>
<team score="0">Scotland</team>
<team score="3">Morocco</team>
</match>
</results>
XMl StyleSheet:
106
XSD
XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="table-heading">
<tr>
<td><b>Date</b></td>
<td><b>Home Team</b></td>
<td><b>Away Team</b></td>
<td><b>Result</b></td>
</tr>
</xsl:variable>
<xsl:template name="format-date">
<xsl:param name="iso-date"/>
<xsl:variable name="months"
select="'JanFebMarAprMayJunJulAugSepOctNovDec'"/>
<xsl:value-of select="substring($iso-date, 9, 2)"/>
<xsl:text> </xsl:text>
<xsl:variable name="month" select="substring($iso-date, 6, 2)"/>
<xsl:value-of select="substring($months, ($month - 1)*3 + 1, 3)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring($iso-date, 1, 4)"/>
</xsl:template>
<xsl:template match="/">
<html><body>
<h1>Matches in Group <xsl:value-of select="/*/@group"/></h1>
<xsl:apply-templates select="/results/match">
<xsl:sort select="date"/>
<xsl:sort select="team[1]"/>
</xsl:apply-templates>
</body></html>
</xsl:template>
<xsl:template match="match">
<xsl:variable name="date-out">
<xsl:call-template name="format-date">
<xsl:with-param name="iso-date" select="date"/>
</xsl:call-template>
</xsl:variable>
<h2><xsl:value-of select="concat(team[1], ' versus ', team[2])"/></h2>
<table bgcolor="#cccccc" border="1" cellpadding="5">
<xsl:copy-of select="$table-heading"/>
<tr>
<td><xsl:value-of select="$date-out"/></td>
<td><xsl:value-of select="team[1]"/></td>
<td><xsl:value-of select="team[2]"/></td>
<td><xsl:value-of select="concat(team[1]/@score, '-',
team[2]/@score)"/></td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
Resultado:
107
XSLT
XSD
document()
XML:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="Outro.xsl" ?>
<projects>
<record>
<project_family>Backlog</project_family>
<priority>1</priority>
<description>Highest Priority Backlog Project</description>
<record_id_>4</record_id_>
</record>
<record>
<project_family>Backlog</project_family>
<priority>2</priority>
<description>Lowest Priority Backlog Project</description>
<record_id_>1</record_id_>
</record>
<record>
<project_family>Next Year</project_family>
<priority>2</priority>
<description>Lowest Priority New Project</description>
<record_id_>3</record_id_>
</record>
<record>
<project_family>Next Year</project_family>
<priority>1</priority>
<description>Highest Priority New Project</description>
<record_id_>2</record_id_>
</record>
</projects>
XML:
<?xml version="1.0" ?>
<tasks>
<record>
<rank>1</rank>
<description url="Project.xml">Tarefa 1</description>
<related_project>4</related_project>
<record_id_>114</record_id_>
</record>
<record>
<rank>4</rank>
<description url="Project.xml">Tarefa 2</description>
<related_project>4</related_project>
<record_id_>114</record_id_>
</record>
108
XSD
XSLT
<record>
<rank>3</rank>
<description url="Project.xml">Tarefa 3</description>
<related_project>3</related_project>
<record_id_>114</record_id_>
</record>
<record>
<rank>2</rank>
<description url="Project.xml">Tarefa 4</description>
<related_project>3</related_project>
<record_id_>114</record_id_>
</record>
</tasks>
XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Project.xsl" ?>
<projects>
<record>
<project_family>Backlog</project_family>
<priority>1</priority>
<description>Projecto Backlog: alta prioridade</description>
<record_id_>4</record_id_>
</record>
<record>
<project_family>Backlog</project_family>
<priority>2</priority>
<description>Projecto Backlog: baixa prioridade</description>
<record_id_>1</record_id_>
</record>
<record>
<project_family>Prximo Ano</project_family>
<priority>2</priority>
<description>Novo Projecto: Menor Prioridade</description>
<record_id_>3</record_id_>
</record>
<record>
<project_family>Prximo Ano</project_family>
<priority>2</priority>
<priority>1</priority>
<description>Novo Projecto: Maior Prioridade</description>
<record_id_>2</record_id_>
</record>
</projects>
109
XSLT
XSD
<br/>
<xsl:call-template name="gera2">
<xsl:with-param name="file">Tasks.xml</xsl:with-param>
<xsl:with-param name="filtro">2</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template>
<!--
-->
<xsl:template name='gera'>
<xsl:param name='file'/>
<xsl:apply-templates select='document($file)/tasks'/>
</xsl:template>
<!--
-->
<xsl:template name='gera2'>
<xsl:param name='file'/>
<xsl:param name='filtro'/>
<table border="1" width="50%" cellpadding="5">
<tr>
<th>Tarefa</th>
<th>Ranking</th>
<th>Proj. Relacionados</th>
</tr>
<xsl:apply-templates
select='document($file)/tasks/record[rank>$filtro]'/>
</table>
</xsl:template>
<!--
-->
<xsl:template match="/tasks">
<h2>Lista de Projectos</h2>
<xsl:for-each select="record">
<xsl:sort data-type="number" select="rank"/>
<xsl:sort data-type="text" select="description"/>
<tr>
<td>
<xsl:value-of select="rank"/>
</td>
<td>
<xsl:value-of select="related_project"/>
</td>
<td>
<xsl:value-of select="description"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<!--
-->
<xsl:template match="/tasks/record">
<tr>
<td>
<a href="{description/@url}"><xsl:value-of select="description"/></a>
</td>
<td>
<xsl:value-of select="rank"/>
</td>
<td>
<xsl:value-of select="related_project"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
110
XSD
XSLT
com
Projecto
<b><xsl:value-of
select="record_id_"/></b>
<xsl:call-template name="detalhe">
<xsl:with-param name="project_id"><xsl:value-of
select="record_id_"/></xsl:with-param>
<xsl:with-param name="file">Tasks.xml</xsl:with-param>
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template name="detalhe">
<xsl:param name="project_id"/>
<xsl:param name="file"/>
<xsl:apply-templates
select='document($file)/tasks/record[related_project=$project_id]'/>
</xsl:template>
<xsl:template match="/tasks/record">
<xsl:value-of select="description"/> Rank: <xsl:value-of select="rank"/><BR/>
</xsl:template>
</xsl:stylesheet>
Resultado:
111
XSLT
XSD
Mltiplos XML/StyleSheets
Uma das mais importantes e interessantes capacidades de processamento de documentos XML a
possibilidade de serem processadas por vrias StylesSheets inter-relacionadas ou no. Vejamos este conceito
atravs do seguinte exemplo.
Considere-se ento o seguinte documento XML (Projects.xml):
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Project.xsl" ?>
<projects>
<record>
<project_family>Backlog</project_family>
<priority>1</priority>
<description>Projecto Backlog: alta prioridade</description>
<record_id_>4</record_id_>
112
XSD
XSLT
</record>
<record>
<project_family>Backlog</project_family>
<priority>2</priority>
<description>Projecto Backlog: baixa prioridade</description>
<record_id_>1</record_id_>
</record>
<record>
<project_family>Prximo Ano</project_family>
<priority>2</priority>
<description>Novo Projecto: Menor Prioridade</description>
<record_id_>3</record_id_>
</record>
<record>
<project_family>Prximo Ano</project_family>
<priority>2</priority>
<priority>1</priority>
<description>Novo Projecto: Maior Prioridade</description>
<record_id_>2</record_id_>
</record>
</projects>
<xsl:template match="/projects">
<html>
<body>
<table border="1" width="100%" cellpadding="5">
<tr>
<th>Famlia</th>
<th>Prioridade</th>
<th>Descrio</th>
</tr>
<xsl:for-each select="record">
<xsl:sort data-type="text" select="project_family"/>
<xsl:sort data-type="number" select="priority"/>
<tr>
<td>
<xsl:value-of select="project_family"/>
</td>
<td>
<xsl:value-of select="priority"/>
113
XSLT
XSD
</td>
<td>
<xsl:value-of select="description"/>
</td>
</tr>
<tr>
<td>
</td>
<td colspan="2">
<xsl:call-template name="detalhe">
<xsl:with-param name="project_id">
<xsl:value-of select="record_id_"/>
</xsl:with-param>
<xsl:with-param name="file">Tasks.xml</xsl:with-param>
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template name="detalhe">
<xsl:param name="project_id"/>
<xsl:param name="file"/>
<xsl:apply-templates
select='document($file)/tasks/record[related_project=$project_id]'/>
</xsl:template>
<xsl:template match="/tasks/record">
<xsl:value-of select="description"/> Rank: <xsl:value-of select="rank"/><BR/>
</xsl:template>
</xsl:stylesheet>
114
XSD
XSLT
115
XSLT
XSD
</record>
<record>
<rank>2</rank>
<description url="Project.xml">Tarefa 4</description>
<related_project>3</related_project>
<record_id_>114</record_id_>
</record>
</tasks>
Para explicar melhor o comportamento desta sequncia de XML/XSL, recordemos o primeiro registo do nosso
documento XML (Projects.xml):
<record>
<project_family>Backlog</project_family>
<priority>1</priority>
<description>Projecto Backlog: alta prioridade</description>
<record_id_>4</record_id_>
</record>
<xsl:template name="detalhe">
<xsl:param name="project_id"/>
<xsl:param name="file"/>
<xsl:apply-templates
select='document($file)/tasks/record[related_project=$project_id]'/>
</xsl:template>
<xsl:call-template name="detalhe">
<xsl:with-param name="project_id">
116
XSD
XSLT
<xsl:value-of select="record_id_"/>
</xsl:with-param>
<xsl:with-param name="file">Tasks.xml</xsl:with-param>
</xsl:call-template>
O que na prtica significa aceder ao ficheiro XML Tasks.XML e aceder aos registos:
<record>
<rank>1</rank>
<description url="Project.xml">Tarefa 1</description>
<related_project>4</related_project>
<record_id_>114</record_id_>
</record>
<record>
<rank>4</rank>
<description url="Project.xml">Tarefa 2</description>
<related_project>4</related_project>
<record_id_>114</record_id_>
</record>
Correspondendo ento aos detalhes do projecto inicial e da a sua apresentao na tabela HTML na Figura 14.
A ttulo de resumo, o acesso a um documento externo geralmente conseguido com recurso ao mtodo
document(). Sempre que tal feito, o contexto actual passa a ser o contexto desse documento externo.
117
PARTE IV
XSL Aplicado
XSL
PHP e XML
O exemplo seguinte11 mostra como processar XML com XML Stylesheets utilizando o PHP.
Pretende-se desenvolver uma pequena aplicao que gere Currculos Pessoais. Uma vez que foi desenvolvido
em PHP4, para o executar na nova verso PHP (5.2) foi necessrio proceder a pequenas alteraes,
nomeadamente a incluso das seguintes instrues:
if ((PHP_VERSION>='5')&& extension_loaded('xsl'))
require_once('xslt-php4-to-php5.php');
Aps validada a autenticao (Figura 15), o utilizador confrontado com um conjunto de currculos associados
(Figura 16). A script que valida a entrada valida.php apresentada a seguir. Repare-se nas instrues PHP
10
121
XSL
que processam o XML. Repare-se ainda na passagem do parmetro $nome para a XML Stylesheet. Tal permite
a modularizao destes mdulos.
Script valida.php
Responsvel por processar o XML com a Stylesheet.
1.
2.
3.
<?php
// Sistema de Login Simples sem resurso a Base de Dados
//alunos: 1826 e 1898
4.
5.
6.
7.
8.
$nome = $_POST["login"];
$senha = $_POST["senha"];
9.
10.
11.
// Definio de Variveis
$arquivo = "users.txt";
$fd = fopen ($arquivo, "r");
12.
13.
14.
//Docs a utilizar
$xml_file = "curriculos.xml";
$xsl_file = "curriculos.xsl";
15.
16.
17.
$xh = xslt_create();
$fileBase = 'file://' . getcwd () . '/';
xslt_set_base ( $xh, $fileBase );
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
na linha 23 da script valida.php. Esse valor corresponde ao o valor inserido no campo UserName do formulrio
de autenticao, cuja recolha feita pela instruo da linha 7 da referia script.
De seguida mostra-se a XML StyleSheet que processa o documento XML. Repare-se na definio do parmetro
nome que controla a execuo do template principal.
1.
2.
3.
4.
122
XSL
5.
<!--<xsl:variable name="nome">ok</xsl:variable>-->
6.
7.
8.
9.
<xsl:template match="/curriculos">
<basefont face="Arial"/>
<html>
<body>
10.
11.
18.
19.
20.
21.
22.
23.
24.
25.
</table>
</body>
</html>
</xsl:template>
26.
27.
<xsl:template match="curriculo">
<xsl:param name="nome"/>
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
12.
13.
14.
15.
16.
17.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
123
XSL
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109. </xsl:template>
110. </xsl:stylesheet>
124
XSL
Excerto do documento XML com os currculos dos candidatos:
A Figura seguinte mostra o resultado da aplicao da XML StyleSheet ao documento XML apresentado, neste
caso para o candidato lufer sendo apresentado o respectivo curriculum vitae.
125
XSL
import java.io.*;
/**
* Processamento de XML com XSLT em JAXP
* lufer - 2006-2007
*/
public class SimpleJaxp {
/**
* Recebe dois argumentos: o nome do ficheiro XML e o nome do
* ficheiro XSLT. O resultado escrito no stdout
*/
public static void main(String[] args)
throws javax.xml.transform.TransformerException {
if (args.length != 2) {
System.err.println("Sintaxe:");
System.err.println(" java " + SimpleJaxp.class.getName( )
+ " FicheiroXML FicheiroXSLT");
System.exit(1);
}
File xmlFile = new File(args[0]);
File xsltFile = new File(args[1]);
javax.xml.transform.Source xmlSource =
new javax.xml.transform.stream.StreamSource(xmlFile);
javax.xml.transform.Source xsltSource =
new javax.xml.transform.stream.StreamSource(xsltFile);
javax.xml.transform.Result result =
new javax.xml.transform.stream.StreamResult(System.out);
126
XSL
// cria uma instncia de TransformerFactory
javax.xml.transform.TransformerFactory transFact =
javax.xml.transform.TransformerFactory.newInstance( );
javax.xml.transform.Transformer trans =
transFact.newTransformer(xsltSource);
trans.transform(xmlSource, result);
}
12
Exemplo explorado num trabalho prtico da disciplina de ISI de 2010-2011, pelo aluno 4379 Jos Carlos.
127
XSL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
</
43.
A pgina desenhada tem o aspecto apresentado na Figura 17. A cada activao dos botes so aplicadas
stylesheets diferentes. Por exemplo, ao boto CV Portugus ser aplicada a stylesheet cv.xsl e ao CV Ingls
ser aplicada a stylesheet cv2.xsl (linhas 35 e 36 da listagem anterior, respectivamente). Os resultados sero
por isso diferentes.
128
XSL
A listagem seguinte mostra a traduo da estrutura de um CV noutro idioma, utilizando um dicionrio externo
de termos (dicionario.xml - Figura 19). Repare-se no processamento de um documento XML externo atravs do
operador XPath document (linhas 9 e 15).
44.
45.
46.
47.
<!--...-->
<!-- ficheiro do dicionario-->
<xsl:variable name="file">dicionario.xml</xsl:variable>
<!--...-->
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
129
XSL
130
XSL
XSL com C#
C# e ASP.NET corresponde a uma das tecnologias/plataformas mais utilizadas nas aplicaes web. De seguida
iremos apresentar um exemplo semelhant de transformao de um documento XML. Neste caso o documento
XML descreve o contedo de um livro (ndice, captulos, etc.) e pretende-se tambm controlar a apresentao
do seu contedo (totalidade ou apenas parte) atravs da aplicao de uma XML StyleSheet.
Basicamente pertende-se gerar uma verso HTML do livro, cujos captulos podem ser directamente acedidos
atravs de um ndice automtico. Mas analisemos este exemplo13.
Um livro pode ser descrito de acordo com um documento XML (excerto apresentado na Figura 21). Como
possvel analisar a estruturao de um livro dinmica e uma vez conseguida permite a sua manipulao no
todo ou em partes.
Aquilo que se pretende conseguir gerar uma pgina (ou pginas) HTML com todo ou parte do contedo do
livro (Figura 26).
Para a transformao do XML no HTML (explorado com mais exemplos a seguir) foi desenvolvida uma XML
Stylesheet que possibilita o tratamento por cada seco existente no documento XML. A listagem seguinte
mostra essa stylesheet.
13
Exemplo explorado pelo aluno 3749 Tiago Carvalho, na disciplina de ISI de 2010-2011.
131
XSL
1. <xsl:template match="LIVRO">
2.
<html>
3.
<head>
4.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5.
</head>
6.
<body>
7.
<h1><xsl:value-of select="TITULO"/></h1><br/>
8.
<xsl:call-template name="indice"/>
9.
<xsl:apply-templates/>
10.
</body>
11.
</html>
12. </xsl:template>
13. <xsl:template name="indice">
14.
<br/>
15.
<h1>NDICE</h1><br/>
16.
<xsl:for-each select="/LIVRO/*">
17.
<xsl:call-template name="indice-item"/>
18.
</xsl:for-each>
19. </xsl:template>
20. <xsl:template name="indice-item">
21. <xsl:choose>
22.
<xsl:when test="local-name()='TITULO'">
23.
</xsl:when>
24.
<xsl:when test="local-name()='CAPITULO'">
25.
<a href="#{position()}"><xsl:value-of select="local-name()"/> - <xsl:value-of
select="TITULO_CAPITULO"/></a><br/>
26.
</xsl:when>
27.
<xsl:otherwise>
28.
<a href="#{position()}"><xsl:value-of select="local-name()"/></a><br/>
29.
</xsl:otherwise>
30. </xsl:choose>
31. </xsl:template>
32. <xsl:template match="TITULO"></xsl:template>
33.
34.
35.
36.
37.
<xsl:template match="ISBN">
<br/>
<a name="{position()}"><br/></a>
<b>ISBN: </b><xsl:value-of select="."/><br/>
</xsl:template>
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<xsl:template match="AUTOR">
<a name="{position()}"><br/></a>
<h2>Autor</h2><br/>
<b>Nome: </b><xsl:value-of select="NOME"/><br/>
<b>Data de nascimento: </b><xsl:value-of select="DATA_DE_NASCIMENTO"/><br/>
<b>Nacionalidade: </b><xsl:value-of select="NACIONALIDADE"/><br/>
<b>Gnero literrio: </b><xsl:value-of select="GENERO_LITERARIO"/><br/>
<b>Obras conhecidas: </b><xsl:value-of select="PRINCIPAIS_TRABALHOS"/><br/>
<b>Resumo: </b><xsl:value-of select="RESUMO"/><br/>
</xsl:template>
48. <!--->
Nela constam alguns dos XML Templates utilizados (linhas 1, 13, 20, 33, 38), cada um deles dedicado a
processar a cada elemento do documento XML. O template indice-item (linha 20) pertende, por exemplo, gerar
o ndice global do livro gerado, onde cada entrada corresponde a um hyperlink (anchor) para a respectiva
seco do livro. A sua aplicao pode ser analisada na pgina representada na (Figura 26).
O cdigo C# que aplica a stylesheet ao documento XML apresentado a seguir. Nesta experincia foram
utilizadas as classes XslCompiledTransform, XmlDocument e XpathNavigator (Figura 22).
132
XSL
Repare-se (nas linhas 98 e 100 da listagem da Figura 23) na preparao dos documentos XML e XSL a
processar.
O mtodo CarregarCheckListBox (Figura 25) encarrega-se ento de percorrer o documento XML e extrair todos
os seus elementos estruturantes. A idei instanciar numa lista um conjunto de checkboxes para cada seco do
livro (Figura 24).
133
XSL
A gerao do documento HTML correspondente, aps indicar (nas checkboxes) quais as seces que pretende
ver includas, resulta num documento HTML como o apresentado na Figura 26.
134
XSL
XML e CSS
O conceito de CSS Cascade Style Sheet permitiu reorganizar a forma como se desenvolvem pginas web para
as aplicaes modernas na Web. Na essncia, passou a ser possvel a separao real dos contedos da forma
como eles sero representados numa pgina web 14.
No fazendo parte dos objectivos deste documento a explicao do conceito de CSS, limitamo-nos a explorar as
suas potencialidades quando aplicados a documentos XML.
S para revermos os principais conceitos associados a um documento tipo CSS, analisemos o seguinte exemplo
de aplicao normal de CSS a um documento HTML. O primeiro exemplo mostra a definio de estilos (de uma
CSS) no prprio documento HTML:
<html>
<head>
<title>Exemplo de CSS em HTML</title>
<style type="text/css">
body {font-family: Calibri; font-size:12pt;}
text {font-size:10pt; color:green;}
</style>
</head>
14
135
XSL
<body>
<div class="text">Um exemplo simples de CSS</div>
aplicado a documentos HTML,
<span
style="font-style:italic;color:red;">via
elementos
DIV
ou
SPAN</span>
</body>
</html>
Este segundo exemplo mostra o mesmo documento HTML, mas com recurso a um documento CSS externo.
Neste caso o ficheiro teste2.css.
<html>
<head>
<title>Exemplo de CSS em HTML</title>
<link
</head>
<body>
<div class="text">Um exemplo simples de CSS</div>
aplicado a documentos HTML,
<span
style="font-style:italic;color:green;">via
elementos
DIV
ou
SPAN</span>
</body>
</html>
Quando aplicada aos dois documentos HTML apresentados (interna ou externamente), o resultado seria:
No caso de aplicarmos uma CSS a um documento XML, embora o resultado obtido num browser seja
equivalente, as regras do seu processamento so um pouco diferentes. Vamos analisar algumas destas regras
atravs do seguinte exemplo. Consideremos ento o seguinte documento XML:
136
XSL
<book>First Book
<titulo>O regresso dos que no foram</titulo>
<autor>Antonio Passos Dias Aguiar Mota</autor>
<linha class="tres">Isto a linha Um</linha>
<linha class="um">Isto a linha Dois</linha>
<linha class="dois">Isto a linha Tres</linha>
<editora class="um">IPCA</editora>
</book>
Repare-se no documento XML a referncia a classes diferentes de estilos nos vrios elementos linha.
Vejamos agora o documento teste.css:
book{
display:block;
font-size:20pt;
color: red;
}
titulo{
font-size: 10pt;
font-family: arial, helvetica;
font: italic small-caps normal 70% serif;
display: block;
color: Lime;
}
autor{
font-size: 10pt;
font-family: arial, helvetica;
font: normal normal bold 50% serif;
display: block;
color: gray;
}
linha{
display:block;
font-size:10pt;
color: green;
}
linha.uma{
display:block;
font-size:6pt;
color: green;
}
137
XSL
linha.tres{
display:block;
font-size:12pt;
color: green;
}
editora.um{
display:block;
font-size:18pt;
color: blue;
}
.dois{
display:block;
font-size:6pt;
color: green;
}
O importante realar que, neste tipo de aplicaes de CSS, o nome das classes de estilos devero estar
associadas aos prprios nomes dos elementos no XML. Repare-se, por exemplo, na definio do elemento
titulo na CSS e analise-se a forma como foi representado no browser (Figura 28). Facilmente se identificam os
atributos Italic e SMALL CAPS.
138
XSL
mesmo noutro documento XML. Estes tipos de aces mostram-se importantes em actividades de interaco
entre sistemas de informao tipo, tipo ETL via integrao de dados15.
15
139
XSL
140
XSL
Gerar CSV
Pretende-se neste exemplo mostrar a gerao de um documento CSV Comma-Separated Values formato
utilizado para armazenar dados, portveis para mltiplas Bases de Dados e aplicaes como Folhas de Clculo
(Microsoft Excel, etc.) e outras, a partir de um documento XML.
Consideremos o seguinte documento XML (tp.xml) com alguns dados sobre elementos qumicos da Tabela
Peridica:
<?xml version="1.0"?>
<!--by lufer -->
<?xml-stylesheet type="text/xsl" href="tp_csv.xsl"?>
<ptable>
<element atributo="100">
<name>Hydrogen</name>
<symbol>H</symbol>
<number>1</number>
</element>
<element>
<name>Lithium</name>
<symbol>Li</symbol>
<number>3</number>
</element>
<element>
<name>Sodium</name>
<symbol>Na</symbol>
<number>11</number>
</element>
141
XSL
<xsl:template match="/">
<xsl:call-template name="header"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="//element">
<xsl:for-each select="*">
<xsl:value-of select="text()"/><xsl:text>;</xsl:text>
<xsl:if test="position()=last()"><xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="header">
<xsl:for-each select="//element[1]/*">
<xsl:value-of select="name()"/>
<xsl:text>;</xsl:text>
<xsl:if test="position()=last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
O resultado da sua aplicao seria um documento csv (tp.csv) com a seguinte informao:
Nome;Simbolo;Numero
Hydrogen;H;1
Lithium;Li;3
Sodium;Na;11
142
XSL
Para experimentar aplicar esta transformao, utilizar o utilitrio uxt da seguinte forma:
uxt tp.xml tp.xsl tp.csv
Gerar WML
Pretende-se neste exemplo mostrar a gerao de um documento WML Wireless Markup Language formato
utilizado para garantir a interaco com dispositivos mveis como so o caso dos telemveis e outros, a partir
de um documento XML.
Considere-se o seguinte documento XML:
<?xml version="1.0" ?>
<!--by lufer -->
<?xml-stylesheet type="text/xsl" href="bolsa_wml.xsl"?>
<bolsa>
<data>17-09-2008</data>
<empresa>
<nome>Altri</nome>
<estado>Desce</estado>
<cota>2,410</cota>
<hora>17:25</hora>
<varia>0,01</varia>
</empresa>
<empresa>
<nome>BCP</nome>
<estado>Desce</estado>
<cota>1,210</cota>
<hora>15,29</hora>
<varia>0,02</varia>
</empresa>
<empresa>
<nome>Brisa</nome>
<estado>Sobe</estado>
<cota>6,910</cota>
<hora>15,29</hora>
<varia>0,23</varia>
</empresa>
<empresa>
<nome>EDP</nome>
<estado>Desce</estado>
<cota>2,920</cota>
<hora>15,29</hora>
<varia>-0,03</varia>
</empresa>
<empresa>
<nome>REN</nome>
143
XSL
<estado>Desce</estado>
<cota>2,720</cota>
<hora>15,29</hora>
<varia>-0,05</varia>
</empresa>
</bolsa>
<xsl:template match="/">
<wml>
<card id="carro" title="Cotaes na Bolsa">
<p align="center">
Cotaes na Bolsa:
</p>
<xsl:apply-templates select="bolsa/empresa"/>
<font size="-3"><xsl:value-of select="bolsa/data"/></font>
</card>
</wml>
</xsl:template>
<xsl:template match="empresa">
<b><xsl:value-of select="nome" /></b>
(<xsl:if test="estado='Desce'"><img src="dn_tend.gif"/>
</xsl:if>
<xsl:if test="estado='Sobe'">
<img src="up_tend.gif"/>
</xsl:if>
)
- <xsl:value-of select="cota" />
<br/>
</xsl:template>
</xsl:stylesheet>
O resultado da sua aplicao seria um documento WML que poder ser visualizado num emulador (Figura 30).
144
XSL
Gerar XML
Pretende-se neste exemplo mostrar a gerao de um novo documento XML mas com estrutura diferente.
Embora parea estranho, trata-se de uma operao til e comum apara integrar dois sistemas que idem com
informao diferente.
Considere-se ento, por exemplo, o seguinte documento XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="old.xsl"?>
<portfolio>
<stock>
<symbol>HHDT</symbol>
<oprice>100</oprice>
<cprice>25</cprice>
</stock>
<stock>
<symbol>NHSJ</symbol>
<oprice>20</oprice>
<cprice>1000</cprice>
</stock>
</portfolio>
145
Caso de Estudo
XSL
Note-se que houve uma transformao na estrutura, trocando-se elementos por atributos.
Caso de Estudo
146
XSL
Caso de Estudo
xsi:noNamespaceSchemaLocation="percursos.xsd">
<percurso id="1" tipo="caminhada">
<nome>Soajo </nome>
<distancia units="kms"> 8 </distancia>
<dificuldade> 1 </dificuldade>
<epoca>Vero </epoca>
<track tipo="gps"> waypoints_soajo.txt </track>
<responsavel>
<respnome>Ana Silva </respnome>
<contacto>93577969 </contacto>
<email>asilva@activity.com </email>
</responsavel>
</percurso>
<percurso id="2" tipo="btt">
<nome>Muro </nome>
<distancia units="kms"> 14 </distancia>
<dificuldade>5 </dificuldade>
<epoca>Todo o ano </epoca>
<track tipo="gps"> waypoints_muro.txt </track>
<responsavel>
<respnome>Ana Silva </respnome>
<contacto>93577969 </contacto>
<email>asilva@activity.com </email>
</responsavel>
</percurso>
<percurso id="2" tipo="btt">
<nome>Viana-Soajo</nome>
<distancia units="kms">75 </distancia>
<dificuldade>5</dificuldade>
<epoca>Primavera</epoca>
<track tipo="gps"> waypoints_muro.txt </track>
<responsavel>
<respnome>Lus Ferreira</respnome>
<contacto>93577969 </contacto>
<email>lufer@ipca.pt </email>
</responsavel>
</percurso>
<percurso id="3" tipo="tt">
<nome> Gers </nome>
<distancia units="kms"> 140 </distancia>
<dificuldade>2 </dificuldade>
<epoca>Primavera </epoca>
<track tipo="gps"> waypoints_geres.txt </track>
<responsavel>
<respnome>Lus Ferreira</respnome>
<contacto>93577969 </contacto>
<email> lufer@ipca.pt </email>
</responsavel>
</percurso>
<percurso id="1" tipo="caminhada">
<nome>Varzea </nome>
<distancia units="kms"> 12 </distancia>
<dificuldade> 3 </dificuldade>
<epoca>Inverno </epoca>
<track tipo="gps"> waypoints_soajo.txt </track>
<responsavel>
<respnome>lufer</respnome>
<contacto>93577969 </contacto>
<email>lufer@activity.com </email>
</responsavel>
</percurso>
</percursos>
Como se pode verficar no incio deste documento, existe uma especificao de regras de validao quer por um
DTD, quer por um XML Schema (no so necessrios os dois, basta um deles!). Apresentmo-los em seguida:
DTD:
147
Caso de Estudo
XSL
percursos (percurso)+>
percurso (nome,distancia,dificuldade,epoca,track,responsavel)>
percurso id CDATA #REQUIRED tipo CDATA #REQUIRED>
responsavel (respnome,contacto,email)>
nome (#PCDATA)>
distancia (#PCDATA)>
distancia units CDATA #REQUIRED>
dificuldade (#PCDATA)>
epoca (#PCDATA)>
track (#PCDATA)>
track tipo CDATA #REQUIRED>
respnome (#PCDATA)
contacto (#PCDATA)>
email (#PCDATA)>
XSD:
<xsd:schema:xsd="http://www.w3.org/2001/XML Schema":elementFromDefault="qualified">
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
<xsd:element
name="percursos" type="percursos_type"/>
name:"percurso" type="percurso_type"/>
name="nome" type="xsd:string"/>
name="distancia" type="distancia_type"/>
name="dificuldade" type="xsd:integer"/>
name="epoca" type="xsd:string"/>
name="track" type="track_type"/>
name="responsavel" type="responsavel_type"/>
name="nome" type="xsd:string"/>
name="contacto" type="xsd:string"/>
name="email" type="xsd:string"/>
<xsd:ComplexType name="percursos_type">
<xsd:sequence>
<xsd:element ref="percurso" minOccus="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:compexType>
<xsd:ComplexType name="percurso_type">
<xsd:sequence>
<xsd:element ref="nome"/>
<xsd:element ref="distancia"/>
<xsd:element ref="dificuldade"/>
<xsd:element ref="epoca"/>
<xsd:element ref="track"/>
<xsd:element ref="responsavel"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use:"required"/>
<xsd:attribute name="tipo" type="xsd:string" use:"required"/>
</xsd:compexType>
<xsd:ComplexType name="distancia_type">
<xsd:SimpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="units" type="xsd:string" use:"required"/>
</xsd:extension base>
</xsd:SimpleContent>
</xsd:ComplexType>
<xsd:ComplexType name="track_type"/>
<xsd:SimpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="tipo" type="xsd:string" use:"required"/>
</xsd:extension base>
</xsd:SimpleContent>
</xsd:ComplexType>
<xsd:ComplexType name="responsavel_type"/>
<xsd:sequence>
<xsd:element ref="respnome"/>
<xsd:element ref="contacto"/>
<xsd:element ref="email"/>
148
XSL
Caso de Estudo
</xsd:sequence>
</xsd:ComplexType>
</schema>
149
Caso de Estudo
XSL
<xsl:value-of select="responsavel/email"/>
</td>
</tr>
</xsl:for-each>
<tr>
<td colspan="5" class="BlueWho"><b>BTT</b></td>
</tr>
<xsl:for-each select="percursos/percurso[@tipo='btt']">
<tr>
<td class="BlueWho"><xsl:value-of select="nome"/></td>
<td class="BlueWho"><xsl:value-of select="distancia"/> <xsl:value-of
select="distancia/@units"/></td>
<td class="BlueWho">
<xsl:choose>
<xsl:when test="dificuldade = 2">Mdia</xsl:when>
<xsl:when test="dificuldade =5">Exigente</xsl:when>
<xsl:otherwise>Fcil</xsl:otherwise>
</xsl:choose>
</td>
<td class="BlueWho"><xsl:value-of select="epoca"/></td>
<td class="BlueWho">
<xsl:value-of select="responsavel/respnome"/><br/>
<xsl:value-of select="responsavel/contacto"/><br/>
<xsl:value-of select="responsavel/email"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Trata-se de uma listagem geral de todas as actividades, agrupadas por Tipo de actividade e apresentadas com
recurso a uma CSS. O resultadoa da sua aplicao seria:
Considere-se agora uma outra XML StyleSheet que pretende identificar somente as actividades, sem qualquer
tratamento nem mesmo agrupamento.
150
XSL
Caso de Estudo
todospercursos.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<HTML>
<BODY class="content">
<TABLE BORDER="1">
<TR>
<TD><b>Nome</b></TD>
<TD><b>Distancia</b></TD>
<TD><b>Dificuldade</b></TD>
<TD><b>Tipo</b></TD>
<TD><b>Epoca - <xsl:value-of
select="/percursos/percurso[0]/distancia"/></b></TD>
</TR>
<xsl:for-each select="percursos/percurso">
<TR>
<TD><xsl:value-of select="nome"/></TD>
<TD><xsl:value-of select="distancia"/><xsl:value-of
select="@units"/></TD>
<TD><xsl:value-of select="dificuldade"/></TD>
<TD><xsl:value-of select="@tipo"/></TD>
<TD><xsl:value-of select="epoca"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Vejamos agora uma outra XML StyleSheet que pretende identificar somente as actividades de um determinado
tipo, neste caso Caminhadas.
percursoscaminhadas.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<HTML>
<BODY class="content">
<TABLE BORDER="1">
<TR>
<TD><b>Nome</b></TD>
Lus Ferreira - IPCA-EST 2014
151
Caso de Estudo
XSL
<TD><b>Distancia</b></TD>
<TD><b>Dificuldade</b></TD>
<TD><b>Tipo</b></TD>
<TD><b>Epoca</b></TD>
</TR>
<xsl:for-each select="percursos/percurso[@tipo='caminhada']">
<TR>
<TD><xsl:value-of select="nome"/></TD>
<TD><xsl:value-of select="distancia"/><xsl:value-of
select="@units"/></TD>
<TD><xsl:value-of select="dificuldade"/></TD>
<TD><xsl:value-of select="@tipo"/></TD>
<TD><xsl:value-of select="epoca"/></TD>
</TR>
</xsl:for-each>
<TR>
<TD>Distncia total: <xsl:value-of
select="sum(percursos/percurso[@tipo='caminhada']/distancia)"/></TD>
</TR>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
152
XSL
Caso de Estudo
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Em jeito de comentrio final deste Caso de Estudo, anotar que neste caso de estudo se pode constatar que
possvel, facilmente, redefinir a forma e formato com que se pretende apresentar os dados (neste caso em
formato XML), sem contudo os ter que alterar. Esta uma particularidade da tecnologia XML/XSLT.
153
XML
Concluso
Concluso
A elaborao deste documento pretendeu acima de tudo expor o que de mais relevante existe volta da
tecnologia XML. Viu-se que essencial saber como escrever correctamente um documento XML; essencial
definir mecanismos que validem essa escrita, tanto em regras sintticas como de estrutura e contedo.
Falamos ento de DTD e XML Schemas. Viu-se tambm que qualquer documento XML armazenado numa
estrutura de dados tipo rvore invertida e sobre a qual necessrio e possvel intervir com operaes do tipo,
alterar posies de elementos, alterar contedos, inserir ou remover elementos, atributos ou contedos, etc.
Aqui aplicavam-se regras XPAth que garante que todos os processos de navegao e interveno na referida
rvore sejam feitos segundo regras bem definidas.
Por fim, analisou-se com detalhe operaes de transformao sobre documentos XML, desde filtragem de
informao at converso dos dados originais em qualque outro formato pretendido. Analisamos para isso o
XML StyleSheet Transformation XSLT, uma parte do XSL.
Procurou-se desde o incio apoiar todas as explanaes com recurso a exemplos prticos, simples e objectivos.
Restou o facto de no ter sido abordado a forma como uma rvore XML pode ser manipulada em memria
atravs de DOM (ou eventuamente SAX) mas que se recomenda a sua anlise. Vrias tecnologias Web como o
Javascript, AJAX, etc., lidam necessariamente com DOM. A Sebenta da disciplina de Programao para a Web
aborda com mais detalhe esta temtica. Recomenda-se por isso a sua consulta.
155
XML
Bibliografia
Bibliografia
Livros e Outros
Beginning XSLT 2.0: : From Novice to Professional, Jeni Tennison, Apress, 2005
XSLT and XPath On The Edge, Jeni Tennison, John Wiley & Sons, 2001
XML Professional Skills Development, Application Developers Training Company and AppDev
Products Company, 2008
Revistas
Web sites
http://www.jenitennison.com/xslt/index.html
W3C: http://www.w3.org
http://www.dpawson.co.uk/xsl/xslfaq.html
XSL-List: http://www.mulberrytech.com/xsl/xsl-list/index.html
VBXML: http://www.vbxml.com
157
XML
ANEXO
ANEXO
Classes de caracteres
Agrupamentos
Alternncia
Ocorrncias
Classes de caracteres
Classe
Descrio
Alternativa
\d
dgitos
[0-9]
\w
caracteres de texto
[a-zA-Z0-9_]
\s
\D
negar \d
[^\d]
\S
negar \s
[^\s]
16
http://www.perldoc.com/perl5.6/pod/perlre.html
Recomenda-se a consulta da Sebenta da disciplina de ISI (2009)
18
Consultar tambm http://www.regular-expressions.info/xml.html
17
159
ANEXO
XML
\W
negar \w
[^\w]
\i
[_:A-Za-z]
\c
[-._:A-Za-z0-9]
negao de \c e \i
qualquer caractere excepto o new line
\b
\B
Exemplos:
\i\c*
<\i\c*\s*>
</\i\c*\s*>
<\i\c*(\s+\i\c*\s*=\s*("[^"]*"|'[^']*'))*\s*>
[class-[subtract]]
Exemplo:
[a-z-[aeiuo]]
Alternncia
Permite especificar um conjunto de valores a pesquisar. A sintaxe :
exp1 | exp2 | exp3 | | expn
160
XSL
ANEXO
Exemplo:
Dia|Day
Agrupamentos
Permite especificar ocorrncias num conjunto de expresses regulares. Sobre elas possvel aplicar operadores
de repetio.
Ocorrncias
Permite especificar a repetio (ou quantificar) pretendida sobre determinada expresso regular.
Quantificador
*
+
?
{n}
{n,}
{n,m}
Descrio
Zero ou mais vezes.
Uma ou mais vezes.
Opcional, ie, zero ou uma vez.
Ocorrer exactamente n vezes
Ocorre pelo menos n vezes
Ocorre pelo menos n vezes e no mais do que m vezes.
Exemplos:
<[A-Za-z][A-Za-z0-9]*>
(AB)+C
{0,}
- o mesmo que *
{1,}
- o mesmo que +
\b[1-9][0-9]{3}\b
Nov(embro)?
Exemplos
161
ANEXO
XML
Expresso
Encontra
Chapter \d
Chapter\s\d
Chapter seguido de caractere em branco (espao, tab, newline, etc.), seguido de um dgito
Chapter\s\w
Chapter seguido de caractere em branco (espao, tab, newline, etc.), seguido de um caractere
palavra (XML 1.0 Letter or Digit)
Española
Espaola
a*x
a?x
ax, x
a+x
(a|b)+x
ax, bx, aax, abx, bax, bbx, aaax, aabx, abax, abbx, baax, babx, bbax, bbbx, aaaax ....
[abcde]x
[a-e]x
[\-ae]x
-x, ax, ex
[ae\-]x
ax, ex, -x
[^0-9]x
\Dx
.x
.*abc.*
ab{2}x
abbx
ab{2,4}x
ab{2,}x
(ab){2}x
ababx
162