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