The document Function and Sorting
7.4.2 Implementing Lookup Tables
We mentioned earlier that calling the document function with an empty string enabled us to access the nodes in the stylesheet itself. We can use this behavior to implement a lookup table. As an example, well create a lookup table that replaces an abbreviation such as ME with Maine . We can then use the value from the lookup table as the sort key. More attentive readers might have noticed in our previous example that although the abbreviation MA does indeed sort before the abbreviation ME , a sorted list of the state names themselves would put Maine abbreviation ME before Massachusetts abbreviation MA . First, well create our lookup table. Well use the fact that a stylesheet can have any element as a top-level element, provided that element is namespace-qualified to distinguish it from the xsl: namespace reserved for stylesheets. Heres the namespace prefix definition and part of the lookup table that uses it: ?xml version=1.0? xsl:stylesheet version=1.0 xmlns:xsl=http:www.w3.org1999XSLTransform xmlns:states=http:new.usps.comcgi-binuspsbvscriptscontent.jsp?D=10090 states:name abbrev=ALAlabamastates:name states:name abbrev=ALAlabamastates:name states:name abbrev=AKAlaskastates:name states:name abbrev=ASAmerican Samoastates:name -- Most state abbreviations removed to keep this listing brief... -- states:name abbrev=MEMainestates:name states:name abbrev=MHMarshall Islandsstates:name states:name abbrev=MDMarylandstates:name states:name abbrev=MAMassachusettsstates:name The namespace mapped to the states prefix is the URL for the official list of state abbreviations from the United States Postal Service. To look up values in our table, well use the document function to return the root node of our stylesheet, then well look for a states:name element with a abbrev attribute that matches the value of the current state element in the purchase order were currently processing. Heres the somewhat convoluted syntax that performs this magic: body h3Selected Purchase Orders - iSorted by stateih3 xsl:for-each select=documentreportpofilenamepurchase-ordercustomeraddressstate xsl:sort select=documentstates:name[abbrev=current] xsl:apply-templates select=ancestor::purchase-order xsl:for-each body Notice that we use the document function twice; once to open the document referred to by the filename element, and once to open the stylesheet itself. We also need to discuss the XPath expression in the select attribute of the xsl:sort element. There are four significant parts to this expression: document Returns the root node of the current stylesheet. page 128 Indicates that what follows must be a top-level element of the stylesheet. This syntax starts at the root of the document, then has a single element. The elements name can be anything. For our current stylesheet, we could have written the XPath expression like this: select=documentxsl:stylesheetstates:name[abbrev=current] Because the root element of a stylesheet can be either xsl:stylesheet or xsl:transform , its better to use the asterisk. states:name Indicates a name element combined with a namespace prefix that maps to http:new.usps.comcgi-binuspsbvscriptscontent.jsp?D=10090 . If we were referencing elements in another document, the prefix wouldnt have to be states ; it could be anything, as long as it mapped to the same string. [abbrev=current] Means that the abbrev attribute of the current states:name element has the same value as the current node. We have to use the XSLT current function here because we want the current node, not the context node. Inside the predicate expression, the current node is the state element we process, while the context node is the states:name element that contains the abbrev attribute we evaluate. Figure 7-3 shows the output from the stylesheet with a lookup table. Figure 7-3. Document generated with a lookup tableParts
» O'Reilly-XSLT-Mastering.XML.Transformati... 2264KB Mar 29 2010 05:03:43 AM
» An XML document must be contained in a single element
» XML declarations Document Type Definitions DTDs and XML Schemas
» Well-formed versus valid documents
» Tags versus elements XML Document Rules
» Namespaces XML Document Rules
» The Extensible Stylesheet Language XSL
» Document Object Model DOM Level 1
» Document Object Model DOM Level 2
» Namespaces in XML XML Standards
» Associating stylesheets with XML documents
» Installing Xalan Getting Started
» Our Sample Document A Sample Stylesheet
» Transforming the XML Document
» Stylesheet Results Transforming Hello World
» Parsing the Stylesheet How a Stylesheet Is Processed
» Parsing the Transformee How a Stylesheet Is Processed
» Lather, Rinse, Repeat How a Stylesheet Is Processed
» The xsl:template for greeting Elements
» Built-in template rule for element and root nodes
» Built-in template rule for modes
» Built-in template rule for text and attribute nodes
» Top-Level Elements Stylesheet Structure
» Other Approaches Stylesheet Structure
» The Hello World Java Program
» Goals of This Chapter Summary
» The Root Node The XPath Data Model
» Element Nodes The XPath Data Model
» Attribute Nodes The XPath Data Model
» Text Nodes The XPath Data Model
» Comment Nodes The XPath Data Model
» Processing Instruction Nodes The XPath Data Model
» Namespace Nodes The XPath Data Model
» Simple Location Paths Location Paths
» Relative and Absolute Expressions
» Selecting attributes Selecting Things Besides Elements with Location Paths
» Selecting the text of an element
» Selecting comments, processing instructions, and namespace nodes
» Using Wildcards Location Paths
» Numbers in predicates Predicates
» Functions in predicates Predicates
» Attribute Value Templates XPath Datatypes
» Output View The XPath View of an XML Document
» The Stylesheet The XPath View of an XML Document
» Summary XPath: A Syntax for Describing Needles and Haystacks
» Converting to boolean values
» Boolean examples The xsl:if Element
» xsl:for-each example The xsl:for-each Element
» How It Works Invoking Templates by Name
» Templates à la Mode Invoking Templates by Name
» Defining a Parameter in a Template
» Microsofts XSLT tools Global Parameters
» Setting global parameters in a Java program
» Are These Things Really Variables?
» Procedural design Implementing a String Replace Function
» Recursive design Implementing a String Replace Function
» Template Design Implementation A Stylesheet That Emulates a for Loop
» The Complete Example A Stylesheet That Emulates a for Loop
» XML Input A Stylesheet That Generates a Stylesheet That Emulates a for Loop
» Template Design A Stylesheet That Generates a Stylesheet That Emulates a for Loop
» Complications A Stylesheet That Generates a Stylesheet That Emulates a for Loop
» Summary Branching and Control Elements
» The ID, IDREF, and IDREFs Datatypes
» An XML Document in Need of Links
» A Stylesheet That Uses the id Function
» Limitations of IDs Generating Links with the id Function
» Defining a key Generating Links with the key Function
» A Slightly More Complicated XML Document in Need of Links
» The key function and the IDREFS datatype
» Solution 1: Replace the IDREFS datatype
» Solution 2: Use the XPath contains function
» Solution 3: Use recursion to process the IDREFS datatype
» Solution 4: Use an extension function
» Advantages of the key Function
» An Unstructured XML Document in Need of Links
» The generate-id Function Generating Links in Unstructured Documents
» Summary Creating Links and Cross-References
» Our First Example Sorting Data with xsl:sort
» Whats the deal with that syntax?
» Attributes The Details on the xsl:sort Element
» Another Example Sorting Data with xsl:sort
» Our First Attempt Grouping Nodes
» A Brute-Force Approach Grouping with xsl:variable
» Summary Sorting and Grouping Elements
» Recursive design An Aside: Doing Math with Recursion
» Generating output to initialize a variable
» Overview Invoking the document Function
» The document Function and Sorting
» Implementing Lookup Tables More Sophisticated Techniques
» Grouping Across Multiple Documents
» Summary Combining XML Documents
» Example: Generating multiple output files
» Example: Using extension functions from multiple processors
» Example: A library of trigonometric functions
» Example: Writing extensions in other languages
» Fallback Processing Extension Elements, Extension Functions, and Fallback Processing
» Extending the Saxon Processor
» Generating JPEG Files from XML Content
» About the Toot-O-Matic Case Study: The Toot-O-Matic
» Make It Easier to Create Tutorials
» Individual Panels Tutorial Layout
» Email Panel Zip File PDF Files
» Individual Panels XML Document Design
» Stylesheets and Modes XSLT Source Code
» Initializing Global Variables XSLT Source Code
» Generating the Main Menu Panel
» Generating the Section Indexes
» Generating the Individual Panels
Show more