As you know by now, patterns are used to address parts of XML documents much as paths in file systems are used to address folders and files. Patterns can be used to isolate specific nodes or groups of nodes and can be specified as absolute or relative. An absolute pattern spells out the exact location of a node or node set, whereas a relative pattern identifies a node or node set relative to a certain context. In the previous contacts.xsl
example, the pattern contacts/contact
is an absolute pattern, whereas the pattern name
is a relative pattern. The name
pattern is relative because it makes an assumption about the current context.
Patterns are used in several situations throughout XSLT, but the majority of the time you'll use them to set the select
and match
attributes of standard XSLT elements. The simplest pattern is the pattern that references the current node, which is a simple period (.
). Following is an example of how to use this pattern:
<xsl:value-of select="."/>
The current node pattern is obviously highly dependent upon the context of the document. A pattern that isn't dependent upon context is the root pattern, which is identified with a single forward slash (/
). The root pattern identifies the location of a document's root element no matter where it appears. To create an absolute pattern, you must begin with the root element and specify the exact hierarchy of nodes leading to a node or node set.
Other patterns are used to reference nodes that are above or below the current node. For example, a child node pattern is created by simply specifying the name of the node. A parent node, on the other hand, is created using two periods (..
). Following is an example of using a pattern to access a parent node:
<xsl:value-of select=".."/>
You can put patterns together to get more interesting results. For example, to address a sibling node, you must first go to the parent and then reference the sibling as a child. In other words, you use the parent pattern (..
) followed by a forward slash (/
) followed by the sibling node name, as in the following example:
<xsl:value-of select="../brother"/>
If you want to select all of the child nodes of a given node, you can use the double slash (//
) pattern, as in the following example:
<xsl:value-of select="//"/>
Lest you think patterns are limited to elements, you can easily address attributes by specifying the attribute name preceded by an at symbol (@
), as in the following example:
<xsl:value-of select="info/@ssnum"/>
This code assumes that the current node contains a child element named info
that has an attribute named ssnum
.