Reputation: 1658
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?
Upvotes: 5
Views: 2939
Reputation: 57169
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.
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)<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.
Upvotes: 5
Reputation: 37827
http://www.w3.org/TR/xslt#literal-result-element shows how to solve the duplicate-xsl-namespace issue when writing an XSL stylesheet which transforms your existing XSL stylesheet into an XSL stylesheet with the <xsl:import>
s expanded.
Be careful, though, about the difference between <xsl:import>
and <xsl:include>
.
Upvotes: 0
Reputation: 40072
You could do it in Python with the libxml2 and libxslt modules... not to do all your work for you, but starting with something like this:
import libxml2, libxslt
styledoc = libxml2.parseFile("page.xsl")
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("somefile.xml")
result = style.applyStylesheet(doc, None)
Then just serve the thing back out.
Upvotes: 2
Reputation: 20117
Try something like this in php:
<?php
$sXml = "<xml>";
$sXml .= "<testtag>hello tester</testtag>";
$sXml .= "</xml>";
# LOAD XML FILE
$XML = new DOMDocument();
$XML->loadXML( $sXml );
# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
#PRINT
print $xslt->transformToXML( $XML );
?>
Upvotes: 1