Linguagem XTemplate 3.0

Introdução

A linguagem XTemplate torna possível a especificação de componentes e relações genéricas que serão usadas em uma composição através de um template de composição. Dessa forma o usuário final precisa apenas apresentar as mídias que serão usadas na composição ficando o processador de templates responsável por criar as relações especificadas no template.

Definições

Composição

Elemento hipermídia cuja funcionalidade é conter outros elementos, podendo ser outras composições ou nós de mídia. Em NCL é representado pelo elemento context.

Template

Documento escrito com a linguagem XTemplate, versão 3.0.

NCL

Documento NCL que usa um template de composição. Este deve possuir em seu cabeçalho o elemento templateBase definido ao menos um template e pelo menos uma composição referenciando o template definido.

Processador

Software que transforma um documento ncl usando templates em um documento completo.

A Linguagem

Uma composição é aqui representada pelo nó de contexto (elemento context) da linguagem NCL (Nested Context Language). Vale lembrar que na especificação da linguagem NCL o corpo (elemento body) de um documento NCL é considerado também um nó de contexto, logo um template pode também ser utilizado pelo corpo do ncl.

Um template é definido pelo elemento xtemplate, esse elemento possui como atributos:

  1. id – define um identificador para o template;
  2. name – define um nome para o template;
  3. description – descreve o template.

Um template é definido em quatro partes, são elas, o cabeçalho (elemento head), o vocabulário (elemento vocabulary), o corpo (elemento body) e as restrições (elemento constraints).

Cabeçalho

O cabeçalho (elemento head) do template, permite especificar bases de conectores e definições de apresentação (bases de regiões, descritores e regras) que serão importadas pelo ncl. O cabeçalho permite também que um template estenda as definições especificadas em um outro template.

Importando Bases

A especificação das bases de conectores a serem importadas é feita através do elemento connectorBase, este possui como filhos elementos importBase.
<connectorBase>
<importBase alias="connBase" documentURI="connectorbase.ncl"/>
</connectorBase>

A especificação das definições de apresentação (bases de regiões, descritores e regras) a serem importadas é feita através do elemento descriptorBase, possuindo este elementos importBase como filhos.
<descriptorBase>
<importBase alias="presBase" documentURI="descriptorbase.ncl"/>
</descriptorBase>

A importação é feita desta forma pois em NCL, um documento A que importe a base de descritores de B, importa também as bases de regiões e regras de B, caso B as tenha definido. Logo a linguagem XTemplate tira proveito dessa funcionalidade de forma a definir como o ncl deverá apresentar as mídias nele contidas.

O elemento importBase define uma base que será importada pelo ncl. Este possui os seguintes atributos:

  1. alias – define um apelido pelo qual a base será referenciada;
  2. documentURI – define a localização da base.

Estendendo Templates

Um template pode estender um ou mais templates. Ao fazer isso, o template herdará todas as definições presentes nos templates estendidos, a única exceção são as constraints que poderão ser sobrescritas para evitar inconsistências. Essa extensão é feita no cabeçalho através do elemento extends.

O elemento extends possui os seguintes atributos:

  1. xtemplate – define a localização do template a ser estendido.
  2. overwriteConstraints – define se as constraints serão ou não sobrescritas

Vale lembrar que se um template A estende um template B, as restrições, de B, caso estendidas, ainda sim deverão ser satisfeitas. Logo é necessário um maior cuidado para não se definir um template que seja contrário a essas restrições.

Vocabulário

O vocabulário (elemento vocabulary) permite especificar quem estará presente na composição, além dos tipos de relações possíveis. Para isso o vocabulário define dois elementos, component e connector.

Componentes

