Web Services, Part IX: Pattern-Based XML Node Selection: Pattern Specification (B) - Doc JavaScript
Web Services, Part IX: Pattern-Based XML Node Selection
Pattern Specification - Part B
The XPath patterns support the wild card (*), much the same way as it is supported by the Unix operating system. The pattern /sales/*/week does not match any nodes, because the week nodes are not exactly grandchildren of sales, as this pattern suggests. The week nodes are great-grandchildren of sales. The pattern /sales/*/*/week reflects the actual tree structure. It matches all 12 week nodes that are great-grandchildren of sales (try it):
var matchedNodes = xmlDoc.selectNodes('/sales/*/*/week'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern /sales//month/week matches all week records that are children of month records, anywhere under the sales node (try it):
var matchedNodes = xmlDoc.selectNodes('/sales//month/week'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern .//week matches all week nodes that are any number of levels below the current node (try it):
var matchedNodes = xmlDoc.selectNodes('.//week'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern */* matches all grandchildren of the current node. If the current context is the data node, its grandchildren will be all 12 week nodes and 3 name nodes (try it):
var matchedNodes = xmlDoc.childNodes[3]. childNodes[1].selectNodes('*/*'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern *[@dvds_rented] matches all nodes having the attribute dvds_rented. The context may change. The pattern /*[@dvds_rented] will match nodes only at the root. The pattern //*[@dvds_rented] will match nodes any level below the root (try it):
var matchedNodes = xmlDoc.selectNodes('//*[@dvds_rented]'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern @dvds_rented will match nodes at the current level. If the context is the first week of January, we should get a single week node (try it):
var matchedNodes = xmlDoc.childNodes[3].childNodes[1]. childNodes[0].childNodes[1].selectNodes('@dvds_rented'); alert("Number of matched nodes: " + matchedNodes.length);
Similar patterns are also possible. The pattern week/@dvds_rented will match 4 nodes when the context is the month of January (try it)
var matchedNodes = xmlDoc.childNodes[3].childNodes[1].childNodes[0]. selectNodes('week/@dvds_rented'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern week[2] matches the third week node of the current context. If the context is January we will match one node (try it):
var matchedNodes = xmlDoc.childNodes[3].childNodes[1].childNodes[0]. selectNodes('week[2]'); alert("Number of matched nodes: " + matchedNodes.length);
The pattern month[week][2] matches the third month node that has a week node (try it):
var matchedNodes = xmlDoc.childNodes[3].childNodes[1]. selectNodes('month[week][2]'); alert("Number of matched nodes: " + matchedNodes.length);
Next: A Final Word
Produced by Yehuda Shiran and Tomer Shiran
All Rights Reserved. Legal Notices.
Created: February 25, 2002
Revised: February 25, 2002
URL: http://www.webreference.com/js/column104/6.html


