Skip to content

Latest commit

 

History

History
427 lines (305 loc) · 19.3 KB

UsandoXSLT.md

File metadata and controls

427 lines (305 loc) · 19.3 KB

estado do documento: incompleto.

Um colaborador indicou XML Transformations (XSLT) há uns anos. Só agora concluí que é útil explorar mais o assunto.

Introdução

É uma ferramenta que permite aplicar transformações sobre XML. As transformações são codificadas num 'dialeto' específico de XML, com IRI http://www.w3.org/1999/XSL/Transform. Já vi referenciado como XSL e como XSLT. Usualmente a extensão do arquivo que contém a especificação da transformação é .xsl. A ferramenta é denominada, genericamente, XSLT Processor. Navegadores têm a ferramenta embutida. Existem ferramentas standalone como Saxon,que tem versão gratuita.

Em uma abordagem superficial, XSLT é uma transformação sobre XML, semelhante a CSS,que é uma transformação sobre HTML.

As transformações possíveis com XSLT incluem troca de tags XML, inclusão, exclusão de conteúdo e formato. É mais poderosa que CSS, há quem afirme que a XSLT é Turing-Completa. Fonte Wikipedia.

nota: Não procurei em referências científico-acadêmicas a definição de Turing-Completo, nem a demonstração que XSLT é Turing-Completa.

Atualmente a especificação XSLT está na versão 3.0. Um 'curso' sobre XSLT versão 1.0 está disponível em W3CSchools. A especificação traz as definições de termos explicitamente, contém exemplos, em resumo, contém mais informação e é mais volumosa. O curso apresenta exemplos para replicar, modificar e ver funcionando, com os conceitos necessários para entender o exemplo, sem abordar o funcionamento da ferramenta.

Tenho interesse particular em transformar um formato de codificação de grafos, como graphML ou GML para RDF e vice-versa. Estou inclinado a usar GML (mais precisamente, XGML) pois o graphML gerado pelo yEd é bem complicado, enquanto o XGML parece menos complicado.

Abordagem escolhida

Navegadores têm um processador XSLT embutido, mas seu controle de segurança e privacidade está configurado de maneira que não permite a execução das transformações armazenadas localmente (ver Discussão). Por isso um servidor web passa a ser necessario. Como tenho Fuseki (Jetty) instalado, é este que será usado. A pasta que contém as páginas é FUSEKI_HOME/webapp. Acrescentei uma pasta e, dentro dela, um índice e os arquivos de teste, resultados e cópias de tela. Uma cópia da pasta está neste repositório Github. O endereço de acesso na minha instalação é http://localhost:3030/xslt/index.html

Resultados

1

Existem alguns projetos que empregam XSLT para converter XML Schema para XML:RDF :

O uso nessa transformação foi objeto de análise por um grupo da W3C. Wiki da W3C

2

Na elaboração dos testes vi que existe um repositório do github com mais de 11mil testes de XSLT.

3

XSLT usa XPATH.

<xsl:apply-templates/> aplica os templates no nó corrente e nos filhos, mas não aplica recursivamente.

Quando dentro de um template com um match="coisa" tem um apply-templates com um select="coisa", resulta recursividade. "coisa" é XPATH

XPATH introduz novos tipos de nós, além dos definidos em XML:

Ref

Os tipos de nós definidos em XML são:

  • document node
  • element node
  • text nodes
  • attribute node
  • comment nodes

node

Conceitos mínimos de XML para avançar para os tópicos XML:RDF, SPARQL, XSLT contidos neste repositório

Nós sem pais nem filhos só podem ser valores e são designados valores atômicos (atomic values)

valores atômicos ou nós são ítens (items).

As relações entre nós é explicada com detalhes em Ref.

Ok, entendi. XPATH é inspirado em sistemas de arquivos.

Agora consegui, em duas tentativas, formular a string de busca do google que retorna o que estou buscando:

  1. get path in xpath Esta retornou uma resposta em javascript, por isso na segunda incluí xslt
  2. xslt get current path

nota: Ser capaz de formular uma string de busca foi o resultado imediato de alguns dias e estudo focado, somado ao meu contexto.

Para listar os caminhos para os nós: https://stackoverflow.com/questions/953197/how-do-you-output-the-current-element-path-in-xslt/10112579

Semelhança entre construtos de XSLT com construtos de linguagens procedurais

Esta é a lista de elementos definidos em XSLT.

Elemento Descrição Mapeamento apply-imports Applies a template rule from an imported style sheet

apply-templates Applies a template rule to the current element or to the current element's child nodes Semelhante a invocação de método Semelhante a chamada de procedimento

attribute Adds an attribute attribute-set Defines a named set of attributes

call-template Calls a named template Semelhante a invocação de método Semelhante a chamada de procedimento

choose Used in conjunction with and to express multiple conditional tests Semelhante a switch

comment Creates a comment node in the result tree Semelhante a print

copy Creates a copy of the current node (without child nodes and attributes) Semelhante a print

copy-of Creates a copy of the current node (with child nodes and attributes) Semelhante a print

