I’m working through my first XSL transformation using the apply-templates element. When developing XSLT, what is the best practice? Should I be very specific in the select of the apply-templates or in the match of the template or something I haven’t considered?
Example A
<xsl:template match="/">
<xsl:apply-templates select="A/B/C/D"/>
<xsl:apply-templates select="J/K/L/M"/>
<xsl:apply-templates select="W/X/Y/Z"/>
</xsl:template>
<xsl:template match="Q"/>
or
Example B
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>
It’s hard to say which is better as the two suggested fragments do very different things so it depends what the intended result is.
is a syntax error it should be
Or probably more efficiently (but not equivalent in general)
So once the error is fixed, sample
Bwill do a walk over the tree in depth first order applying the default template to every node so in particular copying all text to the output until it gets toQelement nodes where it will prune the traversal and not copyQor its descendants to the result tree.Sample A in complete contrast does not traverse the tree in depth first document order at all, and first processes
A/B/C/Dnodes, in particular it does not process any other children ofAorBorCat this stage so any text node descendants of those children are not copied to the output. Then it will start a depth first traversal starting at D, pruningQas before. The process then starts again withJ/K/L/M"so any output fromMwill be output after the output fromDeven ifMoccurs earlier in the source. This is in contrast to sampleBwhere the result order reflects the order in the input.It’s probably an artefact of the minimal example but if the input is a well formed document only one of the three apply templates in sample A can produce any result as
/can only have a single element child child so at least two ofAJWmust select nothing.