Processamento de Documentos Estruturados usando StyleSheets (XSL | CSS | DSSSL)
DSSSL
Composição
•	Duas linguagens principais para preparar o documento e formatá-lo:
•	Uma linguagem para especificar a transformação de um ou mais documentos XML/SGML num ou mais documentos XML/SGML.
•	Uma linguagem para especificar a aplicação de atributos de formatação a um documento XML/SGML.
•	E outras duas linguagens auxiliares:
•	Uma linguagem de interrogação/selecção – SDQL
•	Uma linguagem funcional de cálculo de expressões - Scheme
Modelo Conceptual
•	Uma especificação de transformação
•	Uma especificação de estilo

Figura 1: Modelo Conceptual
Linguagem de Transformação

•	Rearranjo de estruturas – reordenação e/ou agrupamento de estruturas existentes.
•	 Construção de novos elementos relecionados com outros já existentes: índices ...
•	Associação de novas características a sequências específicas de conteúdo: “o primeiro parágrafo de cada capítulo”...
•	Associação de novas características a componentes específicos de conteúdo (texto).

O Processo de Transformação

Figura 2: Processo de Transformação
Construção do Grove
Uma estrutura para representação de documentos estruturados:
data Grove = Cgrove Nodo
      deriving Show

data Nodo = Cnodo String [Nodo] [Nodo]
          | Cntexto String
          | Cnatrib String String
      deriving Show

(mostrar demonstração da XAM)
Exemplo
<RECEITAS>
  <TITULO> O Meu Livro de Receitas </TITULO>
  <RECEITA ORIGEM="Portugal">
    <TITULO> Bolo </TITULO>
    <INGREDIENTE> 500g de farinha </INGREDIENTE>
    <INGREDIENTE> 200g de açucar </INGREDIENTE>
    <INGREDIENTE> 300g de manteiga </INGREDIENTE>
    </RECEITA>
</RECEITAS>

Figura 3: Grove das “Receitas”
Transformação
•	Composta por um conjunto de associações
•	Cada associação é um triplo:
•	Uma expressão de query (SDQL) para seleccionar
•	Uma expressão de transformação (Scheme)
•	Uma expressão de prioridade (é opcional)
Exemplo
; Transformação identidade
;    cria um novo grove igual ao primeiro
;

(=> (tudo) (transf-por-defeito))

; em que tudo é a Exp-Selecção

(define (tudo)
  (subgrove (current-root)))

; em que transf-por-defeito é a Exp-Transformação

(define (transf-por-defeito)
  (if (occurrence-mode (current-node))
      (transf-por-origem)
      (create-root #f (copy-current))))

(define (transf-por-origem)
  (create-sub
    (origin (current-node))
    (copiar-actual)
    (property: (occurrence-mode (current-node)))))

(define (copiar-actual)
  (subgrove-spec node: (current-node)))
Linguagem de Estilo
•	Aplica estilos de apresentação ao conteúdo do documento original.
•	Determina a posição do conteúdo na organização física das páginas.
•	Selecciona e reordena o conteúdo do documento final.
•	Inclui material que não estava presente no documento original.
•	Exclui, do documento final, material presente no documento original.
Regras de Construção
Cinco tipos: query, id, element, default, root.
Exemplos:
(root
  (make display-group
    (process-children)
  )
)

(default
  (process-children)
)

(element (seccao titulo)
  (make paragraph
    font-family-name: "Helvetica"
    font-weight: 'bold
    (process-children)
  )
)

(id ("sec2")
  (make paragraph
    font-family-name: "Helvetica"
    font-weight: 'bold
    (process-children)
  )
)

(query q-class 'pi
  (make paragraph
    literal "Instrução de Processamento:"
    (node-property 'system-data (current-node))
  )
)

O Processo de Formatação

Figura 4: Processo de Formatação
Exemplo: básico
(root
  (make simple-page-sequence
     (process-children))
)
Exemplo: adicionando margens
(root
  (make simple-page-sequence
    left-margin:    3cm
    right-margin:   2cm
    top-margin:     3cm
    bottom-margin:  3cm
    (process-children))
)
Exemplo: formatando os títulos
(element (RECEITAS TITULO)
  (make paragraph
    quadding: 'center
    font-size: 18pt
    keep-with-next?: #f
    (process-children))
)

(element (RECEITA TITULO)
  (make paragraph
    quadding: 'left
    font-size: 16pt
    keep-with-next?: #f
    (process-children))
)
Exemplo: adicionando variáveis
;Constantes

(define *tituloPrinc* 18pt)
 (define *tituloReceita* (- *tituloPrinc* 2))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(element (RECEITAS TITULO)
  (make paragraph
    quadding: 'center
    font-size: *tituloPrinc*
    keep-with-next?: #f
    (process-children))
)

(element (RECEITA TITULO)
  (make paragraph
    quadding: 'left
    font-size: *tituloReceita*
    keep-with-next?: #f
    (process-children))
)
Exemplo: com mais de uma passagem sobre o documento
(element RECEITAS
  (make sequence
    (literal "Ingredientes necessários:")
    (make paragraph  
      (with-mode *ingredientes*
        (process-matching-children "INGREDIENTE")))
    (process-children))
)

(mode *ingredientes*
  (element INGREDIENTE
    (if (= (child-number) 1)
      (make sequence
        font-posture: 'italic
        (process-children))
      (make sequence
        font-posture: 'italic
        (literal " & ")
        (process-children))))
  (default
    (empty-sosofo)))