Name: Jeffry Hartono Class/Project: CSCIE-259/Project2 Due Date: November 15, 2007 Address: 5029 Sheboygan Ave #115, Madison WI 53705 1A. /students/student/name/last/text()[substring(., 1, 1) = 'B']/../../.. 1B. /students/student[substring(name/last, 1, 1) = 'B' and GPA >= 3.7] 2A. 2 nodes (students, student[@id = 55]) 2B. 5 nodes (student[@id = 1], student[@id = 1]/name, student[@id = 1]/name/first, student[@id = 1]/name/last, student[@id = 1]/GPA) 2C. /preceding::*[4] or /preceding::*[position() = 4] 2D. following::* --> 1 node (student[@id = 55]/GPA) following::node() --> 5 nodes (text() - between the closing tag of name element and the open tag of GPA element, student[@id = 55]/GPA, student[@id = 55]/GPA/text() - 3.8, text() - between the closing tag of GPA element and the closing tag of student[@id = 55] element, text() - between the the closing tag of student[@id = 55] element and students element). The fundamental difference between the two expressions is that node() will match/return any kind of node [text node, comment node, processing-instruction node, element/regular node]; while * will only match/return element/regular node only. 2E. /students//name[last = 'Bond']/../@id