O MobileTogether utiliza XPath como a sua linguagem de fórmulas e expressões.
Se souber escrever fórmulas numa folha de cálculo do Excel, poderá aprender facilmente a escrever fórmulas ou expressões XPath no MobileTogether. Basta compreender alguns conceitos básicos. O construtor de XPath no MobileTogether facilita a criação de expressões XPath, tal como o construtor de fórmulas no Excel o ajuda a escrever fórmulas nas suas folhas de cálculo.
A letra "X" em XPath provém das suas origens no XML, a linguagem de marcação extensível, e a palavra "Path" (caminho) vem do facto de que se utiliza um formato semelhante a um caminho para identificar os diferentes elementos dos seus dados. Qualquer fonte de dados que aceda no MobileTogether é representada como uma pequena estrutura de árvore no lado direito da janela do seu MobileTogether Designer, sob a secção "Fontes de Página". Cada estrutura de árvore começa com uma raiz que tem um nome, como $XML1 ou $DB1, e, em seguida, existem elementos de dados individuais – chamados elementos – que se encontram abaixo dessa raiz. Estes elementos estão organizados de forma lógica, pelo que são melhor representados como árvores, nas quais pode recolher e expandir cada elemento para ver o que está por baixo. E o melhor do MobileTogether é: não importa se os dados subjacentes provêm de uma base de dados, de um documento XML, de um serviço web ou de qualquer outra fonte de dados – todos são apresentados da mesma forma e podem ser acedidos da mesma forma.
O que o XPath permite é navegar por estas estruturas de árvore para associar os seus elementos de dados com os objetos da interface do utilizador nos ecrãs dos seus dispositivos móveis. É muito semelhante à forma como navegaria por uma estrutura de diretórios no sistema de ficheiros do disco rígido de um computador. Independentemente de estar habituado ao Windows, Linux ou MacOS, os ficheiros no seu disco rígido podem sempre ser acedidos através de um caminho, como por exemplo:
C:\Users\Spock\Documents\ScienceRecords (Windows)
/Users/Kirk/Documents/BeautifulAlienWomen (Linux/Mac)
Então, vamos analisar um exemplo de expressão XPath por comparação:
$DB1/salesdata/region/month/gadgetsComo podem ver, a ideia é exatamente a mesma. Utilizam-se expressões XPath para navegar pelas estruturas de dados de forma semelhante a como se utilizam expressões de caminho para navegar pelo sistema de ficheiros de um computador. O XPath utiliza o carácter "/" (barra) para separar os elementos individuais no caminho, tal como o Linux e o MacOS utilizam esse mesmo carácter para separar os diretórios.
Curiosamente, esta analogia com os caminhos de diretórios também se aplica a duas abreviações muito comuns em XPath: tal como um único ponto (.) refere-se ao diretório atual num sistema de ficheiros, o ponto (.) em XPath refere-se ao elemento atual, e, de forma semelhante, o duplo ponto (..) que se refere a um diretório pai num sistema de ficheiros, também se refere ao elemento pai em XPath.
Se a sua fonte de dados for um documento XML, ou dados XML que estão a ser devolvidos por um serviço web, os dados contidos nessa estrutura em árvore apresentam-se de duas formas: elementos e atributos. Os elementos são os itens de dados principais em XML e podem estar aninhados, o que significa que um elemento pode ter elementos filhos na estrutura em árvore. Os atributos, por outro lado, são valores de dados simples que estão associados aos elementos. Nas árvores apresentadas em "Fontes da Página", verá que os atributos são mostrados com um sinal "=" (sinal de igual) antes do seu nome. Isso acontece porque, num documento XML, os atributos são escritos da seguinte forma, por exemplo: color="green".
Quando pretende referir-se a atributos numa expressão XPath, é necessário escrever um símbolo "@" (arroba) antes do nome do atributo:
$XML1/salesdata/region/@nameCaso contrário, pode fazer o mesmo com elementos e atributos, ou seja, pode usar ambos em cálculos ou representar os seus valores num gráfico, e pode atribuir ambos a objetos da interface de utilizador num design MobileTogether.
Por vezes, não basta simplesmente especificar o caminho para um elemento nos seus dados. O que realmente se pretende é selecionar uma parte dos dados que corresponda a determinados critérios, para, por exemplo, apresentá-la num gráfico ou mostrá-la ao utilizador numa tabela.
Se já trabalhou com bases de dados relacionais, isto seria equivalente à cláusula WHERE típica numa instrução SQL. Permite selecionar os dados da sua base de dados que correspondem a determinados critérios
O conceito equivalente em XPath chama-se "predicados". Um predicado XPath permite especificar critérios de seleção que irão selecionar apenas determinados elementos que correspondam aos critérios especificados. Os predicados são introduzidos como um teste lógico, delimitado por [ ] (colchetes), por exemplo:
$XML1/salesdata/region[@name=”East”]/MonthA forma de interpretar esta afirmação é a seguinte: na fonte de dados XML1, aceda ao elemento "salesdata", depois aceda ao seu elemento filho "region" e selecione apenas aquelas regiões cujo atributo "name" seja equivalente a "East". Em seguida, selecione o respetivo elemento filho "Month" para cada uma dessas regiões.
No início, já dissemos que o XPath é uma linguagem de expressões completa. Isso significa que ele não só permite selecionar determinados elementos de dados, mas também permite realizar todas as operações matemáticas típicas com esses dados para calcular novos valores. Tal como as fórmulas no Excel permitem calcular novos valores a partir dos seus dados existentes, pode fazer exatamente a mesma coisa com as expressões XPath no MobileTogether.
Suponha que queira criar uma solução de faturação móvel e queira exibir o valor total de um item numa fatura no seu formulário móvel:
$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price
Assumindo que a sua estrutura de dados possui elementos separados para a quantidade e o preço (que podem ser editáveis pelo utilizador), pode então calcular simplesmente o valor total para cada linha, utilizando a multiplicação com o símbolo * (asterisco), como indicado acima.
Uma das funcionalidades realmente interessantes do XPath é que pode poupar muito tempo de digitação, realizando a multiplicação diretamente dentro da expressão XPath, utilizando parênteses no ponto correto do caminho. Assim, esta versão mais curta é equivalente à expressão anterior:
$DB1/sales/invoice/item/(quantity * price)Da mesma forma, pode usar os símbolos "+" (mais) e "-" (menos) como operadores matemáticos. No entanto, tem de usar um símbolo diferente para a divisão. Como já estamos a usar o símbolo "/" (barra) para separar os elementos individuais num caminho, não podemos usar o mesmo símbolo para a divisão. Portanto, o operador para a divisão em XPath é a palavra "div" para uma divisão de números reais e "idiv" para uma divisão de números inteiros (ou seja, se pretende que o resultado seja um número inteiro em vez de um número real).
Além disso, é uma boa prática – e, por vezes, essencial – colocar espaços em torno dos seus operadores para garantir que não sejam confundidos com parte do nome de um elemento ou atributo. Isto é especialmente importante para o operador "-".
Uma diferença importante entre os caminhos XPath e os caminhos de diretórios é que, enquanto uma expressão de caminho de diretório geralmente identifica apenas um ficheiro ou diretório específico, uma expressão XPath pode, na verdade, referenciar mais de um nó de dados (ou seja, um elemento ou um atributo). Na verdade, cada expressão XPath retorna sempre uma sequência de nós como resultado.
Isto torna-se mais fácil de entender se considerarmos que a maioria das bases de dados contém linhas de dados que têm uma estrutura semelhante, tal como a maioria dos documentos XML, no seu núcleo, contêm uma série de elementos que têm o mesmo nome e partilham uma estrutura semelhante. O XPath foi criado para permitir que um programador trabalhe facilmente com estes conjuntos de dados. Assim, a capacidade de aceder a um conjunto inteiro de nós de uma só vez tem enormes vantagens, como veremos nos próximos capítulos.
Ao mesmo tempo, por vezes pode ser necessário definir explicitamente sequências numa expressão XPath, e isso faz-se enumerando os valores da seguinte forma:
(1, 2, 3, 4, 5)
As sequências são ordenadas, pelo que a sequência acima é distinta da sequência (3, 5, 2, 4, 1). As sequências podem conter nós dos seus dados, bem como valores numéricos constantes ou valores de texto constantes.
Por exemplo, uma possível sequência de caracteres poderia ser a seguinte:
("a", "b", "c", "d", "e")Por último, mas não menos importante, pode especificar sequências ordenadas de valores numéricos utilizando o operador de intervalo para:
(1 to 5)
Isto é equivalente à sequência (1, 2, 3, 4, 5) – como podem ver, este operador de intervalo pode ser usado para criar rapidamente sequências de valores numéricos que seriam demasiado complexas para enumerar manualmente à medida que os números se tornam maiores.
Se já trabalhou com alguma outra linguagem de programação, reconhecerá o ciclo "for" como uma ferramenta comum que existe na maioria das linguagens modernas, sob alguma forma, e também é uma parte integrante da linguagem de expressões XPath.
Na sua forma mais simples, uma expressão "for" em XPath permite iterar sobre uma sequência de valores ou nós, utilizando uma variável de loop temporária que é definida diretamente na expressão "for". Por exemplo, a expressão..
for $i in (1 to 10) return 2 * $i
irá gerar a sequência numérica (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) percorrendo a sequência original (de 1 a 10) utilizando a variável $i, e, em seguida, calculando 2 * $i para cada elemento da sequência.
Agora que sabemos que qualquer expressão XPath pode retornar uma sequência de nós, também podemos utilizar a expressão "for" para iterar sobre esses nós e realizar alguma operação matemática. Por exemplo, para iterar sobre todos os itens de uma fatura e calcular o valor correspondente a cada item, poderíamos usar a seguinte expressão:
for $x in $DB1/sales/invoice/item return $x/price * $x/quantity
Neste caso, a variável `$x` será a nossa variável de iteração, que percorrerá cada elemento do item, e esta expressão irá retornar uma sequência que contém os valores para cada linha da nossa fatura. Vamos supor que temos os seguintes dois elementos de item nos dados da nossa fatura:
<item><quantity>5</quantity>
<price>12.50</price>
</item><item><quantity>3</quantity>
<price>27.85</price>
</item>Em seguida, a expressão XPath anterior irá retornar a sequência (62,5 83,55), que correspondem aos valores respetivos para cada item na fatura.
As funções em XPath funcionam exatamente como as funções numa fórmula do Excel ou na maioria das outras linguagens de programação: chama-se uma função usando o seu nome e passando um conjunto de parâmetros da função entre parênteses (). Por exemplo, para somar a sequência (3, 9, 14), escreveria:
sum( (3, 9, 14) )Isto dar-nos-ia o resultado de 26. Note que, neste caso, os parênteses exteriores fazem parte da chamada da função `sum()`, enquanto que os parênteses interiores fazem parte da sequência que estamos a passar à função como um único parâmetro.
Da mesma forma, podemos agora calcular o valor total da fatura, a partir do exemplo anterior, somando todos os itens individuais:
sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )
Isto pode ser muito útil, por exemplo, para criar formulários interativos dentro de uma solução móvel, onde é possível exibir valores de dados para totais que se atualizam dinamicamente à medida que o utilizador introduz dados no formulário.
O XPath contém um grande número de funções integradas para valores numéricos (por exemplo, round, abs, floor, etc.), manipulação de strings (por exemplo, concat, lower-case, contains, replace), durações, datas e horas, bem como operações de agregação em sequências (por exemplo, count, sum, avg, min, max). O construtor XPath no MobileTogether facilita a escrita de expressões XPath utilizando estas funções, pois inclui um diretório conveniente de todas as funções disponíveis, com uma breve descrição e informações sobre os parâmetros necessários. As funções são apresentadas em grupos lógicos, o que facilita a localização da função necessária para o seu caso de utilização específico.
Em muitas linguagens de programação, bem como em linguagens de expressão, é frequentemente necessário determinar uma forma diferente de calcular um determinado resultado, dependendo se um critério específico é cumprido ou não. É neste contexto que a instrução "if" (se) se torna útil, permitindo definir resultados alternativos com base num critério de teste que é especificado.
Em XPath, a instrução "if" assume a seguinte forma:
if ( test-expression ) then expression else expression
onde "test-expression" é uma expressão XPath lógica que retorna verdadeiro ou falso.
Por exemplo, podemos usar uma expressão como esta no MobileTogether para definir a cor do texto de um rótulo ou campo de edição com base no valor numérico contido nos dados. Suponha que temos um elemento da nossa fonte de dados associado a um campo de edição. Podemos selecionar esse campo de edição e ir para a aba de propriedades, onde podemos selecionar a propriedade "Cor do Texto". Em vez de definir a cor usando o seletor de cores, podemos clicar no ícone XPath na barra de ferramentas e optar por definir a cor do texto desse campo de entrada através de uma expressão XPath:
if ( $MT_ControlValue >= 0 ) then "green" else "red"
Neste caso, estamos a utilizar uma das variáveis predefinidas do MobileTogether para referir-nos ao controlo atual e estamos a verificar se o valor é maior ou igual a zero.
Dependendo do resultado desse teste, o resultado será "verde" ou "vermelho", e a cor do nosso texto irá mudar dinamicamente com base na informação fornecida pelo utilizador.
Da mesma forma, existem muitas outras variáveis internas que começam todas com $MT_ e que permitem tomar decisões com base no tamanho do ecrã do dispositivo, no sistema operativo, no idioma e em muitos outros fatores. Todas estas variáveis globais internas podem ser visualizadas na caixa de diálogo "Variáveis Globais" no menu "Projeto" no MobileTogether Designer.
Até este ponto, temos falado principalmente sobre XPath por razões históricas, já que é a linguagem de expressões baseada em XML mais conhecida e já existe há 15 anos. No entanto, além do XPath, o MobileTogether também suporta a linguagem XQuery, que é mais poderosa. O XQuery é um verdadeiro conjunto ampliado do XPath, o que significa que qualquer expressão XPath válida também é uma expressão XQuery válida. No entanto, o XQuery adiciona algumas funcionalidades adicionais e poderosas que permitem fazer muito mais e que permitem manipular ou construir documentos XML inteiros em tempo real.
A expressão XQuery mais importante é a chamada expressão FLWOR. FLWOR é um acrónimo que significa "For-Let-Where-Order-Return" e é geralmente pronunciado "flower". Funcionalmente, é equivalente à instrução SELECT em SQL, que possui cláusulas semelhantes, como FROM, WHERE, ORDER BY, etc. A expressão FLWOR permite-nos consultar dados XML e de bases de dados de forma muito mais eficiente e poderosa do que com as simples expressões XPath, e constitui a base fundamental do XQuery.
Já encontramos a parte "for" da expressão na nossa discussão anterior sobre XPath, pelo que essa parte da expressão FLWOR será um ponto de partida familiar. Da mesma forma, já vimos a cláusula "return" na mesma expressão "for" anteriormente. No entanto, o XQuery expande significativamente a flexibilidade da cláusula "return" ao permitir que você crie árvores XML inteiras do zero, utilizando construtores. Essencialmente, como antes, a cláusula "return" é avaliada para cada elemento no ciclo "for", mas, em vez de apenas produzir um valor numa sequência, agora é possível construir uma árvore XML completa, como veremos em alguns dos exemplos abaixo.
O propósito da cláusula `let` numa expressão FLWOR é definir variáveis adicionais que podemos usar posteriormente para construir o resultado. Estas variáveis podem vir da mesma fonte de dados ou até de uma fonte de dados diferente, mas, por exemplo, podemos usar a variável do loop para selecionar determinados elementos da outra fonte.
Por exemplo, supondo que uma fonte de dados contenha informações sobre os departamentos de uma organização, e outra fonte de dados contenha informações sobre os funcionários, esta poderá ser o início de uma expressão FLWOR que seleciona os funcionários de um conjunto específico de departamentos:
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
…
A cláusula "where" permite-nos filtrar os dados com base em determinados critérios, de forma semelhante a como utilizamos predicados em expressões XPath puras. Por exemplo, podemos usar essa cláusula para filtrar departamentos com base no número de funcionários que têm:
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
…
Finalmente, a cláusula "order by" permite-nos ordenar o resultado de acordo com qualquer critério desejado, o que é especialmente útil quando se criam novos documentos XML a partir dos resultados.
Agora, vamos combinar toda a expressão FLWOR, utilizando as duas fontes de dados mencionadas anteriormente, que contêm informações sobre departamentos e funcionários. Por exemplo, poderíamos gerar uma nova tabela de dados para exibir numa aplicação móvel, que forneceria informações agregadas sobre o número total de funcionários e o salário médio dos departamentos que têm mais de 10 funcionários:
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
order by avg($e/salary) descending
return<big-dept> { $d,<headcount>{count($e)}</headcount>,
<avgsal>{avg($e/salary)}</avgsal>
}
</big-dept>Num outro exemplo, utilizando os nossos dados anteriores sobre faturas de telemóvel com detalhes, podemos agora expandir esta funcionalidade e percorrer várias faturas a partir de uma determinada data, para calcular os seus totais e, em seguida, criar uma tabela com os resultados ordenados, que podemos apresentar com o valor total da fatura mais elevado no topo e o valor mais baixo no final:
for $inv in $DB1/sales/invoice
let $total := sum (for $x in item return $x/price * $x/quantity)
where $inv/date >= "2014-01-01"
order by $total descending
return <invtotal>{ $total }</invtotal>
Como podem ver, a flexibilidade e o poder destas expressões XQuery são muito maiores do que aquilo que podíamos alcançar anteriormente apenas com XPath. No entanto, com maior poder também vem maior complexidade, pelo que pode demorar algum tempo até dominarem completamente o XQuery.
Ao mesmo tempo, o construtor e o avaliador XPath e XQuery integrados no MobileTogether podem ajudá-lo significativamente na criação de expressões corretas e no seu teste com os seus dados. Combinado com o poderoso simulador que permite executar as suas aplicações móveis diretamente no MobileTogether Designer, pode testar e depurar a seleção de dados através de XPath e XQuery de forma fácil e criar aplicações móveis poderosas muito mais rapidamente do que com qualquer outra abordagem.
Neste documento, apresentamos uma introdução simplificada aos conceitos mais importantes do XPath e do XQuery, para o ajudar a começar a trabalhar com dados no MobileTogether. Abordámos os conceitos básicos das expressões XPath e algumas das funcionalidades mais avançadas do XQuery, o que deverá permitir-lhe criar seleções de dados poderosas no seu fluxo de trabalho móvel, gerar gráficos precisos dos seus dados e personalizar a interface do utilizador da sua solução móvel em resposta a elementos de dados específicos, conforme necessário.
No entanto, este documento é apenas um ponto de partida e não pretende ser um tutorial completo nem explicar todos os aspetos destas linguagens. Pode aprender mais no nosso curso online abrangente e gratuito de formação em XPath, que é adequado tanto para iniciantes como para utilizadores avançados.
O MobileTogether suporta as linguagens XPath 3.0 e XQuery 3.0 na sua totalidade. A vantagem de utilizar um padrão internacional, como XPath e XQuery, é que muitos programadores já terão aprendido XPath no passado, quando trabalharam com XML, XSLT ou XML Schema. Portanto, a possibilidade de reutilizar esse conhecimento no MobileTogether é uma grande vantagem para eles. E a atualização do seu conhecimento de XPath 1.0 ou 2.0 para a versão 3.0 é um processo simples.
Além disso, XPath e XQuery são padrões desenvolvidos pelo W3C, e não linguagens proprietárias criadas por uma única empresa. Portanto, aprender estes padrões será útil em outros contextos também.
Para a especificação completa do XPath 3.0 e do XQuery 3.0, consulte os seguintes documentos técnicos:
Por último, mas não menos importante, o uso de XPath e XQuery no MobileTogether permite que utilize facilmente o XMLSpy para criar protótipos, desenvolver e depurar expressões XPath e XQuery mais complexas, caso necessite de ir além. O XMLSpy oferece um avaliador XPath completo e um depurador XQuery, incluindo um perfilador para otimização de desempenho.
Para obter mais informações sobre o XPath 3.0 e o XQuery 3.0, consulte: A formação online da Altova e páginas de documentação. Também disponibilizamos uma referência XPath que explica tudo Operadores e funções XPath e fornece exemplos de como implementá-los. Finalmente, não hesite em colocar questões relacionadas com XPath e XQuery no fórum de suporte do MobileTogether, em: https://support.mobiletogether.com/