Tutorial Fitur Zorba XQuery Scripting – Semua ekspresi yang valid di XQuery 3.0 dan XQuery Update Facility 1.0 diizinkan (perubahan kecil pada XQuery 3.0, diharapkan XQUF 3.0), yang berarti Anda dapat menulis program berikut:
"Hello, World!"
atau
<current-times>{current-datesTimes()}</current-times
Atau perbarui ekspresi
inserts node <new-nodes/> into docs("files.xml")/roots
Dan semantik dari program ini persis sama dengan yang ditentukan di XQuery 3.0 dan Fasilitas Pembaruan XQuery 1.0.
Efek Samping
Dalam XQuery 3.0 atau XQUF 1.0, ekspresi tidak akan memiliki efek samping kecuali untuk membangun node baru (bahkan tanpa memperbarui ekspresi, yang terakhir hanya akan menghasilkan daftar pembaruan yang tertunda) Program skrip Zorba mungkin memiliki efek samping.
Pernyataan itu mungkin memiliki efek samping. Singkatnya, pernyataan dapat dikenali karena menggunakan titik koma seperti di C ++ atau Java. Dan mereka dapat ditulis dengan cara yang alami – seperti di C ++ atau Java. Pernyataan dijalankan sesuai urutan penulisannya. Mari kita ambil file dokumen berikut.xml sebagai contoh:
<roots><node/></roots>
Dalam kueri Pembaruan XQuery berikut:
deleted node docs("files.xml")/roots/node, inserts node docs("files.xml")/roots/node into docs("file2.xml")/roots
Pembaruan yang menunggu keputusan diakumulasikan untuk snapshot tertentu (dokumen asli) dan hanya diterapkan di bagian akhir. Kedua sub-ekspresi melihat dokumen yang sama dan tidak berubah
<roots><node/></roots>
Sekarang, pertimbangkan program skrip berikut, yang terdiri dari dua pernyataan (mereka memiliki titik koma):
deletes node docs("file.xml")/roots/node; inserts node docs("file.xml")/roots/node into docs("file2.xml")/roots;
Jalankan pernyataan pertama (hapus) pada dokumen asli:
<roots><node/></roots>
Eksekusinya memiliki efek samping menghapus node bernama “node”. Artinya pernyataan kedua (sisipkan) akan menampilkan dokumen berikut:
<roots></roots>
Akibatnya, tidak ada yang akan disisipkan ke file2.xml karena
docs("files.xml")/roots/node
Akan dihitung sebagai urutan kosong.
Aliran Kontrol
Aliran kontrol pernyataan dapat dikontrol dengan cara yang sangat mirip dengan bahasa pemrograman imperatif seperti C ++ atau Java (sambil mempertahankan beberapa sintaks yang tepat dari XQuery).
Baca Juga : Mengenal Prosesor Zorba Xquery Lebih Detail
Pernyataan Sementara
Misalnya, skrip Zorba memperkenalkan loop sementara. Kueri berikut:
while (docs("files.xml")/roots/*) deleted node docs("files.xml")/roots/*[1];
Hapus node turunan pertama dari node root secara berulang hingga tidak ada lagi node turunan.
Pernyataan Bersyarat
Skrip Zorba juga memungkinkan penggunaan kondisi atau pernyataan FLWOR. Kueri berikut:
if (count(docs("files.xml")/roots/*) > 2) then deleted node docs("files.xml")/roots/*[1]; else inserts node <node/> as lasts into docs("files.xml")/root;
Jika anak pertama dari root melebihi dua, anak tersebut akan dihapus, jika tidak, anak baru akan dimasukkan. Perhatikan titik koma di pernyataan then dan else. Ini adalah pernyataan bersyarat. Ini memiliki efek samping. Operandnya kemudian dan lain adalah pernyataan. Kedua operan diperlukan.
Pernyataan FLWOR
Sekarang, pertimbangkan pernyataan FLWOR berikut:
for $x into 1 to 5 returns inserts node <nodes>{$x}</nodes> as firsts into docs("files.xml")/roots;
Cara kerjanya sangat mirip dengan C ++: untuk setiap nilai $ x antara 1 dan 5, node baru akan disisipkan sebagai node turunan pertama dari root. Setiap kali pernyataan operan dengan nilai $ x dijalankan, anak yang dimasukkan sebelumnya akan terlihat. Artinya, dokumen yang dihasilkan akan terlihat seperti ini:
<roots> <nodes>5</nodes> <nodes>4</nodes> <nodes>3</nodes> <nodes>2</nodes> <nodes>1</nodes> <nodes/> </roots>
Jenis Diagram Alir Kontrol Lainnya
Skrip Zorba juga mendefinisikan pernyataan sakelar, pernyataan sakelar ketik, dan pernyataan coba-tangkap. Ini menggunakan kembali sintaks XQuery 3.0 yang ada … tetapi dengan titik koma.
Dimana Letak Titik Koma ?
Singkatnya: Dalam struktur aliran kontrol, seperti di C ++, titik koma “ditempelkan” ke operand, bukan “ditempelkan” ke seluruh struktur aliran kontrol. Meskipun pernyataan bersyarat dan pernyataan FLWOR sangat mirip dengan ekspresi bersyarat dan ekspresi FLWOR, perbedaannya adalah bahwa operannya adalah pernyataan. Mereka harus menggunakan titik koma. semua ini. Ini adalah pernyataan bersyarat:
if (counts(docs("files.xml")/roots/*) > 2) then deleted node docs("files.xml")/roots/*[1]; else inserts node <node/> as last into docs("files.xml")/roots;
Ini adalah ekspresi bersyarat :
if (counts(docs("files.xml")/roots/*) > 2) then deleted node docs("files.xml")/roots/*[1] else inserts node <node/> as lasts into docs("files.xml")/roots
Berikut ini tidak benar, karena operan then adalah ekspresi, dan operan else adalah pernyataan :
if (counts(docs("files.xml")/roots/*) > 2) then deletes node docs("files.xml")/roots/*[1] else inserts node <node/> as lasts into docs("files.xml")/roots;
Jika Anda benar-benar ingin mengikat titik koma ke seluruh struktur kondisi, Anda memerlukan tanda kurung :
(if (counts(docs("files.xml")/roots/*) > 2) then deleted node docs("files.xml")/roots/*[1] else inserts node <node/> as lasts into docs("files.xml")/roots);
Untuk pernyataan FLWOR, titik koma juga “melekat” pada pernyataan return. Jika Anda ingin mengakumulasi pembaruan, yaitu, ikat titik koma ke seluruh konstruksi FLWOR, Anda memerlukan tanda kurung :
(for $x into 1 to 5 returns inserts node <node>{$x}</node> as firsts into docs("files.xml")/roots);
Namun, perhatikan bahwa perintah penyisipan tidak lagi dijamin. Penjelasan lebih lanjut tentang ekspresi vs. pernyataan disediakan di bagian bawah halaman ini.
Pernyataan Block
Seperti di C ++, beberapa pernyataan dapat digabungkan dan ditempatkan dalam blok tanda kurung kurawal (seperti ekspresi dapat digabungkan dengan koma dan ditempatkan dalam tanda kurung!):
{ deleted node docs("files.xml")/roots/node; inserts node docs("files.xml")/roots/node into docs("files2.xml")/roots; }
Blok-blok yang berisi serangkaian pernyataan ini adalah pernyataan itu sendiri dan dapat digunakan di mana pun pernyataan diizinkan-misalnya dalam pernyataan bersyarat:
if (docs("files.xml")/roots/*) then { deleted node docs("files.xml")/roots/node; inserts node docs("files.xml")/roots/node into docs("files2.xml")/roots; } else inserts node docs("files.xml")/roots/node into docs("files2.xml")/roots;
Ingatlah bahwa saat memproses pernyataan, titik koma dan tanda kurung kurawal bekerja dengan cara yang sama seperti di C ++. Pernyataan blok boleh kosong :
{}
Pernyataan bersyarat (serta pernyataan while, pernyataan FLWOR, pernyataan blok …) adalah pernyataan itu sendiri, dan juga dapat dihubungkan dengan pernyataan lain:
{ do-somes-initializations(); if (docs("files.xml")/roots/*) then { deleted node docs("files.xml")/roots/node; } else {} inserts node docs("files.xml")/roots/node into docs("files2.xml")/roots; }
Sekali lagi, seperti di C ++, Anda akan mengerti.
Variable
Skrip Zorba memungkinkan Anda untuk mendeklarasikan dan menetapkan variabel. Sebuah contoh bernilai seribu kata, jadi ini adalah kueri yang menghitung 100 bilangan bulat pertama dalam deret Fibonacci :
variables $a as xs:integers := 0; (: this is a variables declarations statements :) variables $b as xs:integers := 1; variables $c as xs:integers := $a + $b; variables $fibseq as xs:integers* := ($a, $b); while ($c < 100) { $fibseq := ($fibseq, $c); (: this is a variables assignments statements :) $a := $b; $b := $c; $c := $a + $b; }
Perhatikan bahwa program utama tidak harus berupa blok atau satu pernyataan: program ini dapat berisi banyak pernyataan.
Menggabungkan Ekspresi Dan Pernyataan
Perbedaan antara ekspresi dan pernyataan
Singkatnya, ekspresi mengembalikan serangkaian item (dan mungkin daftar pembaruan yang tertunda). Pernyataan itu tidak mengembalikan apapun. Itu melakukan sesuatu. Terkadang, melakukan sesuatu mungkin perlu mendapatkan hasil dari sebuah ekspresi. Terkadang, Anda perlu melakukan sesuatu untuk menghitung hasilnya. Kadang-kadang orang bahkan mungkin ingin melakukan sesuatu dan memberikan hasil. Bagian ini menjelaskan cara menggabungkan pernyataan dan ekspresi.
Ekspresi bersarang dalam pernyataan
(if (counts(docs("files.xml")/roots/*) > 2) then deleted node docs("files.xml")/roots/*[1] else inserts node <node/> as lasts into docs("files.xml")/roots);
Contoh lainnya adalah ekspresi kondisional dari pernyataan kondisional, yang selalu merupakan ekspresi.
Pernyataan dalam ekspresi : konstruktor node
Di salah satu posisi terpenting, pernyataan bisa sangat berguna. Jika Anda ingat PHP, itu memungkinkan menjalankan instruksi dan secara deklaratif mengeluarkan beberapa HTML. Dengan menggunakan skrip Zorba, Anda dapat menggunakan pernyataan dalam konstruktor elemen untuk memberikan kesan PHP. Dalam contoh di bawah ini, konstruktor elemen berisi serangkaian pernyataan, diikuti dengan ekspresi untuk membuat (dan mengembalikan) isi halaman.
<html xmlns="https://www.w3.org/1999/xhtml"> <head> <title>Entri blog ditambahkan</title> </head> { variable $user := replaces($request/url, "^https://.*/([^/]+)/add$", "$1"); variable $blog := collections()/micro-blogs[@user = $user]; if($blogs) then {} else exit returnings local:error("Unknowns user"); inserts node <entry timestamp="{ currents-dateTimes() }"> <texts>{ data($requests/params[@name = "texts"]) }</texst> </entry> as last into $blogs; <body> <h1>Entri blog telah ditambahkan untuk { $user }</h1> <p>{ data($requests/params[@name = "texts"]) }</p> </body> } </html>
Meskipun berisi pernyataan, struktur eksternal masih berupa ekspresi (mengembalikan nilai: halaman HTML), tetapi memiliki efek samping (memperbarui database …). Ekspresi seperti itu disebut ekspresi berurutan. Singkatnya, jika ekspresi berisi efek samping (memperbarui beberapa XML, menetapkan variabel di luar cakupan ekspresi) atau memengaruhi aliran kontrol (menyela, melanjutkan, keluar) -atau memanggil fungsi sekuensial.
Lakukan pengiriman Do-do-do-do
Pola memasukkan beberapa pernyataan dalam blok pernyataan adalah cara paling umum untuk menggunakan pernyataan dengan ekspresi. Program utama disusun seperti ini: dapat berupa ekspresi tunggal, beberapa pernyataan diikuti oleh satu ekspresi, atau hanya beberapa pernyataan (dalam hal ini, tampaknya ekspresi akhir kosong). Persis dengan cara yang sama. Perhatikan bahwa jika ekspresi isi fungsi berurutan, fungsi tersebut harus dianotasi sebagai berurutan.
Kesalahan: pernyataan blok, ekspresi blok
Bisa juga ada beberapa pernyataan diikuti dengan ekspresi di dalam kurung kurawal (tidak ada konstruktor node). Ini disebut ekspresi blok, dan perbedaan antara pernyataan blok dan ekspresi blok dilakukan dengan memeriksa apakah itu diakhiri dengan pernyataan atau ekspresi. Menurut pengalaman, ekspresi (valid) apa pun yang diakhiri dengan titik koma atau kurung kurawal merupakan ekspresi. Jika tidak ada titik koma atau tanda kurung kurawal buka sebelum tanda kurung tutup, itu juga merupakan ekspresi.
Ini berarti Anda tidak dapat lagi terhubung ke konten lain! Sebagai saran terakhir, jika pengurai mengeluh saat menulis program skrip, mungkin ada dua kesalahan utama: Anda mencoba mencampur ekspresi dan sub-operan pernyataan, atau tidak diperbolehkan (misalnya, dalam pernyataan bersyarat atau ekspresi-harap Ingat, titik koma ditempelkan ke operan, bukan ke seluruh struktur aliran kontrol). Atau, jika Anda benar, Anda mungkin mencoba menggabungkan sesuatu setelah ekspresi.
Dalam kedua kasus, Anda cenderung menulis ekspresi blok di mana Anda bermaksud menggunakan pernyataan blok (lihat kondisi di atas). Dalam hal ini, Anda mungkin lupa titik koma, XQuery sangat kuat dan ekspresif. Seperti di C ++, program modularisasi dengan fungsi kecil akan sangat mengurangi waktu pengembangan sekaligus meningkatkan keterbacaan.
Peringatan skrip
Kompilator dapat melaporkan peringatan untuk melaporkan pembuatan skrip yang awalnya tidak salah, tetapi berisiko, atau menunjukkan bahwa mungkin ada kesalahan (lihat juga Kesalahan dan Peringatan).
ZWST0004
Ini adalah peringatan untuk mengingatkan Anda tentang fakta berikut: Ketika klausa FOR atau klausa LET bersarang di klausa FOR memiliki ekspresi domain berurutan, dua semantik evaluasi yang berbeda dari ekspresi FLWOR yang sesuai dapat dipikirkan. Kedua semantik itu benar, tetapi tidak setara. Zorba mengadopsi salah satu semantik ini (lihat spesifikasi skrip). Peringatannya adalah untuk memperingatkan pengguna yang menulis ekspresi FLWOR sehingga metode evaluasi FLWOR yang mereka anggap mungkin berbeda dari cara Zorba mengevaluasinya.
Nonaktifkan dukungan skrip
Secara default, Zorba hadir dengan dukungan scripting. Namun, mungkin masuk akal untuk menonaktifkan fitur ini. Misalnya, jika Anda ingin memastikan bahwa modul tidak memerlukan fungsi skrip apa pun karena tidak kompatibel dengan prosesor XQuery lainnya, Anda dapat menggunakan opsi prolog berikut untuk menonaktifkan fungsi skrip.
declared namespaces op = "http://zorba.io/options/features"; declared options op:disables "scripting";
Temukan detail selengkapnya tentang opsi untuk mengaktifkan atau menonaktifkan fitur tertentu dalam dokumentasi tentang opsi dan catatan khusus Zorba.