Spring חלק 3: מבוא ל- XPath XML Path Language
2 מסמך דוגמא Addison-Wesley Serge Abiteboul Rick Hull Victor Vianu Foundations of Databases 1995 Freeman Jeffrey D. Ullman Principles of Database and Knowledge Base Systems 1998
Spring מסמך XML כעץ bib book publisherauthor.. Addison-WesleySerge Abiteboul צומת השורש צומת המסמך price=55
Spring ביטויי XPath – דוגמאות פשוטות /bib/book/year התוצאה: /bib/paper/year התוצאה: קבוצה ריקה של צמתים (אין אלמנטים בעלי שם paper)
Spring חיפוש צאצאים (סגור Kleene מוגבל) //author התוצאה: Serge Abiteboul Rick Hull Victor Vianu Jeffrey D. Ullman /bib//first-name התוצאה: Rick קבוצה של 4 צמתים
Spring בחירת צמתים שאינם אלמנטים text() מחזיר צמתים מסוג טקסט node() מחזיר כל צמת ללא חשיבות לסוגו הביטוי הבא /bib/book/author/text() מחזיר את שמות הסופרים ששמם נמצא בצומת טקסט אחד. Serge Abiteboul Victor Vianu Jeffrey D. Ullman הסופר Rick Hull אינו מופיע משום ששמו מופרד לשני אלמנטים, כלומר לאלמנט author לא קיים צומת בן מסוג טקסט.
Spring בחירת אלמנט כלשהו - wildcard //author/* התוצאה: Rick Hull ה-wildcard * במקרה זה בוחר כל צומת אלמנט ללא חשיבות לשמו.
Spring גישה לתכונות התוצאה: “55” מתייחס לתכונות מתייחס לתכונה מתייחס לתכונה כל שהיא
Spring בחירה לפי ביטויים בוליאניים /bib/book/author[first-name = “Rick”] התוצאה: Rick Hull הביטוי בתוך [ ] דורש כי שמו הפרטי של הסופר הוא Rick. שאלה: כתבו ביטוי המחזיר את כל הספרים מהמילניום הנוכחי? /bib/book[ year >= 2000] על מנת לבצע את השוואה, הערך הטקסטואלי של צומת year מומר לערך מספרי.
Spring בחירה לפי ביטויים בוליאניים = "Addison-Wesley"] המשמעות של […][…] היא ששני הביטויים הבוליאניים חייבים להתקיים. התוצאה ? הביטוי הנ"ל שקול ל- and publisher = "Addison-Wesley"]
Spring ביטויים בוליאניים קיומיים (existential) /bib/book/author[first-name][address[zip][city]]/last-name התוצאה: מוחזרים שמות משפחה (last-name) של סופרים בעלי שם פרטי המופיע בתוך צומת נפרד ובעלי כתובת הכוללת מיקוד (zip) ושם עיר (city). המשמעות של [first-name] היא הדרישה כי לכל צומת author יש לפחות צומת בן first-name אחד. שאלה: החזירו סופרים בעלי שם פרטי בלבד (ללא שם משפחה). /bib/book/author[first-name][not(last-name)]
Spring פונקציות /bib/book[2] שקול ל- /bib/book[position() = 2] פונקציה position() מחזירה את המספר הסידורי של צומת ההקשר בקבוצת הייחוס שלו. //author[last()] פונקציה last() מחזירה את מיקום הצומת האחרון בקבוצת הייחוס. האם שני הביטויים הבאים שקולים? //author[1][2] //author[2][1]
Spring פונקציות - המשך /bib//*[name()=”book”] שקול ל- /bib//book name() הינה פונקציה המחזירה את שם הצומת. /bib/book[count(author)>1] count() מחזירה את מספר הצמתים בקבוצת הקלט. id(“a ”) id() מחזירה את הצמתים בעלי תכונות ID כפי שנתון ע"י הקלט.
Spring XPath – כיווני ניווט (צירים – axes) ניתן לנוע על פני 13 הכיוונים הבאים: ancestor:: - מכיל אבות קדמונים של צומת ההקשר ancestor-or-self:: - מכיל אבות קדמונים של צומת ההקשר ואת הצומת עצמו attribute:: - מכיל אטריביוטים (תכונות) של צומת ההקשר child:: - מכיל בנים של צומת ההקשר descendant:: - מכיל צאצאים של צומת ההקשר descendant-or-self:: - מכיל צאצאים של צומת ההקשר ואת הצומת עצמו following:: - מכיל צמתים המופיעים אחרי צומת ההקשר במסמך למעט צמתים צאצאים
Spring כיווני ניווט - המשך following-sibling:: - מכיל אחים של צומת ההקשר המופיעים אחריו במסמך namespace:: - מכיל צמתים מסוג namespace של צומת ההקשר parent:: - מכיל את צומת האב (אם קיים) של צומת ההקשר preceding:: - מכיל צמתים המופיעים לפני צומת ההקשר במסמך למעט צמתים שהם אבות קדמונים preceding-sibling:: - מכיל אחים של צומת ההקשר המופיעים לפניו במסמך self:: - מכיל את צומת ההקשר עצמו
Spring קיצורים כתיב מקוצרכתיב מלא ברירת ///descendant-or-self::node()/ [number][position() = number]
Spring קיצורים- דוגמאות כתיב מקוצרכתיב מלא /bib/book/child::bib/child::book attribute::price /.//title (equivalent to //title) /self::node()/descendant-or- self::node()/child::title //author/../descendant-or-self::node()/ child::author/parent::node()
Spring דוגמאות //author/descendant-or-self::node()/child::zip ⇔ //author//zip ⇔ //author/descendant::zip מה מחזירים הביטויים הבאים? //book/publisher/parent::*/author //book[author[position()<last()]] //book[count(author[1]) = count(author[1] | author[last()] ) ] שני הביטויים עלולים להחזיר תוצאות שונות אם מוסיפים בסוף בחירת מיקום
Spring דוגמאות - המשך מהם הספרים ששנת ההוצאה שלהם היא המאוחרת ביותר? //book[ not(year < //book/year) ] מי הם המחברים אשר כתבו יותר מספר אחד? יש להחזיר כל מחבר כזה פעם אחת בדיוק. /bib/book/author[.=../following-sibling::*/author and not(.=../preceding-sibling::*/author)]