xsl:import and xsl:include in stylesheets don't work on Google Chrome

google-chrome, xslt

Solution

I'd do something like the following, which will combine the stylesheet serverside, before it gets to Chrome. The first step is in place because `xsl:import` is not the same as replacing all places with the imported stylesheets.

- Replace all `xsl:import` with `xsl:include` (import priority isn't applicable to `xsl:include`, so you may need to change your code and use priorities instead)

- Use the server-side stylesheet below to merge them into one before serving

- Wait a few weeks (can be months). I've created a fix for Chrome and am currently working with the developers team to include the fix into the build.

<xsl:template match="node()">
    <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="xsl:include">
   <!-- you'll probably want to be a bit more restrictive here -->
   <xsl:copy-of select="document(@href)/xsl:stylesheet/*" />
</xsl:template>

Update: Just a note: the Chrome bug appears in Safari too.

Problem

I'm building a website that uses xsl stylesheets, and I'm building up a small library of useful functions in a util stylesheet that other sheets import with ``` <xsl:import href="util" /> ``` at the top of every sheet. This doesn't work in Google Chrome, as it doesn't support xsl:import yet. Can someone please write me a stylesheet that I can run on the server side that will read the xsl:import line and import the relevant stylesheet before its sent to the client?

Original source