[LinuxFocus-icon]
Início  |  Mapa  |  Índice  |  Procura

Novidades | Arquivos | Links | Sobre LF
[an error occurred while processing this directive]
convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
por Egon Willighagen

Sobre o autor:

Este ano receberá o seu mestrado e começará o seu doutoramento em quimiometria. Gosta ainda imenso de basketball como gosta do LinuxFocus e do Linux em geral.
Conteúdo:


 

Usando o XML e o XSLT para construir o LinuxFocus.org(/Nederlands)

[Illustration]

Abstrato:

Este artigo contém a apresentação dada no encontro de software livre em Bordéus em Julho. Explica a base de dados XML utilizada para gerar automaticamente o site da LinuxFocus.org(/Nederlands).



 

Introdução

O sistema utilizada no projecto da LinuxFocus para gerir a documentação e a tradução consiste em diversos ficheiros ASCII, incluíndo resdb.txt, o issuedb.txt e o maindb.txt. Estes ficheiros têm um formato fixo e são utilizados para gerar as páginas web. Contudo, são difíceis de estender e a sua natureza separada dos dados torna difícil o manuseamento da informação para um artigo.

A LinuxFocus não gerou muito conteúdo web automaticamente desde que comecei a nova base de dados. Como editor na equipa alemã tinha todo o interesse em ter os ficheiros index.html gerados na site dinamicamente. Editar diversos ficheiros HTML cada vez que um novo artigo é traduzido traduz um enorme esforço e era a causa de muitos links inacessíveis. Assim sendo, pretendia um novo sistema ao qual podesse adicionar informação facilmente e a partir do qual podesse gerar as páginas index para o site. Eu comecei a trabalhar nisto algures no Verão de 2000.

A escolha do XML foi um pouco arbitrária. Foram feitas sugestões para construir uma base de dados relacional, mas tinha experiência no XML e preferia um sistema baseado em ficheiros de texto. Nesse mesmo instante se viu que um novo esquema de numeração seria mais útil, porque a base de dados podia utilizar um tipo de ID em vez de dois ou três esquemas em uso. O Guido Socher procedeu a toda a renumeração, o que foi um grande feito (o meu muito obrigado!).

O Tipo de definição do Documento (DTD) já estava em desenvolvimento, e já havia um pouco de conteúdo na base de dados para testar. Com o novo esquema de numeração, o tempo estava correcto para carregar a base de dados com conteúdo. Depois de ter adicionado cerca de 20 artigos, tornou-se mais claro que isto era uma projecto enorme. Escrever scripts para utilizarem os velhos ficheiros era possível, mas nem toda a informação que a nova base de dados podia conter estava disponível, e como explicado a informação que estava disponível estava distribuída por diversos ficheiros. Felizmente, o Floris Lambrechts envolveu-se e tenho de lhe agradecer profundamente por ter adicionado muito do conteúdo à base de dados. Sem a sua ajuda, o sistema não seria o que é hoje.

Ao mesmo tempo do novo formato também veio a possibilidade de adicionar nova informação. E ao longo do último foram adicionados novos tipos de dados à base de dados. Nos princípios as extensões eram uma tabela de tradutores, editores e outras pessoas envolvidas no LinuxFocus e a localização de ficheiros. A razão para a acrescentar a última tinha haver os vários esquemas para os nomes dos ficheiros usados desde o princípio da LinuxFocus. Durante a renumeração foram reduzidos para dois esquemas. Alguns ficheiros utilizavam includes do lado do servidor e a extensão .shtml, onde velhos artigos utilizavam as extensões .html. A identificação <file> pode ser usado para sobrescrever o utilizado por defeito. (O utilizado por defeito correntemente utiliza um formato "article" + número de artigo + ".shtml". Pode ainda incluir uma opção ".meta" no caso do ficheiro estar no formato meta da LinuxFocus.)

