Saya mencoba menulis fungsi di XQuery yang mengembalikan stempel waktu dari urutan data XML jika pola nilai tertentu terdeteksi. Data sebenarnya adalah log pengujian pesan api sistem
Contoh data XML terlihat serupa dengan cuplikan di bawah. Jika urutannya ditemukan maka diasumsikan bahwa stempel waktu (tag TIME) akan sama untuk setiap baris entri pola.
Pola spesifik yang saya perlukan untuk mendeteksi & mengembalikan TIME
dari - adalah di mana ada empat entri <FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE>
secara berurutan diikuti langsung oleh empat entri <FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE>
secara berurutan - semuanya dengan stempel waktu yang sama.
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>
<SEQUENCE><TIME>13.00</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>
<SEQUENCE><TIME>14.05</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>
<SEQUENCE><TIME>15.94</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>
<SEQUENCE><TIME>15.94</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>
Fungsi yang saya coba definisikan adalah sebagai berikut tetapi memberikan kesalahan run time dengan 'empty sequence not allowed'
. Sayangnya saya tidak memiliki IDE di mana saya dapat menetapkan titik istirahat dan men-debug ini - saya pikir saya tidak dapat menggunakan saudara berikut setelah saya memilih entri dengan FOR
.
declare function local:get_multi_track_sequence_time( $msgSeq as element()*) as xs:double {
for $row in $msgSeq
where some $entry in $row satisfies($entry/SEQUENCE[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::SEQUENCE[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI'] )
return data($row/SEQUENCE/TIME)
};
Terima kasih. Saya relatif baru di XQuery.
---------------------EDIT - TAMBAHKAN FUNGSI UJI DENGAN IDE DARI SARAN------------- --------
Terima kasih atas saran yang sudah diterima. Saya telah menulis fungsi pengujian mandiri berikut berdasarkan informasi bermanfaat yang diberikan - fungsi tersebut tidak dapat cocok dengan fungsi saudara berikutnya.
Fungsi tersebut membuat variabel data
yang berisi urutan pengujian. Fungsinya mengembalikan urutan kosong. Persyaratannya adalah ia mengembalikan 14.050000
untuk menunjukkan skalar TIME
yang memiliki empat entri <FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE>
secara berurutan diikuti langsung oleh empat entri <FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE>
secara berurutan (yaitu pada TIME 14.050000
dalam data pengujian).
(Menariknya, ini berhasil mengembalikan urutan ganda jika hanya ekspresi pertama yang digunakan, yaitu cocok dengan semua kemunculan TRACK_STATUS/VALID, tidak ada kecocokan saudara berikutnya yang ditentukan.)
declare function local:get_multi_track_sequence_time( ) as xs:double* {
let $data as element()* := (
<SEQUENCE><TIME>13.04080</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>13.04080</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>INVALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>13.05000</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>13.06900</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>,
<SEQUENCE><TIME>13.06900</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>,
<SEQUENCE><TIME>14.05000</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE></SEQUENCE>,
<SEQUENCE><TIME>15.06700</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>,
<SEQUENCE><TIME>15.06700</TIME><TAG>2900</TAG><FIELD>MULTI_CHAN_IND</FIELD><MODE>SINGLE</MODE></SEQUENCE>
)
for $entry in $data
where $entry/self::SEQUENCE
[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='TRACK_STATUS' and MODE='VALID']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
/following-sibling::*[1]/self::SEQUENCE
[TAG='2900' and FIELD='MULTI_CHAN_IND' and MODE='MULTI']
return data($entry/TIME)
};
<SEQUENCE>
Anda bukan saudara kandung (mereka adalah item terpisah secara berurutan), jadifollowing-sibling::
tidak akan berfungsi. Untuk menjadikannya saudara kandung, gabungkan mereka dalam elemen induk, mis.<root>
, dan hapus koma di antara keduanya. - person LarsH   schedule 25.09.2012