Programming Example: Adding Elements to the Results Display

Beginnings of a section describing User interface programming.

Following is an edited version of a support email describing how to make additional elements from a finding aid appear in the results display. As such it may give you the flavor of the programming techniques needed to modify the behavior of the middleware at a fairly low level. Reading through this example deliberately should guide you through all the steps needed for this, which is just a specific instance of the general way a search set and a result set get things added to them, how the result set gets that new thing filtered and added to the output XML and finally how the XSL is used to get that XML out to HTML.

When one clicks on one of the links in the left-hand "outline" on a "standard view", the middleware does an XPat search for the container, or other region (seen as the focusrgn parameter on the URL) that contains a particular byte offset (the link having been created by the middleware when it created the "standard view".

If you add a debug=xml to that URL, you should see something like:


Look at DLXSROOT/web/f/findaid/text.xml, which is the file used by the "standard" view. (Note that you can always see what files are in play by adding a debug=tpl to the URL.) In this file you should see the following snippet of XML:


It is the RESULTS_XML PI that is filled in with everything from DocContent onward. In this case, searches have been done by the middleware, at some point the EAD controlaccess region was searched for by the middleware and returned by XPat.

In text.xsl, which is used to transform the text.xml data, you will find:
          <xsl:when test="$FocusRegion = 'controlaccess'">
            <xsl:apply-templates select="controlaccess"/>
The template for controlaccess is in text.components.xsl. To add this to the "Search terms in context" view, we have to make sure that reslist.xml, which is what is used for that view (again debug=tpl will show that), has to have a PI that triggers a handler that eventually requests XPat to do a search for the controlaccess within the finding aid in question.

There is a RESULTS_XML PI in reslist.xml. So, what we have to do is make sure that, for a "search terms in context" view, (i.e., CGI params: view=reslist;subview=detail), the RESULTS_PI triggers not only the header and the hits "kwics" (aka keywords in context) and all the containers and other top level elements that include those kwics, but also the controlaccess element.

A useful technique is to run under the Perl debugger with the URL parameters and follow through the code. In this case, with view=reslist;subview=detail, takes us to DetailViewSearchesAndFilter_XML. From there to FindaidClass::SubmitItemKwicSearches. This leads us to DLXSROOT/lib/DLXSApp/FullTextApp::DetailViewSearches and this goes to FindaidClass::DoDetailResultsSearches. This in turn uses DLXSROOT/lib/DLXSClass/FullTextClass::AddSimpleSearches (or AddBooleanSearches). This adds "ScopingHeads", that is, the containers and such that contain the kwics.

Having gone through all that code, you can see how the kwics and their "ScopingHeads" are added to the search set. Finally, the search set is submitted (back up in FindaidClass::DoDetailResultsSearches) and the results are added to an XPatResultSet.

Later, the result set is filtered. As in all cases, the result set is an iterator and the results one by one are handed to the middleware, in occurrence order, so that a container head will come before any kwics within that container and so on.

So, you'll want to subclass (see this reference to writing DLXS subclasses) so that you can override of SubmitItemKwicSearches. In that method, you add a call to a routine that will add, to the search set called 'kwicresults', a search for the proper additional controlaccess region within your finding aid.

Then comes the filtering step. You will need to add an extra elsif block to the method ScopedDetailResultsFilter_XML in your subclass. You'll see that there are various if, elsif blocks that check for different labels (added at search time) so that the code knows how to package/filter the result for output to the XML file. Your new elsif will check for results with a label (such as "additionalcontrolaccess" or some such) and add the returned XML to the output results.

Then of course, you'll probably have to deal with some XSL to filter the new controlaccess region in a way that fits the output for this HTML page rather than the "focused region" type of "standard view" output for "subject terms/controlaccess."