Agora que a base de dados estava a atingir um nível crítico de informação, eu finalmente consegui testar o software que estava a escrever. As correntes folhas de estilo XSLT, não são as primeiras implementações. Foram precedidas pelo código Perl. Mas com o crescimento do tamanho da base de dados a performance tornou-se importante. A primeira tentativa foi simples mas não foi suficientemente boa. Mas antes de iniciar a explicação das ferramentas. Explicarei o formato da base de dados.

 

O Tipo de Definição do Documento (DTD)

Primeiro de tudo, o XML, é uma sintaxe de especificação para linguagens de markup. O XML define como o markup deve parecer. A sintaxe descreve a sequência de caracteres permitidos num documento XML "bem feito". Declara que um documento tem um elemento raíz e que um elemento consiste numa identificação de inicio, conteúdo (texto, elementos filhos, ou ambos) e uma identificação de fim. Estas identificações consistem no caracter "<" seguido do nome e no fim pelo caracter ">". Uma identificação de fim tem de ter uma "/" mesmo em frente ao nome. Identificações vazias como as do HTML <br>, levam uma "/" depois do nome. Uma identificação de inicio pode conter atributos, e estes mesmos têm uma sintaxe específica. As identificações XML assemelham-se a estas:

<greeting>Hello, world!</greeting>
para uma tag vazia
<br/>

Além da sintaxe, as linguagens também contêm semântica. Isto descreve como alguns elementos se relacionam entre si. A semântica do HTML declara que a tag <body> deve estar contida no elemento <html> e não o inverso. A semântica também descreve que o elemento <img> é vazio, bem como o elemento <br>. Se estas semânticas são dadas numa notação formal, podem ser tratadas por um programa e utilizadas para validar o documento que utilize esta semânticas. Uma destas notações formais é chamada de Document Type Definition, ou sem sigla DTD (Definição Tipo de Documento). Se um documento passa no processo de validação, chama-se um documento validada. Você tem de ser cuidadoso com o XML, pois a sua validação é muito rígida.

Agora que sabemos o que é um DTD, demos uma vista de olhos na Base de Dados XML da LinuxFocus. Para as várias especificações apresentaremos um exemplo. Ao examinar estes exemplos obterá uma ideia da informação contida na base de Dados XML da LinuxFocus.

 

<database>

O elemento raíz na base de dados XML da LinuxFocus, uma das suas extensões/localizações, é o elemento <database>.

<!ELEMENT database    (themes?, persons?, issues?, articles?)>
    

Antes de mais, note que o "?" significa que o elemento filho pode ocorrer nenhuma ou uma vez. Assim, a base de dados pode conter informação acerca dos temas LinuxFocus, pessoas, edições e artigos. Visto ser bastante simples, seguirei para um exemplo mais interessante.

 

<themes>

Os Temas estão contidos no elemento <themes> o qual é um elemento filho de <database>. Cada um dos temas tem um só ID, um título e opcionalmente, uma imagem.

