Linguagens de Marcação
Extensíveis
Giovani Rubert Librelotto, PhD
UFSM
[email protected]
Document Composer
Document Composer
•  É uma aplicação XML para extração de
informação de repositórios XML.
3
Motivação
•  Ensinar a manipular o modelo de dados
que existe nos principais motores de
XML:
–  Com utilização do XPath
–  Sem conhecimento do XSLT
4
Ferramentas Semelhantes
•  XMLSpy XPath tool
–  Pode ser usada apenas com conhecimentos
de XPath
–  Não permite extração de resultados
•  Implementações do XPath ou XQuery
–  Exigem o conhecimento da linguagem em
que estão implementados
5
Arquitetura do Document Composer
•  Linguagem de Consulta
–  XPath embebido em XML
•  Cálculo de resultados
–  Stylesheet XSLT
•  Visualização de resultados
–  Stylesheet XSLT
6
Exemplos de Processos
•  XCSL, Schematron:
–  validação semântica em documentos XML
•  GRAPHOTRON:
–  definição de vistas sobre grafos
•  XTche:
–  validação semântica em Topic Maps
•  MTRANS:
–  conversão de modelos MOF
7
No Document Composer...
•  Regras do processo:
–  queries escritas em XPath
•  Processo:
–  extração dos nodos que forem selecionados
•  Meta stylesheet:
–  definida nos próximos slides
•  Stylesheet que implementa o processo:
–  copia para a saída os nodos selecionados
•  Resultados:
–  documento XML composto pelos nodos
selecionados
8
XPQL – XPath Query Language
•  Algumas preocupações adicionais:
–  Poder colocar queries a mais do que um documento
–  Poder colocar os resultados de uma query numa
subárvore específica
–  Especificar a entrada e a saída conjuntamente
9
Arquitetura do Document Composer
10
Composer.bat
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
• 
rem $Id: composer.bat,v 1 2003/10/15 jcr $
@echo off
echo --------- XML Composer by jcr: 2003.10.16 ---------------------if not exist %1 goto :end
if exist temp\nul goto :skiptemp
rem ------------ inits -----------mkdir temp
:skiptemp
del temp\*.* /q
echo -Step1- Generating the specific stylesheet ---------------------saxon %1 composer.xsl > comp-query.xsl
echo -Step2- Computing queries ---------------------------------------saxon comp-driver.xml comp-query.xsl > temp\comp-res.xml
echo --- Results in: temp\comp-res.xml ----------------------------goto :finish
:end
echo ERROR: Wrong number of parameters
echo SYNTAX: composer query.xml
echo
query.xml: XML document containing the queries
:finish
echo --- That's all folks! ----------------------------------------
11
Ex 1: Arquivo Sonoro de EVO
<?xml version="1.0" encoding="ISO-8859-1"?>
<arq>
<doc>
<prov>Alentejo</prov>
<local>Santa Vitória, Beja</local>
<tit>Disse a laranja ao limão</tit>
<musico>Jorge Montes Caranova (viola
campaniça)</musico>
<file t="MP3">d1/evo001.mp3</file>
<duracao>1:02</duracao>
</doc>
...
</arq>
12
Ex 1: Arquivo Sonoro de EVO
•  Selecionar o título das músicas que
contêm a palavra “Jesus”
•  Selecionar o nome de todos os músicos
referidos
•  Selecionar o título de todas as músicas de
“Castelo Branco”
13
Pipeline de Execução – EVO
XPQL_EVO.xml
comp_driver.xml
comp_res.xml
composer.xsl
comp_query.xsl
14
Ex 1: XPQL_EVO.xml
<?xml version="1.0" encoding="UTF-8"?>
<new-doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="composer.xsd">
<target>doc-result</target>
<part>
<source>arq-son-EVO.xml</source>
<container>result-set</container>
<query-set>
<query>
<container>result</container>
<qexp>//tit[contains(.,'Jesus')]</qexp>
</query>
<query>
<container>result</container>
<qexp>//musico</qexp>
</query>
<query>
<container>result</container>
<qexp>//doc/tit[contains(../local,'Castelo Branco')]</qexp>
</query>
</query-set>
</part>
</new-doc>
15
Resultados
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<doc-result>
<result-set>
<result>
<result>
<tit>Versos ao Menino Jesus</tit>
</result>
<result>
<tit>Versos ao Menino Jesus e Glória</tit>
</result>
<result>
<tit>Canto ao menino Jesus</tit>
</result>
<result>
<tit>Versos ao menino Jesus; na Igreja</tit>
</result>
...
16
Ex 2: Lista de Publicações
•  Existe um repositório XML com
publicações
–  Um autor só é preenchido no primeiro
registo, nos seguintes é utilizada uma
referência
–  Pretende-se uma lista de publicações do ano
2003
17
Pipeline de Execução – jcrpubs
XPQL_jcrpubs.xml
comp_driver.xml
comp_res.xml
composer.xsl
comp_query.xsl
18
Ex 2: XPQL_jcrpubs.xml
<?xml version="1.0" encoding="UTF-8"?>
<new-doc xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="composer.xsd">
<target>bienio0304</target>
<part>
<source>jcrpubs.xml</source>
<container>pubs2003</container>
<query-set>
<query>
<qexp>//*[year='2003']</qexp>
</query>
</query-set>
</part>
</new-doc>
19
Produção dos Resultados
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<bienio0304>
<pubs2003>
<inproceedings id="RS2003">
<author-ref authorid="jcr"/>
<author id="jls">José Luis Santos</author>
<title>Electronic Publishing of ADB editions</title>
<booktitle>Electronic Publishing 2003: From
information to knowledge</booktitle>
<year>2003</year>
<address>Universidade do Minho - Guimarães Portugal</address>
<month>06.25</month>
<deliverables>
<pdf url="artigos/2003/epublishing-adb.pdf"/>
</deliverables>
</inproceedings>
...
20
Exercícios
•  Faça os exercícios da página, referentes a
Lista de Exercícios 1.
21
comp_query.xsl à EVO
<?xml version="1.0" encoding="utf-8" standalone="yes"?><!-<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<axsl:output method="xml" omit-xml-declaration="no" encoding="iso-8859-1" standalone="yes" indent="yes"/>
<axsl:template match="/">
<doc-result>
<axsl:element name="result-set">
<result>
<axsl:apply-templates mode="P1Q0" select="document('arq-son-EVO.xml')"/>
</result>
<result>
<axsl:apply-templates mode="P1Q1" select="document('arq-son-EVO.xml')"/>
</result>
<result>
<axsl:apply-templates mode="P1Q2" select="document('arq-son-EVO.xml')"/>
</result>
</axsl:element>
</doc-result>
</axsl:template>
<axsl:template mode="P1Q0" match="//tit[contains(.,'Jesus')]">
<result>
<axsl:copy-of select="."/>
</result>
</axsl:template>
<axsl:template match="text()" priority="-1" mode="P1Q0"/>
<axsl:template mode="P1Q1" match="//musico">
<result>
<axsl:copy-of select="."/>
</result>
</axsl:template>
<axsl:template match="text()" priority="-1" mode="P1Q1"/>
<axsl:template mode="P1Q2" match="//doc/tit[contains(../local,'Castelo Branco')]">
<result>
<axsl:copy-of select="."/>
</result>
</axsl:template>
<axsl:template match="text()" priority="-1" mode="P1Q2"/>
<axsl:template match="text()" priority="-1"/>
Giovani Rubert Librelotto – [email protected]
</axsl:stylesheet>
22
comp_query.xsl à jcrpubs
<?xml version="1.0" encoding="utf-8" standalone="yes"?><!-<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/
1999/XSL/Transform" version="1.0">
<axsl:output method="xml" omit-xml-declaration="no" encoding="iso-8859-1" standalone="yes"
indent="yes"/>
<axsl:template match="/">
<bienio0304>
<axsl:element name="pubs2003">
<axsl:apply-templates mode="P1Q0" select="document('jcrpubs.xml')"/>
</axsl:element>
<axsl:element name="authors">
<axsl:apply-templates mode="P2Q0" select="document('jcrpubs.xml')"/>
</axsl:element>
</bienio0304>
</axsl:template>
<axsl:template mode="P1Q0" match="//*[year='2003']">
<axsl:copy-of select="."/>
</axsl:template>
<axsl:template match="text()" priority="-1" mode="P1Q0"/>
<axsl:template mode="P2Q0" match="//author">
<axsl:copy-of select="."/>
</axsl:template>
<axsl:template match="text()" priority="-1" mode="P2Q0"/>
<axsl:template match="text()" priority="-1"/>
</axsl:stylesheet>
23
Cálculo das Queries (1)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:template match="/">
<axsl:stylesheet version="1.0">
<axsl:output method="xml" omit-xml-declaration="no"
encoding="iso-8859-1" standalone="yes" indent="yes"/>
<axsl:template match="/">
<xsl:element name="{new-doc/container}">
<xsl:apply-templates select="new-doc/part" mode="do-all-parts"/>
</xsl:element>
</axsl:template>
<xsl:apply-templates/>
</axsl:stylesheet>
</xsl:template>
24
Cálculo das Queries (2)
<xsl:template match="query" mode="do-all-parts">
<axsl:apply-templates mode="P{count(../../preceding- sibling::*)}
Q{count(precedingsibling::*)}“
select="document('{../../source}')"/>
</xsl:template>
<xsl:template match="part" mode="do-all-parts">
<xsl:choose>
<xsl:when test="container">
<axsl:element name="{container}">
<xsl:apply-templates mode="do-all-parts" select="query-set"/>
</axsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates mode="do-all-parts" select="query-set"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
25
Cálculo das Queries (3)
<xsl:template match="query">
<axsl:template mode="P{count(../../preceding-sibling::*)}
Q{count(preceding-sibling::*)}" match="{qexp}">
<xsl:choose>
<xsl:when test="container">
<xsl:element name="{container}">
<axsl:copy-of select="."/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<axsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</axsl:template>
</xsl:template>
26
Conclusão
•  Testada em alguns casos práticos de pequena
dimensão
•  No contexto de aprendizagem teve bons
resultados
•  Em desenvolvimento:
–  Interface gráfica
–  Suporte de NameSpaces
–  Novos atributos associados ao elemento container
–  Criar um NameSpace próprio e uma lista de casos
de uso.
–  Suportar a pipeline de execução através de XPDL.
27
Download

Linguagens de Marcação Extensíveis Giovani