ฉันกำลังพยายามเขียนฟังก์ชันใน XQuery ที่ส่งคืนการประทับเวลาจากลำดับข้อมูล XML หากตรวจพบรูปแบบค่าเฉพาะ ข้อมูลนี้เป็นบันทึกการทดสอบข้อความ API ของระบบจริงๆ
ข้อมูล XML ตัวอย่างมีลักษณะคล้ายกับตัวอย่างด้านล่าง หากพบลำดับ ระบบจะถือว่าการประทับเวลา (แท็ก TIME) จะเหมือนกันสำหรับแต่ละบรรทัดของรายการรูปแบบ
รูปแบบเฉพาะที่ฉันต้องตรวจจับและส่งคืน TIME
ของ - คือโดยที่มีรายการ <FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE>
สี่รายการตามลำดับ ตามด้วยรายการ <FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE>
สี่รายการตามลำดับ - ทั้งหมดมีการประทับเวลาเดียวกัน
<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>
ฟังก์ชั่นที่ฉันพยายามกำหนดมีดังนี้ แต่ให้ข้อผิดพลาดรันไทม์ด้วย 'empty sequence not allowed'
น่าเสียดายที่ฉันไม่มี IDE ที่สามารถตั้งค่าจุดพักและแก้ไขข้อบกพร่องนี้ได้ - ฉันคิดว่าฉันไม่สามารถใช้ follow-sibling ได้เมื่อฉันเลือกรายการที่มี 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)
};
ขอบคุณ. ฉันยังใหม่กับ XQuery
---------------------แก้ไข - เพิ่มฟังก์ชันการทดสอบพร้อมแนวคิดจากข้อเสนอแนะ--- --------
ขอบคุณสำหรับข้อเสนอแนะที่ได้รับแล้ว ฉันได้เขียนฟังก์ชันการทดสอบที่มีอยู่ในตัวเองต่อไปนี้ตามข้อมูลที่เป็นประโยชน์ที่ให้ไว้ - ฟังก์ชันนี้ไม่สามารถจับคู่กับพี่น้องที่ติดตามได้
ฟังก์ชันสร้างตัวแปร data
ที่มีลำดับการทดสอบ ฟังก์ชันที่ยืนอยู่จะส่งกลับลำดับว่าง ข้อกำหนดคือส่งคืน 14.050000
เพื่อระบุสเกลาร์ TIME
ซึ่งมีรายการ <FIELD>TRACK_STATUS</FIELD><MODE>VALID</MODE>
สี่รายการตามลำดับ ตามด้วยรายการ <FIELD>MULTI_CHAN_IND</FIELD><MODE>MULTI</MODE>
สี่รายการตามลำดับโดยตรง (เช่น ที่ TIME 14.050000
ในข้อมูลทดสอบ)
(ที่น่าสนใจคือสามารถส่งคืนลำดับของ doubles ได้สำเร็จหากใช้เฉพาะนิพจน์แรกเท่านั้น เช่น จับคู่ TRACK_STATUS/VALID ที่เกิดขึ้นทั้งหมด โดยไม่มีการระบุการจับคู่พี่น้องที่ตามมา)
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>
ของคุณไม่ใช่พี่น้องกัน (เป็นรายการที่แยกจากกันตามลำดับ) ดังนั้นfollowing-sibling::
จะไม่ทำงาน หากต้องการทำให้พวกเขาเป็นพี่น้องกัน ให้รวมพวกเขาไว้ในองค์ประกอบหลัก เช่น<root>
และลบเครื่องหมายจุลภาคระหว่างรายการเหล่านั้น - person LarsH   schedule 25.09.2012