Os componentes (elemento component) definirão quem poderá, e em que quantidade, estar presente na composição. O elemento component possui os seguintes atributos:

  1. xlabel – define um rótulo pelo qual o componente será referenciado;
  2. xtype – define o tipo do componente. Este tipo é especificado em MIME, podendo assumir também os valores context, switch caso o componente não seja um nó de mídia. Este atributo pode também assumir os tipos MIME genéricos audio, text, image, video quando uma maior especificidade não seja necessária. No caso deste atributo não estar presente, qualquer elemento definido na composição será aceito, ficando o processador livre de conferir os tipos dos elementos;
  3. descriptor – define o descritor usado pelo componente, deve ser especificada também a base sendo utilizada no formato base#descritor;
  4. minOccurs – define um número mínimo de vezes que o componente estará presente na composição. O valor padrão assumido no processamento é 0;
  5. maxOccurs – define o número máximo de vezes que o componente estará presente. Este pode ser um número ou a string unbounded caso o valor seja ilimitado. O valor padrão assumido no processamento é ilimitado.

Um componente pode ter outro componente como filho, caso esteja representando um contexto ou um switch. Um componente pode conter também  o elemento port, caso seja necessário representar âncoras ou nós de propriedade do componente.

O elemento port possui os seguintes atributos:

  1. xlabel – define um rótulo para o port;
  2. minOccurs – número mínimo de ocorrências;
  3. maxOccurs – número máximo.


<component xlabel="subtitleSWITCH" type="switch">
<component xlabel="subtitlePT" type="text/html" descriptor="presBase#d_legenda" maxOccurs="1"/>
<component xlabel="subtitleEN" type="text/html" descriptor="presBase#d_legenda" maxOccurs="1"/>
</component>

O exemplo acima mostra a especificação de um elemento switch. Vale ressaltar que só são definidor os elementos filhos do switch (legendas). As regras a serem utilizadas ficam especificadas no próprio switch em sua especificação no corpo do template como será visto posteriormente.

Conectores