<!ELEMENT themes      (theme+)>
  <!ELEMENT theme       (title*, desc?, img?)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT desc       (#PCDATA)>
    <!ELEMENT img         (EMPTY)>
    

Alguns destes elementos tem de ter atributos. Estes são também dados na DTD. Qualquer contexto textual é contido num elemento com o atributo xml:lang. O valor do atributo pode ser qualquer um conforme o ISO 3166 standard para o código dos países. Os exemplos são "en", "fr" e "nl". Quer o id e os atributos xml:langand xml:lang são especificados na especificação XML original e fazem parte da sintaxe do XML.

<!ATTLIST theme       id            ID            #REQUIRED>
<!ATTLIST title       xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST desc        xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST img         src           CDATA         #REQUIRED>
    

Um exemplo de uma base de dados pode parecer-se com isto:

<database>
  <themes>
    <theme id="hw">
      <title xml:lang="en">Hardware</title>
      <img src="Hardware.jpg"/>
    <theme>
  <themes>
</database>
    
 

<issues>

As edições estão contidas no elemento <issues>. Como os temas, as edições têm um único ID.

<!ELEMENT issues      (issue+)>
  <!ELEMENT issue       (title+, published?, file*)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT published   (EMPTY)>
    <!ELEMENT file        (#PCDATA)>
    

O elemento <published> assinala as edições publicadas. A próxima edição e as pseudo edições da mesma Linguagem para Inglês não têm este elemento. O elemento <title> tem novamente o atributo @xml:lang. O elemento <file> denota o directório onde a edição está localizada. Não deve apontar para o index.html, porque é utilizado para determinar a localização dos ficheiros.

Um exemplo (note que usamos o atributo @code para ordenação):

    <issue id="ToBeWritten" code="999996">
      <title xml:lang="en">Not yet written articles</title>
    </issue>
    <issue id="September2001" code="200109">
      <title xml:lang="en">September2001</title>
    </issue>
 

<persons>

Informação acerca dos autores e tradutores são armazenadas nos elementos <person>. Cada pessoa deve ter um único ID.

 <!ELEMENT persons (person+)>
 <!ELEMENT person
              ((name|email)*,(homepage|nickname|desc|team)*)>
 <!ELEMENT email (#PCDATA)>
 <!ELEMENT name (#PCDATA)>
 <!ELEMENT homepage (#PCDATA)>
 <!ELEMENT nickname (#PCDATA)>
 <!ELEMENT desc (#PCDATA|%html-els;)*>
 <!ELEMENT team EMPTY>
    

Cada pessoa pode ter a seguinte informação: um nome, um (ou mais) endereços de correio electrónico, páginas pessoais e alcunhas. Se a pessoa também faz parte de uma equipa de tradução, adicionamos o elemento <team>. Por exemplo, a linha seguinte no elemento <person> quer dizer que o Floris pertence à equipa alemã <team xml:lang="nl"/>. Por fim, cada pessoa pode ter uma descrição, que podem conter vários links.

Um exemplo:

    <person id="nl-ew">
      <name>Egon Willighagen</name>
      <email>egonw@linuxfocus.org</email>
      <team xml:lang="nl"/>
    </person>
 

<articles>

Os artigos, obviamente, a parte mais interessante da base de dados.

  <!ELEMENT articles    (article+)>
    <!ELEMENT article     (title+,
        (file|personref|abstract|issueref|themeref|
         nometa|nohtml|translation|proofread)*)>
      <!ELEMENT abstract    (#PCDATA)>
      <!ELEMENT nohtml      EMPTY>
      <!ELEMENT nometa      EMPTY>
      <!ELEMENT translation
                   (personref*, (reserved|finished|proofread)*)>
      <!ELEMENT reserved    (#PCDATA)>
      <!ELEMENT finished    (#PCDATA)>
      <!ELEMENT proofread   (personref*, (reserved|finished)*)>
<!ATTLIST article     id            ID            #REQUIRED
                      xml:lang      NMTOKEN       #IMPLIED
                      type          (article|coverpage)
                                                  "article"
                      next          IDREF         #IMPLIED
                      prev          IDREF         #IMPLIED>
<!ATTLIST file        xml:lang      NMTOKEN       #REQUIRED
                      type          (target|meta) "target">
<!ATTLIST translation from          NMTOKEN       #REQUIRED
                      to            NMTOKEN       #REQUIRED>

    

Cada artigo tem, pelo menos, um título; um para cada linguagem. O elemento <file> pode ser usado para dar a localização do ficheiro do artigo, quer para o formato META e a versão HTML (veja o exemplo abaixo). No caso de a versão META ou HTML não estar disponível pode utilizar-se os elementos opcionais <nohtml/> e <nometa/>. Cada artigo pode conter um resumo. Tendo o resumo na base de dados quer dizer que podem ser criadas páginas web indexadas a partir dele.

O elemento <article> tem cinco atributos: o @ID requerido, o atributo xml:lang opcional que denota a língua em que o artigo original foi escrito, um atributo @type utilizado para páginas principais, os atributos são utilizados na tradução sendo tratados como artigos. Por fim, mais dois atributos opcionais, @next e @prev, que são utilizados para juntar os artigos a partir de uma série.

Um artigo está associado a uma edição e a um tema com os elementos <issueref> e <themeref>, tendo ambos um atributo @href. O valor para este atributo deve ter um único ID, o ID associado à edição ou tema.

Um exemplo:

<article id="article206" xml:lang="en">
  <title xml:lang="en">Using XML and XSLT to build
    LinuxFocus.org(/Nederlands)</title>
  <personref href="nl-ew"/>
  <issueref href="ToBeWritten"/>
  <themeref href="appl"/>
  <abstract xml:lang="en">
This article shows you how parts of the Dutch web site of LinuxFocus is
generated with XSLT tools from the XML database. It compares this with
the (very) much slower DOM tools in Perl.
  </abstract>
</article>

Um elemento <article> localizado assemelha-se:

<article id="52">
  <title xml:lang="nl">Enlightenment</title>
  <file xml:lang="nl">Nederlands/July1998/article52.html</file>
  <translation from="en" to="nl">
    <personref href="nl-tu"/>
    <reserved>2000-09-06</reserved>
    <finished>2000-10-04</finished>
    <proofread>
      <personref href="nl-fl"/>
      <reserved>2000-10-04</reserved>
      <finished>2000-10-04</finished>
    </proofread>
  </translation>
  <abstract xml:lang="nl">
Enlightenment is een Linux window-manager met
uitgebreide mogelijkheden.  Dit artikel bespreekt
ze, samen met de installatie en de instelling
van E.  Dit alles is niet voor beginners daar
E op het moment nog in beta-stadium
verkeert.
  </abstract>
</article>

Note que esta tradução é reservada para a tradução de uma dada data em que é feito, mas também torna a leitura mais evidente. De qualquer maneira a pessoa que fez o trabalho é linkada com os elementos <personref>.

Para todos os elementos, o melhor tutorial é a própria base de dados actual:

 

Gerar automaticamente as páginas web

Uma das razões para criar este novo formato foi o de criar automáticas os índices web a partir de. Agora que entendemos (?) o formato da base de dados vejamos como podemos utilizá-lo para gerar algumas páginas.

Primeiro, um pouco de história. A primeira implementação utilizou módulos Perl como interface à base de dados. Apesar da interface ser bastante limpa, a implementação era muito lenta. A informação estava contida num contentor XML chamado Document Object Model (DOM). Muitas das implementações para DOM, são, contudo, muito lentas pelo menos mais lenta que a alternativa Simple Application interface para XML (SAX).

Mas se a tarefa é só para gerar páginas web uma terceira alternativa parece ser melhor: XSLT. É uma linguagem de transformação baseada no XML. Muitos processadores XSLT existem presentemente e muitas das linguagens de programação são suportadas. Há alguns tempos atrás houve um artigo da LinuxFocus XML::XSLT, uma das implementações Perl em XSLT. Desde a publicação deste artigo, muitas implementações apareceram e há alguns que eu recomendo:

Os exemplos utilizados no resto do artigo utilizaram o Sablotron.

Um processador XSLT toma dois ficheiros para entrada. Um é a fonte XML para transformar. O outro é uma folha de estilo XSLT que define a transformação. Para gerar as páginas web as seguintes folhas de estilo XSLT estão disponíveis:

Note que estas folhas de estilo não são as últimas versões. Contactem-me ou um dos editores da equipas de tradução alemãs para obter as versões mais actualizadas.

Para gerar o mainindex.html, por exemplo, a equipa Alemã corre:

sabcmd stylesheets/mainindex.xslt db/lfdb.nl.xml > ../mainindex.html

As folhas de estilo sabem onde se encontra a raiz da base de dados Inglesa e só precisam da localização da base de dados como entrada. Algumas folhas de estilo precisam de um parâmetro adicional:

sabcmd stylesheets/theme.xslt db/lfdb.nl.xml '$theme=appl' > ../Themes/appl.html

O index.html alemão é gerado a partir da base de dados, mas utiliza uma configuração mais complexa. O index.html é feito com o lfpagecomposer do Guido Socher a partir de um determinado número de ficheiros pré-processados de entrada. E estes ficheiros pré-processados são gerados a partir de um número de ficheiros .set tais como:

<H2>Vorige nummers</H2>

<p>Dit zijn de uitgaven van LinuxFocus in het Nederlands:
<ul>
<!-- macro xslt previssues -->
</ul>
<H2>Recent vertaalde artikelen</H2>
< macro xslt recently_translated -->

Estes ficheiros são simplesmente fragmentos HTML com macros aplicadas à base de dados local. O processo é feito com um programa chamado apply_stylesheets.pl que procura por comandos <!-- macro xslt [stylesheet] --> e verifica a base de dados com este comando. Note que a extensão .xslt é omitida. O nosso Makefile contém:
%.shtml: %.pre
        @echo "Making $*..."
        @../../xml/bin/apply_stylesheets.pl $*.pre

Os ficheiros *.shtml resultantes são utilizados pela script lfpagecomposer. AS folhas de estilo que são utilizadas para gerar o index.html são: issuetoc.xslt, previssues.xslt e recently_translated.xslt.  

Localizando

Para utilizar este sistema noutras linguagens, precisa de fazer o seguinte:

  1. localizar a base de dados XML (como lfdb.nl.xml)
  2. localizar as folhas de estilo

O segundo passo é um pouco infeliz. Em princípio só o texto de saída é que precisa de ser localizado, mas as folhas de estilo ainda não têm propriedades de localização. Isto é possível, contudo, gostaria de o ver implementado.

Eu recomendo um editor XML conhecedor de DTD. No Emacs pode, por exemplo utilizar o modo psgml. Isto permite-lhe-á validar o documento (com nsgmls). Isto ajuda imenso a evitar erros. No Emacs para ainda carregar no botão direito para ver os elementos e atributos que pode inserir num determinado sítio de um ficheiro XML. (Muito Obrigado a Jaime Villate pela sua excelente palestra na conferência LSM em Bordéus este ano.)

Uma outra grande ajuda é a localização alemã da base de dados XML. Se encontrar problemas pode consultar este ficheiro. Apesar do conteúdo ser maioritariamente alemão pode ver como os elementos estão organizados. No caso de não ajudar, pode sempre enviar-me um email.

Localizar as folhas de estilo é provavelmente um pouco meticuloso. O texto está misturado com os comandos XSLT. Nos últimos não deve mexer ( a não ser que saiba o que está a fazer) para preservar a sua funcionalidade. Eu planeio no futuro, ter as folhas de estilo localizadas, o que significa que só precisa de editar um ficheiro que contem as suas traduções sem comandos XSLT, mas isto ainda não está feito.  

Planos Futuros

OK, isto deve dar-lhe uma ajuda a começar. Muitas das coisas pode copiar/colar dos ficheiros alemães. Todos os ficheiros são FDL e GPL. No próximo ano estes são os planos com este sistema:

 

Forma de respostas para este artigo

Todo artigo tem sua própria página de respostas. Nesta página você pode enviar um comentário ou ver os comentários de outros leitores:
 página de respostas 

Páginas Web mantidas pelo time de Editores LinuxFocus
© Egon Willighagen, FDL
LinuxFocus.org

Clique aqui para reportar uma falha ou para enviar um comentário para LinuxFocus
Informação sobre tradução:
en -> -- Egon Willighagen
en -> en Lorne Bailey
en -> pt Bruno Sousa

2001-10-05, generated by lfparser version 2.17