2009-10-25 4 views
5

Sto costruendo un sito Web che utilizza i fogli di stile xsl e sto creando una piccola libreria di funzioni utili in un foglio di stile utile importato da altri fogli conxsl: import e xsl: includi nei fogli di stile non funzionano su Google Chrome

<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 importare il foglio di stile rilevante prima che sia inviato al client?

+0

Non voglio analizzare l'xml sul lato server, voglio un documento xsl che può essere applicato ad altri documenti xsl. Dalla documentazione che ho letto, vorrei esporre qualcosa che utilizza la funzione "document()". –

risposta

5

Farei qualcosa di simile a quanto segue, che unirà il foglio di stile del server, prima che arrivi a Chrome. Il primo passaggio è attivo perché xsl:import non è uguale a sostituire tutti i posti con i fogli di stile importati.

  1. sostituire tutte le xsl:import con xsl:include (priorità di importazione non è applicabile alle xsl:include, quindi potrebbe essere necessario modificare le priorità codice e utilizzare invece)
  2. Usa il foglio di stile sul lato server sottostante per fonderli in uno prima che serve
  3. Aspetta un paio di settimane (possono essere mesi). Ho creato una correzione per Chrome e sto attualmente lavorando con il team degli sviluppatori per includere la correzione 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> 

Update: Solo una nota: il bug Chrome appare in Safari troppo.

+0

Grazie, proprio quello di cui avevo bisogno. Piacere di conoscere anche la soluzione a lungo termine! –

+0

Prego :) Segnalerò il SO bug a StackOverflow (se rimuovo quel testo in corsivo, l'intero blocco di codice scompare ... strano). – Abel

+0

Esistono notizie sulla correzione per Chrome? – Mikl

1

provare qualcosa di simile 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); 
?> 

2

si potesse fare in Python con i moduli libxml2 e libxslt ... di non fare tutto il vostro lavoro per voi, ma a partire con qualcosa In questo modo:

import libxml2, libxslt 

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

Quindi basta servire di nuovo la cosa.

0

http://www.w3.org/TR/xslt#literal-result-element mostra come risolvere il problema dello spazio dei nomi duplicato-xsl durante la scrittura di un foglio di stile XSL che trasforma il foglio di stile XSL esistente in un foglio di stile XSL con il numero <xsl:import> espanso.

Fare attenzione, tuttavia, sulla differenza tra <xsl:import> e <xsl:include>.