Os conectores definem os tipos de relações possíveis na composição. O elemento contém os seguintes atributos:

  1. src – localização do conector dentro de uma base de conectores (base#conector);
  2. xlabel – define um rótulo para o conector;
  3. minOccurs, maxOccurs – igual aos anteriores.


<connector src="connBase#onBeginStartN" xlabel="L" maxOccurs="unbounded"/>

O exemplo acima mostra a especificação do conector onBeginStartN.

Corpo

O corpo (elemento body) é responsável por declarar pontos de interface (portas) da composição que usa o template; instâncias de componentes do vocabulário e seus pontos de interface; especificação de relacionamentos entre os componentes usando conectores e de inclusão, referenciando os tipos de componentes e conectores declarados no vocabulário ou instâncias de componentes. É possível a utilização de instruções para declaração de variáveis (elemento variable) e instruções para a realização de repetições (elemento for-each) especificadas pelo padrão XSLT na especificação de pontos de interface da composição, dos componentes, relacionamentos e elementos de controle de conteúdo (switch).

Os elementos port, media, switch, context e link apresentados abaixo, são definidos como em NCL. Aqui serão apresentados apenas os diferentes usos dos atributos existentes, além dos atributos adicionados.

Port

O elemento port é usado para a inserção de portas dentro da composição. Em sua definição, podem ser usadas duas abordagens.

Na identificação do nó relacionado à porta, poderá ser usado o atributo component juntamente com o atributo interface, porém estes não conterão os identificadores do nó relacionado, e sim os rótulos dos mesmos. Alternativamente, pode-se usar o atributo select para se identificar o nó relacionado através de uma expressão XPath.

Caso seja necessário (uso da porta em uma relação criada por outro template, ou restrições) uma porta poderá definir um rótulo através do atributo xlabel.

RESUMINDO: atributos adicionados ao elemento port: xlabel e select.

Media

O elemento media define uma instância do vocabulário, permitindo que o template insira uma mídia na composição. Em sua definição é usado o atributo xlabel, de forma a identificar a que componente este elemento está relacionado. Os elementos filhos de media, area e property podem também conter o atributo xlabel.

O elemento property contém um atributo adicional chamado select, este contém uma expressão XPath que será avaliada durante o processamento e seu valor colocado em value.
RESUMINDO: atributo adicionado ao elemento media: xlabel.

Switch

O elemento switch define uma instância do vocabulário, permitindo que o template insira um switch na composição. Em sua definição foi adicionado o atributo xlabel de forma a identificar a que componente do vocabulário o switch está relacionado.

O switch define de forma direta, as regras que serão usadas através do elemento bindRule. Sá poderão ser definidos um número de bindRule igual ao número de filhos (do elemento component) definido no vocabulário. O exemplo abaixo demonstra a utilização do switch.
<switch id="subtitle" xlabel="subtitleSWITCH">
<bindRule rule="presBase#rPT" constituent="subtitlePT" select="child::media[@xlabel='subtitlePT'][position() = 1]"/>
<bindRule rule="presBase#rEN" constituent="subtitleEN" select="child::media[@xlabel='subtitleEN'][position() = 1]"/>
</switch>

Pode-se notar que o elemento bindRule define o componente ao qual se relaciona pelo atributo constituent, referenciando o rótulo apropriado. O switch pode então definir dentro dele os elementos que este usará (estes contendo o rótulo apropriado) ou especificar uma expressão XPath através de seu atributo select.

RESUMINDO: o switch referencia um componente do vocabulário pelo atributo xlabel, enquanto seus filhos bindRule referenciam o filho relacionado à regra pelo atributo constituent. O switch pode definir os elementos filhos diretamente ou uma expressão XPath que os localiza dentro da composição.

Context

O elemento context define uma instância do vocabulário, permitindo que o template insira um contexto na composição. O contexto deve definir todos os elementos filhos que este possuirá (portas, mídias e etc.) identificando-se com um rótulo já especificado no vocabulário através do seu atributo xlabel. Caso necessário seus elementos filhos podem também especificar um rótulo.

RESUMINDO: o contexto deverá ser definido como será inserido. Este deve se identificar usando um rótulo e caso necessário identificar seus elementos filhos.

Obs.: o contexto não poderá identificar um template, pois este não será processado.

Link

O elemento link define um relação a ser usada na composição. Este deve identificar o conector a ser usado através do seu atributo xtype e o rótulo do conector. O atributo xconnector fica então inutilizado.

Os binds do link identificarão os papéis (assim como em NCL) e o(s) elemento(s) relacionados ao bind. A identificação do(s) elemento(s) é feita através do uso de uma expressão XPath no atributo select.

O exemplo abaixo demonstra a utilização do link.
<link xtype="L">
<bind role="onBegin" select="child::media[@xlabel='audio']"/>
<bind role="start" select="child::media[@xlabel='logo']"/>
</link>

Os elementos linkParam e bindParam possuem um atributo adicional chamado select, este contém uma expressão XPath que será avaliada durante o processamento e seu valor colocado em value.

RESUMINDO: o link identificará o conector pelo atributo xtype. Seus filhos (bind) identificam os elementos participantes pelo atributo select.

variable e for-each

Os elementos variable e for-each são usados de forma conjunta para ajudar na especificação de múltiplas instancias do vocabulário. O elemento variable contém somente dois atributos, name e select. Este elemento é usado para declara uma variável, o atributo select identificando então o valor inicial da variável. Quando dentro do for-each o elemento variable define em seu atributo select o passo da variável. O conteúdo da variável pode ser acessado usando $nomedavariável.

O elemento for-each é utilizado para a criação de iterações. O número total de iterações é dado pelo número de elementos “encontrados” pela expressão XPath contida em seu atributo select. Estes elementos podem ser referenciados em uma expressão usando-se o valor current(). Dentro do for-each podem ser definidos os elementos port, link, area, property e switch. Os elementos port, link e switch definem instâncias do vocabulário utilizando ou não os elementos “encontrados” pelo for-each. Já area e property são inseridos nos elementos “encontrados”.

RESUMINDO: o elemento variable cria e identifica o passo de uma variável. O elemento for-each cria iterações no template permitindo a inserção de múltiplos componentes na composição.

Restrições

As restrições (elemento constraints), são responsáveis pela definição de restrições adicionais a serem aplicadas sobre os elementos do vocabulário. As restrições são definidas separadamente (elemento constraint) contendo uma expressão na linguagem XPath retornando um valor boleano (atributo select) e uma definição (atributo description) que pode ser utilizada como mensagem de erro caso a restrição não seja satisfeita pela composição.