xsl:import and xsl:include in stylesheets don'

2020-07-14 05:44发布

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?

4条回答
家丑人穷心不美
2楼-- · 2020-07-14 05:56

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>.

查看更多
狗以群分
3楼-- · 2020-07-14 06:09

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 );
?>

查看更多
倾城 Initia
4楼-- · 2020-07-14 06:10

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.

  1. 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)
  2. Use the server-side stylesheet below to merge them into one before serving
  3. 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.

查看更多
贪生不怕死
5楼-- · 2020-07-14 06:15

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.

查看更多
登录 后发表回答