O MobileTogether utiliza XPath como sua linguagem de fórmulas e expressões.
Se você sabe como escrever fórmulas em uma planilha do Excel, pode aprender facilmente como escrever fórmulas ou expressões XPath no MobileTogether. Você só precisa entender alguns conceitos básicos. O construtor de XPath no MobileTogether facilita a criação de expressões XPath, assim como o construtor de fórmulas no Excel ajuda você a escrever fórmulas em suas planilhas.
A letra "X" em XPath deriva de suas origens no XML, a linguagem de marcação extensível, e "Path" (caminho) vem do fato de que você utiliza um formato semelhante a um caminho para identificar partes individuais dos seus dados. Qualquer fonte de dados que você acessa no MobileTogether é representada como uma pequena estrutura de árvore no lado direito da janela do seu MobileTogether Designer, sob a seção "Fontes de Página". Cada estrutura de árvore começa com uma raiz que tem um nome, como $XML1 ou $DB1, e, abaixo dessa raiz, existem as partes individuais de dados – chamadas elementos. Esses elementos estão organizados de forma lógica, sendo, portanto, melhor representados como árvores, nas quais você pode expandir e recolher cada elemento para ver o que está abaixo. E o melhor do MobileTogether é: não importa se os dados subjacentes vêm de um banco de dados, um documento XML, um serviço web ou qualquer outra fonte de dados – eles são todos apresentados da mesma forma e podem ser acessados da mesma maneira.
O que o XPath permite é navegar por essas estruturas de árvore para associar seus elementos de dados com os objetos da interface do usuário nas telas dos seus dispositivos móveis. É muito semelhante a como você navegaria por uma estrutura de diretórios no sistema de arquivos de um computador. Independentemente de você estar acostumado com Windows, Linux ou MacOS, os arquivos no seu disco rígido sempre podem ser acessados através de um caminho, como:
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. Vocês usam XPath para navegar por estruturas de dados em árvore, da mesma forma que usam expressões de caminho para navegar pelo sistema de arquivos de um computador. O XPath utiliza o caractere "/" (barra) para separar os elementos individuais no caminho, assim como o Linux e o MacOS usam esse caractere para separar os diretórios.
Curiosamente, essa analogia com os caminhos de diretórios também se aplica a duas abreviações muito comuns em XPath: assim como um único ponto (.) se refere ao diretório atual em um sistema de arquivos, o ponto (.) em XPath se refere ao elemento atual, e da mesma forma, o ponto duplo (..) que se refere a um diretório pai em um sistema de arquivos, 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 sendo retornados por um serviço web, os dados contidos nessa estrutura em árvore se apresentam de duas formas: elementos e atributos. Os elementos são os itens de dados principais em XML e podem ser aninhados, ou seja, um elemento pode ter elementos filhos na estrutura da árvore. Os atributos, por outro lado, são valores de dados simples que estão associados aos elementos. Nas árvores exibidas em "Fontes da Página", você verá que os atributos são mostrados com um sinal de igual (=) antes de seus nomes. Isso ocorre porque, em um documento XML, os atributos são escritos da seguinte forma, por exemplo: color="green".
Quando você precisa referenciar atributos em uma expressão XPath, é necessário escrever um "@" (símbolo "arroba") antes do nome do atributo:
$XML1/salesdata/region/@nameCaso contrário, você pode fazer o mesmo com elementos e atributos, ou seja, pode usar ambos em cálculos ou representar seus valores em um gráfico, e pode atribuí-los a objetos da interface do usuário em um projeto MobileTogether.
Às vezes, não é suficiente simplesmente especificar o caminho para um elemento nos seus dados. O que você realmente quer fazer é selecionar parte dos dados que corresponda a determinados critérios, a fim de, por exemplo, exibi-los em um gráfico ou apresentá-los ao usuário em uma tabela.
Se você já trabalhou com bancos de dados relacionais, isso seria equivalente à cláusula WHERE típica em uma instrução SQL. Permite que você selecione os dados do seu banco de dados que correspondem a determinados critérios
O conceito equivalente em XPath é chamado de "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 inseridos como um teste lógico, delimitado por colchetes ([]), por exemplo:
$XML1/salesdata/region[@name=”East”]/MonthA forma de interpretar essa instrução é a seguinte: na fonte de dados XML1, acesse o elemento "salesdata", em seguida, acesse o elemento filho "region" e selecione apenas as regiões onde o atributo "name" seja equivalente a "East". Depois, selecione o elemento filho correspondente "Month" para cada uma dessas regiões.
No início, já dissemos que XPath é uma linguagem de expressões completa. Isso significa que ela não apenas permite selecionar determinados dados, mas também permite realizar todas as operações matemáticas típicas com esses dados para calcular novos valores. Assim como as fórmulas no Excel permitem calcular novos valores a partir dos seus dados existentes, você pode fazer exatamente a mesma coisa com as expressões XPath no MobileTogether.
Suponha que você queira criar uma solução de emissão de faturas para dispositivos móveis e queira exibir o valor total de um item específico 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 quantidade e preço (que podem ser editáveis pelo usuário), você pode simplesmente calcular o valor total para cada item multiplicando a quantidade pelo preço, utilizando o símbolo * (asterisco).
Uma das funcionalidades realmente interessantes do XPath é que você pode economizar muito tempo de digitação, realizando a multiplicação diretamente dentro da expressão XPath, utilizando parênteses no ponto correto do caminho. Assim, essa versão mais curta é equivalente à expressão anterior:
$DB1/sales/invoice/item/(quantity * price)Da mesma forma, você pode usar "+" (mais) e "-" (menos) como operadores matemáticos. No entanto, você precisa usar um símbolo diferente para a divisão. Como já estamos usando o "/" (barra) para separar os elementos individuais em um caminho, não podemos usar o mesmo caractere 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 você deseja que o resultado seja um número inteiro, e não 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 eles não sejam confundidos com parte do nome de um elemento ou atributo. Isso é 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 arquivo 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, toda expressão XPath sempre retorna uma sequência de nós como resultado.
Isso é mais fácil de entender se considerarmos que a maioria dos bancos de dados contém linhas de dados que possuem uma estrutura semelhante, assim como a maioria dos documentos XML, em sua essência, contém uma série de elementos que têm o mesmo nome e compartilham uma estrutura similar. O XPath foi criado para permitir que um desenvolvedor trabalhe facilmente com esses conjuntos de dados. Portanto, a capacidade de acessar um conjunto inteiro de nós de uma só vez oferece grandes vantagens, como veremos nos próximos capítulos.
Ao mesmo tempo, em algumas situações, pode ser necessário definir explicitamente sequências em uma expressão XPath, e isso pode ser feito enumerando os valores da seguinte forma:
(1, 2, 3, 4, 5)
As sequências são ordenadas, portanto, a sequência acima é claramente diferente da sequência (3, 5, 2, 4, 1). As sequências podem conter elementos 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, você pode especificar sequências ordenadas de valores numéricos usando o operador de intervalo para:
(1 to 5)
Isso é 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 muito trabalhosas de enumerar manualmente, especialmente à medida que os números se tornam maiores.
Se você já trabalhou com alguma outra linguagem de programação, reconhecerá o loop "for" como uma ferramenta comum que existe na maioria das linguagens modernas, em alguma forma, e ele também é uma parte fundamental 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) usando a variável $i, e então 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 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 de origem 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 retornará a sequência (62,5 83,55), que correspondem aos valores respectivos para cada item na fatura.
As funções em XPath funcionam exatamente como as funções em uma fórmula do Excel ou na maioria das outras linguagens de programação: você chama 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), você escreveria:
sum( (3, 9, 14) )Isso nos daria o resultado de 26. Observe que, neste caso, os parênteses externos fazem parte da chamada da função `sum()`, enquanto os parênteses internos fazem parte da sequência que estamos passando para a função como um único parâmetro.
Da mesma forma, podemos agora calcular o valor total da fatura do exemplo anterior, somando todos os itens listados:
sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )
Isso pode ser muito útil, por exemplo, para criar formulários interativos dentro de uma solução móvel, onde é possível exibir o valor dos dados para totais que se atualizarão dinamicamente à medida que o usuário insere dados no formulário.
O XPath contém um grande número de funções internas 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 agregadas em sequências (por exemplo, count, sum, avg, min, max). O construtor XPath no MobileTogether facilita a escrita de expressões XPath usando essas 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 uso específico.
Em muitas linguagens de programação, assim 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 é atendido ou não. É nesse ponto que a instrução "if" (se) se torna útil, pois permite definir resultados alternativos com base em um critério de teste que você especifica.
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 essa funcionalidade 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 tenhamos 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 por meio de uma expressão XPath:
if ( $MT_ControlValue >= 0 ) then "green" else "red"
Aqui, estamos utilizando uma das variáveis internas do MobileTogether para nos referir ao controle atual e estamos verificando 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 mudará dinamicamente com base na entrada do usuário.
Da mesma forma, existem muitas outras variáveis internas que começam com $MT_ e que permitem tomar decisões com base no tamanho da tela do dispositivo, no sistema operacional, no idioma e em muitos outros fatores. Todas essas variáveis globais internas podem ser visualizadas na janela "Variáveis Globais" no menu "Projeto" do MobileTogether Designer.
Até este ponto, falamos principalmente sobre XPath por razões históricas, já que é a linguagem de expressões baseada em XML mais conhecida e está presente 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 realizar muito mais e 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 é comumente 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 que consultemos dados XML e de bancos de dados de forma muito mais eficiente e poderosa do que com as simples expressões XPath, e constitui a base do XQuery.
Já encontramos a parte "for" da expressão em nossa discussão anterior sobre XPath, então 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 item no loop "for", mas, em vez de simplesmente produzir um único valor em uma sequência, agora você pode construir uma árvore XML inteira, como veremos em alguns dos exemplos abaixo.
O propósito da cláusula "let" em uma expressão FLWOR é definir variáveis adicionais que podemos usar posteriormente para construir o resultado. Essas variáveis podem vir da mesma fonte de dados ou até mesmo 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 poderia 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 que filtremos os dados com base em determinados critérios, de forma semelhante a como usamos 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 eles 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 que ordenemos o resultado de acordo com qualquer critério desejado, o que é especialmente útil ao criar novos documentos XML.
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, podemos gerar uma nova tabela de dados para exibir em uma solução móvel, que forneceria informações agregadas sobre o número total de funcionários e o salário médio para aqueles 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>Em outro exemplo, utilizando nossos dados anteriores sobre faturas de telefonia celular com detalhes de cada item, podemos agora expandir essa funcionalidade e percorrer várias faturas a partir de uma determinada data para calcular seus totais e, em seguida, criar uma tabela com os resultados ordenados, exibindo primeiro a fatura com o maior total e, por último, a fatura com o menor total
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 dessas expressões XQuery são muito maiores do que o que podíamos alcançar anteriormente apenas com XPath. No entanto, com maior poder também vem maior complexidade, então pode levar algum tempo até que você domine completamente o XQuery.
Ao mesmo tempo, o construtor e o avaliador integrados de XPath e XQuery no MobileTogether podem ajudá-lo significativamente na criação de expressões corretas e no teste dessas expressões com seus dados. Combinado com o poderoso simulador que permite executar seus aplicativos móveis diretamente no MobileTogether Designer, você pode testar e depurar a seleção de dados por meio de XPath e XQuery de forma fácil e criar aplicativos móveis poderosos muito mais rapidamente do que com qualquer outra abordagem.
Neste documento, apresentamos uma introdução aos conceitos mais importantes do XPath e do XQuery, para ajudá-lo a começar a trabalhar com dados no MobileTogether. Abordamos os conceitos básicos das expressões XPath e algumas das funcionalidades mais avançadas do XQuery, o que deve permitir que você crie seleções de dados poderosas em seus fluxos de trabalho móveis, gere gráficos precisos dos seus dados e personalize a interface do usuário da sua solução móvel em resposta a itens 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 aspectos dessas linguagens. Você pode aprender mais em nosso curso online abrangente e gratuito sobre XPath, que é adequado tanto para iniciantes quanto para usuários avançados.
O MobileTogether oferece suporte completo às linguagens XPath 3.0 e XQuery 3.0. A vantagem de utilizar um padrão internacional, como XPath e XQuery, é que muitos desenvolvedores já podem ter aprendido XPath no passado, quando trabalhavam 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 esses 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 de especificação técnica:
Por último, mas não menos importante, o uso de XPath e XQuery no MobileTogether permite que você utilize facilmente o XMLSpy para criar protótipos, desenvolver e depurar expressões XPath e XQuery mais complexas, caso precise ir além. O XMLSpy oferece um avaliador XPath completo e um depurador XQuery, incluindo um perfilador para otimização de desempenho.
Para saber mais sobre XPath 3.0 e XQuery 3.0, consulte os materiais de treinamento online e a documentação da Altova, disponíveis em Altova’s online training e nas páginas de documentação. Também oferecemos uma referência de XPath que explica todos os operadores e funções do XPath e fornece exemplos de como implementá-los. Por fim, não hesite em fazer perguntas relacionadas a XPath e XQuery no fórum de suporte do MobileTogether, disponível em https://support.mobiletogether.com/