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

ArticleCategory: [Artikel Kategorie]

Applications

AuthorImage:[Bild des Autors]

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in en Egon Willighagen

en to en Lorne Bailey

en to pt Bruno Sousa

AboutTheAuthor:[Über den 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.

Abstract:[Zusammenfassung]

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).

ArticleIllustration:[Titelbild des Artikels]

[Illustration]

ArticleBody:[Der eigentliche Artikel]

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: