Re: [xsl] xsl:import

Subject: Re: [xsl] xsl:import
From: Bill French <french@xxxxxxxxxxxxx>
Date: Fri, 04 Sep 2009 09:54:59 -0700
Thanks for your reply, Ken. So an importing stylesheet doesn't respect priorities assigned explicitly in imported stylesheets? I.e., if in stylesheet A.xsl, I have

<xsl:template match="ElemName">
  DO THIS
</xsl:template>

and in stylesheet B.xsl I have

<xsl:template match="node()" priority="-1">
  DO THAT
</xsl:template>

and then I run the stylesheet C.xsl which looks like

<xsl:import href="A.xsl"/>
<xsl:import href="B.xsl"/>

any element called elemName (and any other, for that matter, if we stick with just the XSL upstairs) is going to DO THAT instead of DOING THIS. This seems to be what David Carlisle was explaining in his post archived on David Pawson's XSLT FAQ: http://www.dpawson.co.uk/xsl/sect2/N4738.html#d6607e353

"I think that the reason for xsl:import's existence is that you should be able to take 10000000000 lines of Norm's docbook stylesheets, xsl:import them and then define a couple of your own templates for specific elements where you want your own processing. You can be sure that your templates will win, even if you have not fully digested the publicly available stylesheets that you were importing.

"If you had to know the priorities on the templates that you wanted to override, you'd have to understand the stylesheets well enough to work out which templates were being used, and with what priority, and then specify a higher one. (well actually it would be easier just to keep adding 0's to the end of the priority until you won:-)"


--Bill



G. Ken Holman wrote:
At 2009-09-03 15:42 -0700, Bill French wrote:
Hi all,

I'm using Saxon 9.1.0.7J for an application. I have stylesheets that import other stylesheet modules using syntax like this:

<xsl:import href="inc/framework.xsl"/>
<xsl:import href="inc/application-tabs.xsl"/>
<xsl:import href="inc/search-fields.xsl"/>
<xsl:include href="../../override/xslt/customization.xsl"/>

Here's the weird thing: If I change the code to

<xsl:import href="inc/application-tabs.xsl"/>
<xsl:import href="inc/framework.xsl"/>
<xsl:import href="inc/search-fields.xsl"/>
<xsl:include href="../../override/xslt/customization.xsl"/>

(note the change in order of the imports), the application-tabs.xsl simply stops being recognized. No warnings. It's as if the line containing the xsl:import instruction doesn't exist at all.

The transformation works as expected when using the built-in Saxon 8 processor in the Eclipse Oxygen plug-in.

Let me know if you'd like to see source code.

No, I'm guessing you have a match="*" or match="node()" in framework.xsl, or some match pattern that is catching the nodes you were expecting to catch in application-tabs.xsl. In the first list of imports the matches in framework.xsl have the lowest importance. In the second list of imports the matches in framework.xsl have a higher importance than all of the matches in application-tabs.xsl.


Recall that importance trumps priority. And latter imports have higher importance than earlier imports. If your earlier imports have higher priority matches, these will still be ignored due to the higher importance of matches declared in latter imports.

I hope this helps.

. . . . . . . . . . . . Ken


-- Interested in these classes? http://www.CraneSoftwrights.com/s/i/ Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video Video lesson: http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18 Video overview: http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18 G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Male Cancer Awareness Nov'07 http://www.CraneSoftwrights.com/s/bc Legal business disclaimers: http://www.CraneSoftwrights.com/legal

Current Thread