decimal-format Defines the characters and symbols to be used when converting numbers into strings, with the format-number() function

element Creates an element node in the output document semelhante a print

fallback Specifies an alternate code to run if the processor does not support an XSLT element catch

for-each Loops through each node in a specified node set Semelhante a foreach

if Contains a template that will be applied only if a specified condition is true if

import Imports the contents of one style sheet into another. Note: An imported style sheet has lower precedence than the importing style sheet include

include Includes the contents of one style sheet into another. Note: An included style sheet has the same precedence as the including style sheet include

key Declares a named key that can be used in the style sheet with the key() function

message Writes a message to the output (used to report errors) System.err.print fprintf (2, "...

namespace-alias Replaces a namespace in the style sheet to a different namespace in the output

number Determines the integer position of the current node and formats a number

otherwise Specifies a default action for the element default

output Defines the format of the output document

param Declares a local or global parameter declaraçao de variável

preserve-space Defines the elements for which white space should be preserved

processing-instruction Writes a processing instruction to the output

sort Sorts the output

strip-space Defines the elements for which white space should be removed

stylesheet Defines the root element of a style sheet

template Rules to apply when a specified node is matched

text Writes literal text to the output printf

transform Defines the root element of a style sheet

value-of Extracts the value of a selected node

variable Declares a local or global variable

when Specifies an action for the element case

with-param Defines the value of a parameter to be passed into a template passagem de parâmetro em chamada de procedimento.

4

São catorze testes ao todo, acessados por Testes e resultados (para executar, copiar a pasta para dentro da pasta webapp de Fuseki e acessar o conteúdo com o navegador). Abaixo um resumo:

  • Teste 1: o do primeiro tutorial da W3Schools. Fonte: W3S
  • Teste 5: transformação 'identidade'.Fonte: stackoverflow
  • Teste 10: Teste superficial de suporte do navegador para migrar para XSLT versão 3.0, que tem mais funcionalidades que a versão 1.0. Recomendação XLST versão 3.0: Fonte: W3C.
  • Teste 14: Percorre a árvore XML, escrevendo na saída o caminho descendente até o nó corrente.

Os outros testes, intermediários, são passos incrementais dos citados no resumo.

nota: não fiquei muito satisfeito em deixar uma parte da documentação aqui e outra no index.html dentro da pasta xslt.

Variáveis

Em XSLT, que é dita uma linguagem funcional, variáveis funcionam ligeiramente diferente de C, Java, ...

Uma das diferenças é que variáveis são imutáveis: seu valor é atribuído na criação e uma vez criada, seu valor não muda. Referências listadas abaixo:

Isto torna muito mais atraente o uso de parâmetros de funções. Reorganizar o código em função deste mecanismo é sempre possível.

Templates (funções)

Declarar: https://www.w3schools.com/xml/ref_xsl_el_template.asp

Aplicar (executar, chamar, invocar): https://www.w3schools.com/xml/ref_xsl_el_apply-templates.asp, https://www.w3schools.com/xml/ref_xsl_el_call-template.asp

Parâmetros

https://www.w3schools.com/xml/ref_xsl_el_with-param.asp https://www.w3schools.com/xml/ref_xsl_el_param.asp

Listas, conjuntos, sequências

São úteis para indexar, armazenar e recuperar informação (por exemplo nós em grafos). Em transformações deste tipo, é útil ter algo que sirva como uma tabela de símbolos (terminologia de construção de compiladores). Estas estruturas e as funções associadas podem ser usadas para isso.

Attribute set (são conjuntos de atributos)

https://www.w3schools.com/xml/ref_xsl_el_attributeset.asp

Sequências (são value-of)

https://www.w3schools.com/xml/xsl_functions.asp#sequence https://www.google.com/search?channel=fs&client=ubuntu&q=xslt+sequence https://stackoverflow.com/questions/14871051/how-to-declare-a-sequence-in-xslt

Listas com chave (chave é algum XML:atributo)

https://www.tutorialspoint.com/xslt/xslt_key.htm https://www.w3schools.com/xml/func_key.asp https://www.w3schools.com/xml/ref_xsl_el_key.asp

Teste de Saxon

Experimentei o Teste 1 na seção 4 usando Saxxon. Copiei os arquivos cdcatalog.xml e cdcatalog.xsl para uma pasta e executei:

java -jar ../SaxonHE10-3J/saxon-he-10.3.jar cdcatalog.xml -xsl:cdcatalog.xsl. Listagem da execução abaixo:

fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ ls
cdcatalog2.xml  cdcatalog.xml  cdcatalog.xsl
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ head cdcatalog.xml
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ head cdcatalog2.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ rm cdcatalog2.xml 
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ ls
cdcatalog.xml  cdcatalog.xsl
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ java -jar ../SaxonHE10-3J/saxon-he-10.3.jar cdcatalog.xml -xsl:cdcatalog.xsl
<!DOCTYPE HTML><html>
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th style="text-align:left">Title</th>
            <th style="text-align:left">Artist</th>
         </tr>
         <tr>
            <td>Empire Burlesque</td>
            <td>Bob Dylan</td>
         </tr>
         <tr>
            <td>Hide your heart</td>
            <td>Bonnie Tyler</td>
         </tr>
         <tr>
            <td>Greatest Hits</td>
            <td>Dolly Parton</td>
         </tr>
         <tr>
            <td>Still got the blues</td>
            <td>Gary Moore</td>
         </tr>
         <tr>
            <td>Eros</td>
            <td>Eros Ramazzotti</td>
         </tr>
         <tr>
            <td>One night only</td>
            <td>Bee Gees</td>
         </tr>
         <tr>
            <td>Sylvias Mother</td>
            <td>Dr.Hook</td>
         </tr>
         <tr>
            <td>Maggie May</td>
            <td>Rod Stewart</td>
         </tr>
         <tr>
            <td>Romanza</td>
            <td>Andrea Bocelli</td>
         </tr>
         <tr>
            <td>When a man loves a woman</td>
            <td>Percy Sledge</td>
         </tr>
         <tr>
            <td>Black angel</td>
            <td>Savage Rose</td>
         </tr>
         <tr>
            <td>1999 Grammy Nominees</td>
            <td>Many</td>
         </tr>
         <tr>
            <td>For the good times</td>
            <td>Kenny Rogers</td>
         </tr>
         <tr>
            <td>Big Willie style</td>
            <td>Will Smith</td>
         </tr>
         <tr>
            <td>Tupelo Honey</td>
            <td>Van Morrison</td>
         </tr>
         <tr>
            <td>Soulsville</td>
            <td>Jorn Hoel</td>
         </tr>
         <tr>
            <td>The very best of</td>
            <td>Cat Stevens</td>
         </tr>
         <tr>
            <td>Stop</td>
            <td>Sam Brown</td>
         </tr>
         <tr>
            <td>Bridge of Spies</td>
            <td>T`Pau</td>
         </tr>
         <tr>
            <td>Private Dancer</td>
            <td>Tina Turner</td>
         </tr>
         <tr>
            <td>Midt om natten</td>
            <td>Kim Larsen</td>
         </tr>
         <tr>
            <td>Pavarotti Gala Concert</td>
            <td>Luciano Pavarotti</td>
         </tr>
         <tr>
            <td>The dock of the bay</td>
            <td>Otis Redding</td>
         </tr>
         <tr>
            <td>Picture book</td>
            <td>Simply Red</td>
         </tr>
         <tr>
            <td>Red</td>
            <td>The Communards</td>
         </tr>
         <tr>
            <td>Unchain my heart</td>
            <td>Joe Cocker</td>
         </tr>
      </table>
   </body>
fabio@fabio-13Z940-G-BK71P1:~/Documentos/ZZfiles/XSOWL/teste1$ 

Testei Saxon com um gerador de grafos aleatórios (gnl.xsl), conforme http://graphml.graphdrawing.org/download.html. Acredito que seja um bom exemplo de uso de transformações e da linguagem XSLT (por exemplo, mostra como ler argumentos de linha de comando), mas fiquei frustrado pois a versão gratuita não tem funcionalidade suficiente.

alt text

Teste Saxon com graphml2rdf, que usei aqui.

Discussão

Acreditei que como navegadores têm processador XSLT embutido, seria possível experimentar com XSLT sem um servidor web, apenas com file:///arquivo.xml na barra de endereço. Porém, quando tentei, a transformação não foi feita. A busca pela solução, e pelo motivo, trouxe resultados desordenados, que apresento abaixo conforme minha forma de organizar.

Em 2019 foi detectada uma característica do navegador que poderia ser explorada por programas maliciosos: Arquivos locais file:/// podiam se localizar e se acessar mutuamente, mesmo que tivessem origem diferente. Por exemplo, seria possível enviar cópias de arquivos locais para um servidor, por exemplo.

A funcionalidade do navegador que controla isso está em Cross Origin Resource Sharing (CORS). O controle, bloqueado por padrão, pode ser habilitado por configuração de usuário.

Isto foi corrigido, mas tornou transformações XSL locais inoperantes:

Como consequência, só é possível experimentar com XSLT sem um servidor web reduzindo a segurança no navegador. Achei melhor usar um servidor web. O que tenho instalado é Fuseki (Jetty, para ser mais preciso).

Outras Referências

https://stackoverflow.com/questions/25959107/convert-xml-file-to-rdf-xml-using-xslt https://www.w3.org/XML/2000/04rdf-parse/

https://stackoverflow.com/questions/3669407/convert-xsd-to-rdf-schema https://rhizomik.net/redefer https://www.google.com/search?channel=fs&client=ubuntu&q=xs2owl https://www.researchgate.net/publication/221038830_XS2OWL_A_Formal_Model_and_a_System_for_Enabling_XML_Schema_Applications_to_Interoperate_with_OWL-DL_Domain_Knowledge_and_Semantic_Web_Tools http://www2.ic.uff.br/~vanessa/material/gdse/09-XSLT.pdf