When using the . or .. operator returns multiple children, you can use the .() (predicate) operator to further filter your results based on specific criteria. The .() operator works in a manner similar to the XPath [ ] operator, which constitutes what is known as a predicate of the path.
The following function examples, based on this xmlEmployees variable, return information about an employee based on a filtering value.
/* Declare an XML variable with a literal XML value. */ var xmlEmployees = <employees> <employee id="111111111"> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> </employee> <employee id="222222222"> <firstname>Sue</firstname> <lastname>Day</lastname> <age>32</age> </employee> </employees>; /* * Return the <employee> element for the employee whose last name * is "Day". * This code returns an XMLList type containing: * <employee id="222222222"> * <firstname>Sue</firstname> * <lastname>Day</lastname> * <age>32</age> * </employee> /* var empDay = xmlEmployees..employee.(lastname == "Day"); /* * Return the age of the employee whose id is "111111111". * This code returns an XMLList type containing "25". */ var empAge = xmlEmployees..employee.(thisXML.@id == "111111111").age;
When elements have names that conflict with ECMAScript keywords or function names, you can use the following syntax for filtering instead. Note that there are two different workarounds—one is for use with ECMAScript keywords and the other is for use with function names. Both require using the thisXML property.
/* * Return all of the <if> elements. * This avoids a conflict with the "if" ECMAScript keyword. */ var ifs = xmlData.product_description.(thisXML["if"] == "43-0t654-09"); /* * Return the first <parent> element. * This avoids a conflict with the parent function. */ var firstParent = xmlFamilies.kid.(thisXML.::parent == "Johnson");