540 likes | 559 Views
Learn about XSLT conditionals, numbering techniques, functions, and variables with examples and syntax in this educational outline. Understand how to structure elements and manipulate data effectively.
E N D
XSLT II Robin Burke ECT 360
Outline • Conditionals • Numbering • Functions and operators • Variables and parameters • Named and recursive templates
Conditional nodes • XSLT supports two kinds of conditional elements: • <xsl:if> • <xsl:choose> • If is only if-then (no else) • Choose is more general
Example • if • choose
Predicates • XPath expressions • test for a condition • result = set of nodes that fulfill that condition • Format • elementName[condition]
Example • from last week
Numbering • Issues • what is counted? • what is the format of the numbering? • how are numbers at different places in the tree related?
Numbering • Number nodes using: • <xsl:number> • position() • Using position(): • Nodes are numbered by position in result document • Can be used in conditional statements
Using <xsl:number> • Attributes: • from=pattern: pattern indicates where numbering should restart • format=pattern: pattern indicates number format • grouping-size, grouping-separator: indicate how digits are grouped and separator character
Number element • Nodes are numbered according to position in source document • More flexibility
Example • numbering with position • numbering with number element
Number element • Attributes:value=expression: any XPath expression that evaluates to a number (i.e. position())count=pattern: specifies which nodes to countlevel=type: tree level for nodes to count; can be any, single, or multiple
Numbering, cont’d • count attribute • indicates what is being counted • default = count elements of the same name • otherwise = specify an XPath pattern • all matching elements included
Numbering relationships • how does the number of one element depend on other elements? • Possibilities • only depends on immediate siblings • single • depends on “parent” • multiple • depends on “cousins” • any
Formatting • format • type • 1, a, A, i, I • other punctuation
Example • table of contents
Internal computations • Often performed using XPath • sort of like SQL • Can perform calculations of nodes selected by an XPath expression • XPath functions
Note • XSLT 2.0 has a lot more functions • dozens
Example • Calculating the average • Problem • redundant calculation
Variables • Not variable! • User-defined name that stores a particular value or object • Types: • number • text string • node set • boolean • result tree fragment
Using variables • Syntax: <xsl:variable name=“name” select=“value”/> • Example: <xsl:variable name=”Months” select=”12” /> • Names are case-sensitive • Value only set once upon declaration • Enclose text strings in single-quotes
Using variables, cont'd • Value can be XPath expression • Value can be XML fragment • Syntax: <xsl:variable name=”Logo”> <img src=”logo.gif” width=”300” height=”100” /> </xsl:variable>
Variable reference • Syntax: $variable-name • Example: $Months • Except • Referencing tree fragments: • Do not use $variable-name • Use <xsl:copy-of> to reference value
Global variables • Can be referenced from anywhere within the style sheet • Must be declared at the top level of the style sheet, as a direct child of the <xsl:stylesheet> element • Must have a unique variable name • Evaluated only once when stylesheet is invoked
Local variables • Referenced only within template • Can share name with other local or global variable • Reevaluated when template is used
Examples • average with variables
Number format • XPath function format-number • Syntax: format-number(value, format) • Example: format-number(56823.847, '#,##0.00') displays 56,823.85
Decimal format • XSL element for defining number formats • Named decimal format passed as argument to format-number
Example • average with format
Parameters • Similar to variables, but: • Value can be changed after it is declared • Can be set outside of scope • Syntax: <xsl:param name=“name” select=“value”/> • Example: <xsl:param name=”Filter” select=”'C103'” /> • To reference: $param-name
External parameters • Depends on XSLT processor • Some work by appending parameter value to url • Command line processors allow external parameter setting: • MSXML • Saxon
Template parameters • Local in scope • Created inside <xsl:template> element • Used to pass parameters to template
Idea • Called template • contains param definitions • Calling template • place <xsl:with-param> element in <xsl:apply-templates> element • or <xsl:call-template> element • Syntax: <xsl:with-param name=“name” select=“value”/> • No error if calling param name does not match template param name
Named template • Template not associated with node set • Collection of commands that are accessed from other templates in the style sheet • Syntax: <xsl:template name="name"> XSLT elements </xsl:template>
Calling named templates • Syntax: <xsl:call-template name=”name”> <xsl:with-param /> <xsl:with-param /> ... </xsl:call-template>
Example • average with named template
Functional programming • Functional programming language: • Relies on the evaluation of functions and expressions, not sequential execution of commands • Different from C family of languages • LISP, Scheme, ML
Templates as functions • A template supplies a result fragment • incorporated into the final document • think of this as substitution • function call replaced by result
Iteration • How to handle iteration with templates? • stars for ratings • Possibilities • convert numbers into node sets • weird since node sets are supposed to come from the document • recursive templates
Recursion • Recursion • base case • when do I stop? • recursive case • how do I bite off one piece • call template again with the rest
Example • Template: star(rating) • desired output: # stars = # in rating • Base case: • rating = 0 • output: nothing • Recursive case • rating > 0 • output: * plus result of star (rating-1)
Example, cont'd • star(3) • replaced by * star(2) • replaced by ** star(1) • replaced by *** star(0) • ***
Pseudocode • stars (n) • if n = 0 return '' • else • return '*' + stars(n-1)
Recursive pattern • Syntax with <xsl:if>: <xsl:template name=”template_name”> <xsl:param name=”param_name” select=”default_value” /> ... <xsl:if test=”stopping_condition”> ... <xsl:call-template name=”template_name”> <xsl:with-param name=”param_name” select=”new_value” /> </xsl:call-template> ... </xsl:if> </xsl:template>
Example • ratings with stars