Preface
Acknowledgments
Introduction
PartIBuilding Utility Templates
Chapter 1 Manipulating Numbers
Formatting Numbers as Strings
Formatting Decimal Numbers
Formatting Integers
Turning Numbers into Ordinals
Spelling Out Numbers
Changing the Base of Numbers
Converting from Hexadecimal to Decimal
Converting from Decimal to Hexadecimal
Summary
Chapter 2 Reformatting Strings and Text
Adding Padding
Padding Numerical Strings
Padding Strings with Characters
Padding Strings with Elements
Splitting Strings into Elements
Dividing a Poem into Lines
Tokenizing a String
Wrapping Lines
Gradual Tokenization
Searching and Replacing
Searching and Replacing Characters
Searching and Replacing Strings
Summary
Chapter 3 Turning XML into Text
Turning XML Lists into String Lists
Creating a Tree
Serializing XML
Creating XML Strings
Disabling Output Escaping
Creating Conditional Strings
Decoding Enumerated Values
Conditions with Computed Values
Summary
Chapter 4 Analyzing Data in XML
Getting Totals
Summing by Adding Subtotals
Summing by Building an Intermediate Node Set
Summing with a Recursive Template
Counting Items
Counting Character-Separated Items
Counting Word-Separated Items
Calculating Averages
Calculating the Median
Calculating the Mode
Finding Minima and Maxima
Finding Minima and Maxima with an Expression
Finding Minima and Maxima by Sorting and Picking
Finding Minima and Maxima by Recursion
Summary
PartIIPerforming Your Transformation
Chapter 5 Filtering XML
Filtering Principles
Basic Templates
Filtering Sections
Filtering Namespaces
Filtering Languages
Multiple Filters
Multiple Transformations in a Single Stylesheet
Multiple Transformations Through the Command Line
Multiple Transformations with Cocoon
Multiple Transformations with MSXML
Summary
Chapter 6 Translating Between Similar Structures
Translating Element and Attribute Names
Changing the Case of Names
Defining Translations with XML
Changing Names Conditionally
Changing Element Substructures
Adding Attributes
Adding Styling Information
Style in HTML
Style with XSL-FO
Debugging Translations
Summary
Chapter 7 Sorting
Sorting on Calculated Values
Calculating Sort Values with Expressions
Calculating Sort Values with Intermediate XML
Sorting by Date
Sorting Dates with Fixed Formats
Sorting Dates with Flexible Formats
Sorting with Named or Abbreviated Months
Sorting Dynamically
Selecting the value to sort by
Picking the data type for the sort
Doing Multiple Sorts
Sorting with Separate Parameters
Sorting with a String
Sorting with XML
Summary
Chapter 8 Numbering
Numbering Simple Lists
Numbering Simple Lists with xsl:number
Changing the Format of the Number
Starting the Count at a Different Number
Making Numbering more Efficient
Using an Ancestor's Number
Numbering Figures Across a Document
Numbering Subsections
Numbering Nested Subsections
Numbering Un-nested Subsections
Numbering Sorted and Grouped Items
Summary
Chapter 9 Grouping
General Grouping Methods
Flat Grouping Method
Recursive Grouping Method
Hierarchical Grouping Method
Grouping by Position
Paging Dynamically
Creating Batches of Pages
Grouping by Value
Adding Headers to Sorted Records
Adding Wrappers to Sorted Records
Grouping Unsorted Records by Value
Multi-level Grouping
Grouping in Hierarchies
Nesting Class Structures
Adding Structure to Documents
Summary
Chapter 10 Creating Summaries
Processing the Same XML Twice
Using Modes
Using Parameters
Generating Different Output Dynamically
Creating Links
Creating Local Links
Linking in Frames
Creating Indexes
Identifying Index Items
Working Through the Alphabet
Summary
PartIIIBuilding Your XSLT Application
Chapter 11 Separating Data from Presentation
Reusing XML Snippets
Using External References
Copying Documents
Generating External References
Using Page Templates
Creating Simplified Stylesheets
Using External References in a Template Page
Using Insertion Instructions in a Template Page
Supporting Customization and Internationalization
Encoding Customization
Customizing Document Style
Customizing Document Structure
Localizing Text
Summary
Chapter 12 Creating Functional Modules
Distinguishing Between Threads
Isolating Reusable Code
Named Templates versus Moded Templates
Limitations of Templates
Designing Templates for Reuse
Reusing Attribute Definitions
Using Attribute Sets in Context
Determining Attribute Names
Adding Attributes Conditionally
Overriding Attributes from Attribute Sets
Using Attribute Sets Programmatically
Summary
Chapter 13 Using Multiple Stylesheets
Splitting Up a Stylesheet into Multiple Files
Polishing Included Stylesheets
Positioning xsl:includes in the Main Stylesheet
Building Inclusion Hierarchies
Using XML Entities
Using XInclude
Using Utility Stylesheets
Overriding Constructs from Utility Stylesheets
Applying Imported Templates
Avoiding Dangerous Overrides
Designing Utility Stylesheets
Making Self-Sufficient Stylesheets
Adding a Namespace for the Utility
Testing User-Supplied Values
Improving Portability Across Processors
Combining Stylesheets
Identifying Common Code
Eliminating Conflicts
Creating High-Level Templates
Summary
Chapter 14 Client-Side Processing with MSXML
Scripting XSLT Processing
Creating DOMs
Manipulating DOMs
Creating XSLT Processors
Passing Parameters
Transforming XML
Using the Output
Dynamic Applications
Changing Parameters
Choosing the Data to View
Choosing the Stylesheet to Use
Creating Frames
Creating Graphics with SVG
Summary
Chapter 15 Server-Side Processing with Cocoon
Processing XML with Cocoon
Formatting Output
Generating PDF
Passing Parameters
Dynamic Applications
Changing Parameters
Choosing the Data to View
Indicating Which Stylesheet to Use
Creating Frames
Creating Graphics with SVG
Summary
PartIVFinalizing Your Stylesheet
Chapter 16 Controlling Output
Adding DTD Information
Referring to External DTDs
Building Internal DTDs
Managing Whitespace
Managing Source Whitespace
Managing Stylesheet Whitespace
Using Entities and CDATA Sections
Using Entities in the Stylesheet
Outputting Character and Entity References
Outputting CDATA Sections
Managing Namespace Declarations
Namespace Nodes
Namespaces in the Stylesheet
Summary
Chapter 17 Enhancing XSLT
Rationalizing XPath
Using Short Axes
Reducing the Number of Steps
Traversing Each Axis Only Once
Testing Only What Needs to Be Tested
Using Numeric Predicates
Using Implicit and Explicit Conversions
Using Keys
Testing Node Names
Testing Node Namespaces
Rationalizing XSLT
Using Push or Pull Processing
Setting Variables to Primitive Values
Using Literal Result Elements
Removing xsl:text Elements
Avoiding xsl:number
Summary
PartVUsing Extensions
Chapter 18 Using Extension Functions
Using Extension Functions
Testing Function Availability
Testing the Availability of Multiple Extensions
Recovering from Unavailable Functions
Converting Result Tree Fragments to Node Sets
Extension Functions
EXSLT Extension Functions
MSXML Extension Functions
Saxon Extension Functions
Xalan Extension Functions
Summary
Chapter 19 Using Extension Elements
Using Extensions to XSLT
Checking Extension Availability
Testing the Availability of Extension Elements
Testing the Availability of Other Extensions
Recovering from Unavailable Extension Elements
Creating Multiple Output Files
Creating Frames
Processing Multiple Files to Create Multiple Outputs
Extensions in Different Processors
Extension Elements in Saxon
Grouping in Saxon
Using a Procedural Style
Creating Internal DTDs
Summary
Chapter 20 Extending XPath Yourself
Defining Functions in Other Programming Languages
Defining Extension Functions in XSLT 1.1
Defining Extension Functions in MSXML
Defining Extension Functions in Xalan
Reusing Existing Java Methods
Defining Functions with XSLT
Summary
Appendix A:XPath Quick Reference
Appendix B: XSLT Quick Reference
Index
Book Registration Information
Jeni Tennison, a leading XSLT specialist and a regular and verbose contributor to XSL-List (http://www.mulberrytech.com/xsl/xsl-list), is one of the maintainers of the EXSLT initiative (http://www.exslt.org) and the implementer of XSLTDoc, an XSLT-based application for browsing XSLT applications (http://www.
jenitennison.com/xslt/utilities).
Jeni has a knowledge-engineering background and is currently working as a freelance XML and XSLT consultant. She teaches courses on various XML-related topics, including XSLT, and has worked on several real-world XML and XSLT
projects.
Jeni lives with her partner, two cats, and a vast Lego collection in Nottingham, England.