Domanda

Sto costruendo un sito Web che utilizza fogli di stile xsl e sto creando una piccola libreria di funzioni utili in un foglio di stile util che altri fogli importano con

<xsl:import href="util" />

nella parte superiore di ogni foglio. Questo non funziona in Google Chrome, in quanto non supporta xsl: import ancora. Qualcuno può scrivermi un foglio di stile che posso eseguire sul lato server che leggerà la riga xsl: import e importa il foglio di stile pertinente prima che venga inviato al client?

È stato utile?

Soluzione

Farei qualcosa di simile al seguente, che unirà il lato server del foglio di stile, prima che arrivi a Chrome. Il primo passaggio è attivo perché xsl:import non è uguale alla sostituzione di tutti i luoghi con i fogli di stile importati.

  1. Sostituisci tutto xsl:include con <=> (la priorità di importazione non è applicabile a <=>, quindi potrebbe essere necessario modificare il codice e utilizzare invece le priorità)
  2. Utilizza il seguente foglio di stile sul lato server per unirli in uno prima di pubblicare
  3. Attendi qualche settimana (possono essere mesi). Ho creato una correzione per Chrome e attualmente sto lavorando con il team di sviluppatori per includerla nella 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>

Aggiornamento: solo una nota: il bug di Chrome appare anche in Safari.

Altri suggerimenti

Potresti farlo in Python con i moduli libxml2 e libxslt ... non per fare tutto il tuo lavoro per te, ma iniziando con qualcosa del genere:

import libxml2, libxslt

styledoc = libxml2.parseFile("page.xsl")
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("somefile.xml")
result = style.applyStylesheet(doc, None)

Quindi servi di nuovo la cosa.

Prova qualcosa del genere 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 );
?>

http://www.w3.org/TR/xslt#literal -result-element mostra come risolvere il problema duplicato-xsl-namespace quando si scrive un foglio di stile XSL che trasforma il foglio di stile XSL esistente in un foglio di stile XSL con <xsl:import> s espanso.

Fai attenzione, tuttavia, alla differenza tra <xsl:include> e <=>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top