MobileTogether wykorzystuje język XPath jako język formuł i wyrażeń.
Jeśli potraficie tworzyć formuły w arkuszu kalkulacyjnym Excel, łatwo nauczycie się, jak tworzyć formuły lub wyrażenia XPath w programie MobileTogether. Wystarczy zrozumieć kilka podstawowych koncepcji. Narzędzie do budowania wyrażeń XPath w MobileTogether ułatwia tworzenie tych wyrażeń, podobnie jak narzędzie do tworzenia formuł w Excelu pomaga w pisaniu formuł w arkuszach kalkulacyjnych.
Litera "X" w XPath pochodzi od jego korzeni w XML, czyli w języku znaczników rozszerzalnych. Natomiast słowo "Path" (ścieżka) odnosi się do faktu, że do identyfikacji poszczególnych fragmentów danych używany jest format przypominający ścieżkę. Każde źródło danych, do którego uzyskujesz dostęp w MobileTogether, jest reprezentowane jako mała struktura drzewiasta po prawej stronie okna MobileTogether Designer, w sekcji "Źródła stron". Każda struktura drzewiasta zaczyna się od korzenia, który ma nazwę, np. $XML1 lub $DB1, a pod tym korzeniem znajdują się poszczególne fragmenty danych – zwane elementami. Te elementy są zagnieżdżone w logiczny sposób, dlatego najlepiej je reprezentować jako drzewa, w których można zwijać i rozwijać każdy element, aby zobaczyć, co się pod nim znajduje. Najlepszą cechą MobileTogether jest to, że nie ma znaczenia, czy dane pochodzą z bazy danych, dokumentu XML, usługi internetowej, czy innego źródła – wszystkie są prezentowane w ten sam sposób i można do nich uzyskać dostęp w ten sam sposób.
XPath umożliwia poruszanie się po tych strukturach drzewiastych, aby powiązać elementy danych z obiektami interfejsu użytkownika wyświetlanymi na ekranach urządzeń mobilnych. Jest to bardzo podobne do sposobu, w jaki poruszamy się po strukturze katalogów w systemie plików komputera. Niezależnie od tego, czy używamy systemu Windows, Linux czy MacOS, do plików na dysku twardym można zawsze uzyskać dostęp za pomocą ścieżki, takiej jak:
C:\Users\Spock\Documents\ScienceRecords (Windows)
/Users/Kirk/Documents/BeautifulAlienWomen (Linux/Mac)
Zatem, przyjrzyjmy się przykładowemu wyrażeniu XPath, porównując je z innymi
$DB1/salesdata/region/month/gadgetsJak widać, jest to dokładnie ten sam pomysł. Używamy XPath do poruszania się po strukturach danych w formie drzewa, podobnie jak używamy wyrażeń ścieżek do poruszania się po systemie plików na dysku twardym komputera. XPath wykorzystuje znak "/" (przecinek) do oddzielania poszczególnych elementów w ścieżce, podobnie jak systemy Linux i MacOS używają tego znaku do oddzielania katalogów.
Co ciekawe, to analogia do ścieżek katalogów dotyczy również dwóch bardzo popularnych skrótów w XPath: podobnie jak pojedynczy znak kropki (.) odnosi się do bieżącego katalogu w systemie plików, w XPath kropka (.) odnosi się do bieżącego elementu, a podobnie jak podwójna kropka (..) odnosi się do katalogu nadrzędnego w systemie plików, w XPath odnosi się ona do elementu nadrzędnego.
Jeśli źródłem danych jest dokument XML lub dane XML zwracane przez usługę internetową, to dane zawarte w tej strukturze drzewiastej występują w dwóch formach: elementów i atrybutów. Elementy stanowią podstawowe jednostki danych w XML i mogą być zagnieżdżone, co oznacza, że element może mieć elementy potomne w strukturze drzewiastej. Atrybuty, z kolei, to proste wartości danych, które są przypisane do elementów. W sekcji "Źródła stron" (Page Sources) zauważą Państwo, że atrybuty są wyświetlane z znakiem "=" (znak równości) przed ich nazwą. Dzieje się tak dlatego, że w dokumencie XML atrybuty są zapisywane, na przykład, jako "color=\"green\"".
Aby odwołać się do atrybutów w wyrażeniu XPath, należy umieścić przed ich nazwą znak "@" (znak "at")
$XML1/salesdata/region/@nameW przeciwnym razie, można wykonać te same operacje na elementach i atrybutach, czyli można wykorzystać je w obliczeniach lub przedstawić ich wartości w wykresie, a także przypisać je do elementów interfejsu użytkownika w projekcie MobileTogether.
Czasami samo wskazanie ścieżki do elementu w danych nie wystarcza. Często chcemy wybrać fragment danych, który spełnia określone kryteria, aby na przykład wyświetlić go w wykresie lub zaprezentować użytkownikowi w formie tabeli.
Jeśli kiedykolwiek pracowaliście z bazami danych relacyjnych, to jest to odpowiednik typowej klauzuli WHERE w zapytaniu SQL. Pozwala ona na wybór danych z bazy, które spełniają określone kryteria
Odpowiednikiem tego pojęcia w XPath są tzw. "predykaty". Predykat w XPath pozwala określić kryteria wyboru, które pozwolą wybrać tylko te elementy, które spełniają określone kryteria. Predykaty są wpisywane jako wyrażenie logiczne, otoczone nawiasami kwadratowymi [], na przykład:
$XML1/salesdata/region[@name=”East”]/MonthInterpretacja tego stwierdzenia jest następująca: w źródle danych XML1 przejdź do elementu "salesdata", następnie przejdź do jego elementu potomnego "region" i wybierz tylko te regiony, w których wartość atrybutu odpowiada "East", a następnie wybierz odpowiadające im elementy potomne "Month".
Na początku wspomnieliśmy, że XPath to pełnoprawny język wyrażeń. Oznacza to, że pozwala on nie tylko na wybieranie określonych fragmentów danych, ale również umożliwia wykonywanie wszystkich typowych operacji matematycznych na tych danych, w celu obliczenia nowych wartości. Podobnie jak formuły w Excelu pozwalają na obliczanie nowych wartości na podstawie istniejących danych, można osiągnąć dokładnie to samo, używając wyrażeń XPath w MobileTogether.
Załóżmy, że chcemy stworzyć mobilne rozwiązanie do wystawiania faktur i chcemy wyświetlić łączną kwotę dla konkretnej pozycji w naszym formularzu mobilnym:
$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price
Zakładając, że struktura danych zawiera oddzielne elementy dla ilości i ceny (które mogą być edytowane przez użytkownika), można wtedy po prostu obliczyć całkowitą kwotę dla danego produktu, korzystając z powyższego mnożenia i znaku * (gwiazdki).
Jedną z bardzo przydatnych funkcji XPath jest możliwość znacznego skrócenia kodu, wykonując operacje mnożenia bezpośrednio w wyrażeniu XPath, używając nawiasów w odpowiednim miejscu ścieżki. W ten sposób, skrócona wersja jest równoważna powyższemu wyrażeniu:
$DB1/sales/invoice/item/(quantity * price)Podobnie, można używać znaków "+" (plus) i "-" (minus) jako operatorów matematycznych. Jednak do dzielenia należy użyć innego symbolu. Ponieważ już używamy znaku "/" (ukośnik) do oddzielania poszczególnych elementów w ścieżce, nie możemy użyć tego samego znaku do dzielenia. Dlatego operatorem dzielenia w XPath jest słowo "div" dla dzielenia liczb rzeczywistych oraz "idiv" dla dzielenia liczb całkowitych (czyli, jeśli chcemy, aby wynik był liczbą całkowitą, a nie liczbą rzeczywistą).
Ponadto, jest to dobra praktyka – a czasami wręcz konieczność – umieszczanie spacji wokół operatorów, aby upewnić się, że nie zostaną one mylnie zinterpretowane jako część nazwy elementu lub atrybutu. Dotyczy to szczególnie operatora "-".
Istotną różnicą między wyrażeniami XPath a ścieżkami do katalogów jest to, że podczas gdy wyrażenie ścieżki do katalogu zazwyczaj identyfikuje tylko jeden konkretny plik lub katalog, wyrażenie XPath może odnosić się do więcej niż jednego elementu danych (tj. elementu lub atrybutu). W rzeczywistości, każde wyrażenie XPath zawsze zwraca sekwencję elementów jako wynik.
To jest łatwiej zrozumieć, jeśli weźmiemy pod uwagę, że większość baz danych zawiera wiersze danych o podobnej strukturze, podobnie jak większość dokumentów XML w swojej podstawowej strukturze zawiera serię elementów o tej samej nazwie i podobnej strukturze. XPath został stworzony, aby umożliwić programistom łatwą pracę z takimi zbiorami danych – możliwość jednoczesnego adresowania całego zestawu węzłów przynosi ogromne korzyści, o czym przekonamy się w kolejnych rozdziałach.
W tym samym czasie, czasami może być konieczne wyraźne określenie sekwencji w wyrażeniu XPath, a można to zrobić, wymieniając wartości w następującej formie:
(1, 2, 3, 4, 5)
Sekwencje są uporządkowane, więc powyższa sekwencja jest wyraźnie inna niż sekwencja (3, 5, 2, 4, 1). Sekwencje mogą zawierać elementy z Twoich danych, a także stałe wartości liczbowe lub stałe wartości tekstowe.
Na przykład, możliwa sekwencja ciągów znaków mogłaby wyglądać następująco:
("a", "b", "c", "d", "e")Ostatnią, ale równie ważną kwestią, jest możliwość określania uporządkowanych sekwencji wartości liczbowych za pomocą operatora zakresu, aby:
(1 to 5)
To odpowiada sekwencji (1, 2, 3, 4, 5) – jak widać, ten operator zakresu może być używany do szybkiego tworzenia sekwencji wartości liczbowych, których ręczne wypisywanie byłoby zbyt czasochłonne, zwłaszcza gdy liczby stają się większe.
Jeśli wcześniej pracowali Państwo z innymi językami programowania, rozpoznają Państwo pętlę "for" jako powszechnie stosowane narzędzie, które występuje w większości nowoczesnych języków programowania w pewnej formie. Jest ona również integralną częścią języka wyrażeń XPath.
W swojej najprostszej formie, wyrażenie "for" w XPath umożliwia iterację po sekwencji wartości lub węzłów, wykorzystując zmienną tymczasową, która jest definiowana bezpośrednio wewnątrz wyrażenia "for". Na przykład, wyrażenie..
for $i in (1 to 10) return 2 * $i
Wygeneruje sekwencję liczb (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) poprzez iterację po oryginalnej sekwencji (od 1 do 10) za pomocą zmiennej $i, a następnie obliczanie wartości 2 * $i dla każdego elementu w sekwencji.
Skoro wiemy, że każde wyrażenie XPath może zwrócić sekwencję węzłów, możemy również wykorzystać wyrażenie "for" do iteracji po tych węzłach i wykonania na nich pewnych operacji matematycznych. Na przykład, aby przejść przez wszystkie pozycje w fakturze i obliczyć kwotę dla każdej z nich, moglibyśmy użyć następującego wyrażenia:
for $x in $DB1/sales/invoice/item return $x/price * $x/quantity
W tym przypadku, zmienna `$x` będzie naszą zmienną iteracyjną, która będzie przechodzić przez każdy element pozycji, a to wyrażenie zwróci sekwencję zawierającą kwoty dla każdej pozycji w naszej fakturze. Załóżmy, że w naszych danych źródłowych faktury mamy następujące dwa elementy pozycji:
<item><quantity>5</quantity>
<price>12.50</price>
</item><item><quantity>3</quantity>
<price>27.85</price>
</item>Następnie poprzednie wyrażenie XPath zwróci sekwencję (62,5 83,55), która reprezentuje odpowiednie kwoty dla każdego elementu pozycji na fakturze.
Funkcje w XPath działają dokładnie tak samo jak funkcje w formułach Excela lub w większości innych języków programowania: wywołuje się funkcję, używając jej nazwy i przekazując zestaw parametrów funkcji w nawiasach (). Na przykład, aby zsumować sekwencję (3, 9, 14), należy wpisać:
sum( (3, 9, 14) )W ten sposób otrzymamy wynik 26. Należy pamiętać, że w tym przypadku zewnętrzne nawiasy są częścią wywołania funkcji `sum()`, podczas gdy wewnętrzne nawiasy stanowią część sekwencji, którą przekazujemy do funkcji jako pojedynczy parametr.
Podobnie, możemy teraz obliczyć łączną kwotę faktury z poprzedniego przykładu, sumując wszystkie pozycje
sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )
Może to być bardzo przydatne, na przykład do tworzenia interaktywnych formularzy w aplikacjach mobilnych, w których można wyświetlać wartości danych dla sum, które będą się dynamicznie zmieniać w miarę wprowadzania danych przez użytkownika do formularza.
XPath zawiera dużą liczbę wbudowanych funkcji dla wartości numerycznych (np. round, abs, floor), manipulacji tekstowych (np. concat, lower-case, contains, replace), przedziałów czasowych, dat i godzin, a także operacji agregujących na sekwencjach (np. count, sum, avg, min, max). Narzędzie do tworzenia wyrażeń XPath w MobileTogether ułatwia pisanie tych wyrażeń przy użyciu tych funkcji, ponieważ zawiera wygodny katalog wszystkich dostępnych funkcji z krótkim opisem i informacjami o wymaganych parametrach. Funkcje są wyświetlane w logicznych grupach, co ułatwia znalezienie funkcji potrzebnej do konkretnego zastosowania.
W językach programowania, a także w językach wyrażeń, często konieczne jest określenie różnych sposobów obliczania konkretnego wyniku, w zależności od tego, czy spełniony jest określony warunek, czy nie. Właśnie wtedy do akcji wkracza instrukcja warunkowa "if", która pozwala zdefiniować różne wyniki w zależności od określonych kryteriów.
W XPath instrukcja warunkowa "if" ma następującą formę:
if ( test-expression ) then expression else expression
gdzie "test-expression" to wyrażenie XPath o charakterze logicznym, które zwraca wartość logiczną: prawdę (true) lub fałsz (false).
Na przykład, możemy wykorzystać takie wyrażenie w MobileTogether, aby kolor tekstu etykiety lub pola edycyjnego zależał od wartości numerycznej zawartej w danych. Załóżmy, że mamy element z naszego źródła danych powiązany z polem edycyjnym. Możemy wybrać to pole edycyjne i przejść do zakładki "Właściwości", gdzie możemy wybrać właściwość "Kolor tekstu". Zamiast definiować kolor za pomocą palety kolorów, możemy kliknąć ikonę XPath na pasku narzędzi i zdecydować się zdefiniować kolor tekstu tego pola wejściowego za pomocą wyrażenia XPath:
if ( $MT_ControlValue >= 0 ) then "green" else "red"
W tym miejscu używamy jednej z wbudowanych zmiennych MobileTogether, aby odwołać się do aktualnego elementu sterowania, i sprawdzamy, czy jego wartość jest większa lub równa zero.
W zależności od wyniku tego testu, wynik będzie albo "zielony", albo "czerwony", a kolor tekstu będzie się dynamicznie zmieniał w zależności od danych wprowadzonych przez użytkownika.
Podobnie, istnieje wiele innych wbudowanych zmiennych, które zaczynają się od "$MT_" i pozwalają podejmować decyzje w oparciu o rozmiar ekranu urządzenia, system operacyjny, język i wiele innych czynników. Wszystkie te wbudowane zmienne globalne można wyświetlić w oknie dialogowym "Zmienne globalne" w menu "Projekt" w programie MobileTogether Designer.
Do tej pory mówiliśmy głównie o XPath, głównie ze względów historycznych, ponieważ jest to bardziej znany język wyrażeń oparty na XML i istnieje już od 15 lat. Jednak, oprócz XPath, MobileTogether obsługuje również bardziej zaawansowany język XQuery. XQuery jest prawdziwym rozszerzeniem języka XPath, co oznacza, że każde poprawne wyrażenie XPath jest również poprawnym wyrażeniem XQuery. Jednak XQuery dodaje kilka dodatkowych, potężnych funkcji, które pozwalają na wykonywanie znacznie bardziej zaawansowanych operacji i umożliwiają manipulację lub tworzenie całych dokumentów XML w czasie rzeczywistym.
Najważniejszym wyrażeniem w XQuery jest tzw. wyrażenie FLWOR. FLWOR to akronim, który oznacza "For-Let-Where-Order-Return" i jest powszechnie wymawiany jako "flower". Jest on funkcjonalnie równoważny instrukcji SELECT w SQL, która zawiera podobne klauzule, takie jak FROM, WHERE, ORDER BY i inne. Wyrażenie FLWOR pozwala na znacznie bardziej efektywne i potężne zapytania do danych XML i baz danych niż w przypadku prostych wyrażeń XPath, i stanowi podstawę XQuery.
W naszej poprzedniej dyskusji na temat XPath, już zetknęliśmy się z częścią wyrażenia "for", więc ta część wyrażenia FLWOR będzie dla Państwa dobrze znana. Podobnie, wcześniej widzieliśmy klauzulę "return" w tym samym wyrażeniu "for". Jednak XQuery znacznie zwiększa elastyczność klauzuli "return", umożliwiając tworzenie całych drzew XML od podstaw, korzystając z konstruktorów. W zasadzie, jak wcześniej, klauzula "return" jest obliczana dla każdego elementu w pętli "for", ale zamiast generować tylko jedną wartość w sekwencji, można teraz zbudować całe poddrzewo XML, o czym przekonają się Państwo, analizując poniższe przykłady.
Celem klauzuli `let` w wyrażeniu FLWOR jest zdefiniowanie dodatkowych zmiennych, które możemy później wykorzystać do budowania naszego wyniku. Te zmienne mogą pochodzić z tego samego źródła danych, a nawet z innego źródła danych, ale, na przykład, możemy użyć zmiennej pętli do wyboru określonych elementów z tego drugiego źródła.
Na przykład, zakładając, że jedno źródło danych zawiera informacje o działach w organizacji, a drugie źródło danych zawiera informacje o pracownikach, poniższe wyrażenie FLWOR może być początkiem zapytania, które wybiera pracowników z określonych działów:
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
…
Klauzula "where" umożliwia filtrowanie danych na podstawie określonych kryteriów – podobnie jak w przypadku używania predykatów w czystych wyrażeniach XPath, które wykorzystywaliśmy wcześniej. Na przykład, możemy użyć jej do filtrowania działów w zależności od liczby zatrudnionych w nich pracowników:
for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
…
Na koniec, klauzula `order by` umożliwia sortowanie wyników według dowolnych kryteriów, co jest szczególnie przydatne podczas tworzenia nowych dokumentów XML.
Teraz połączmy wszystkie elementy wyrażenia FLWOR, wykorzystując dwa wcześniej wspomniane źródła danych zawierające informacje o działach i pracownikach. Na przykład, możemy wygenerować nową tabelę danych, która zostanie wyświetlona w aplikacji mobilnej i będzie zawierała zagregowane informacje o liczbie pracowników oraz średniej pensji dla tych działów, które zatrudniają więcej niż 10 pracowników:
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>W kolejnym przykładzie, wykorzystując nasze wcześniejsze dane dotyczące faktur mobilnych z wyszczególnieniem pozycji, możemy teraz rozszerzyć tę funkcjonalność i przetwarzać wiele faktur wystawionych po określonej dacie, aby obliczyć ich sumy, a następnie utworzyć tabelę posortowanych wyników, którą możemy wyświetlić, zaczynając od faktury o najwyższej sumie i kończąc na fakturze o najniższej sumie
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>
Jak widać, elastyczność i możliwości tych wyrażeń XQuery są znacznie większe niż to, co mogliśmy wcześniej osiągnąć, korzystając tylko z XPath. Jednak wraz z większą mocą wiąże się również większa złożoność, więc może minąć trochę czasu, zanim opanuje się wszystkie aspekty XQuery.
Jednocześnie, wbudowany w MobileTogether konstruktor i interpreter wyrażeń XPath i XQuery może znacznie ułatwić tworzenie poprawnych wyrażeń oraz ich testowanie przy użyciu własnych danych. W połączeniu z potężnym symulatorem, który umożliwia uruchamianie aplikacji mobilnych bezpośrednio w środowisku MobileTogether Designer, można łatwo testować i debugować proces wyboru danych za pomocą XPath i XQuery, a także tworzyć zaawansowane aplikacje mobilne znacznie szybciej niż przy użyciu innych metod.
W tym dokumencie przedstawiamy wprowadzenie do najważniejszych koncepcji XPath i XQuery, które pomogą Państwu rozpocząć pracę z danymi w MobileTogether. Omówiliśmy podstawowe koncepcje wyrażeń XPath oraz niektóre z bardziej zaawansowanych możliwości XQuery, co powinno umożliwić Państwu tworzenie efektywnych selekcji danych w procesach mobilnych, generowanie precyzyjnych wykresów na podstawie danych oraz dostosowywanie interfejsu użytkownika rozwiązania mobilnego w odpowiedzi na konkretne elementy danych, w razie potrzeby.
Jednakże, ten dokument to jedynie punkt wyjścia i nie ma na celu być pełnym poradnikiem ani wyjaśniać wszystkich aspektów tych języków. Możecie dowiedzieć się więcej w naszym kompleksowym, bezpłatnym kursie online dotyczącym XPath, który jest odpowiedni zarówno dla początkujących, jak i zaawansowanych użytkowników.
MobileTogether obsługuje w pełni języki XPath 3.0 i XQuery 3.0. Zaletą korzystania z międzynarodowych standardów, takich jak XPath i XQuery, jest to, że wielu programistów mogło już wcześniej zapoznać się z XPath, pracując z technologiami XML, XSLT lub XML Schema. Możliwość wykorzystania tej wiedzy w MobileTogether jest więc dla nich dużą zaletą. Ponadto, przejście z wersji XPath 1.0 lub 2.0 do wersji 3.0 jest procesem prostym.
Ponadto, XPath i XQuery to standardy opracowane przez W3C, a nie języki zastrzeżone, stworzone przez jedną firmę. Dlatego nauka tych standardów będzie przydatna również w innych kontekstach.
Pełną specyfikację XPath 3.0 i XQuery 3.0 można znaleźć w następujących dokumentach technicznych:
Ostatnią, ale równie ważną kwestią jest to, że korzystanie z XPath i XQuery w MobileTogether umożliwia łatwe wykorzystanie programu XMLSpy do tworzenia prototypów, rozwoju i debugowania bardziej złożonych wyrażeń XPath i XQuery, jeśli jest to konieczne. XMLSpy oferuje pełną funkcjonalność evaluatora XPath i debugera XQuery, w tym narzędzie do profilowania, które pomaga w optymalizacji wydajności.
Aby dowiedzieć się więcej o XPath 3.0 i XQuery 3.0, zapraszamy do zapoznania się z materiałami szkoleniowymi dostępnymi online oraz dokumentacją firmy Altova. Dodatkowo, udostępniamy referencję XPath, która wyjaśnia wszystkie operatory i funkcje XPath oraz zawiera przykłady ich implementacji. W razie pytań dotyczących XPath i XQuery, prosimy o skorzystanie z forum wsparcia MobileTogether pod adresem https://support.mobiletogether.com/