2009-10-25 20 views
5

Estoy construyendo un sitio web que usa hojas de estilo xsl, y estoy construyendo una pequeña biblioteca de funciones útiles en una hoja de estilo de utilidad que importan otras hojas conxsl: importación y xsl: incluir en hojas de estilo no funcionan en Google Chrome

<xsl:import href="util" /> 

en la parte superior de cada hoja. Esto no funciona en Google Chrome, ya que aún no es compatible con xsl: import. ¿Puede alguien escribirme una hoja de estilo que pueda ejecutar en el lado del servidor que leerá la línea xsl: import e importará la hoja de estilo relevante antes de que se envíe al cliente?

+0

No quiero analizar el xml del lado del servidor, quiero un documento xsl que se pueda aplicar a otros documentos xsl. De la documentación que he leído, estaría ejecutando algo que utiliza la función "documento()". –

Respuesta

5

Haría algo como lo siguiente, que combinará el lado del servidor de la hoja de estilos, antes de que llegue a Chrome. El primer paso está en su lugar porque xsl:import no es lo mismo que reemplazar todos los lugares con las hojas de estilo importadas.

  1. Reemplazar todo xsl:import con xsl:include (prioridad de importación no es aplicable a xsl:include, por lo que puede que tenga que cambiar su código y el uso de las prioridades en su lugar)
  2. Usar la hoja de estilo del lado del servidor abajo para fusionarlos en uno antes sirviendo
  3. Espere unas semanas (pueden ser meses). Creé una solución para Chrome y actualmente estoy trabajando con el equipo de desarrolladores para incluir la corrección en la compilación.
<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> 

Actualización: Sólo una nota: el error de Chrome aparece en Safari también.

+0

Gracias, justo lo que necesitaba. Es bueno saber acerca de la solución a largo plazo también! –

+0

De nada :) Informaré del error SO a StackOverflow (si elimino ese texto cursivo, todo el bloque de código desaparece ... impar). – Abel

+0

¿Hay alguna noticia sobre la solución para Chrome? – Mikl

1

intentar algo como esto en 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

que podría hacerlo en Python con los módulos libxml2 y libxslt ... no hacer todo el trabajo por usted, pero a partir de algo de esta manera:

import libxml2, libxslt 

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

Luego devuelva la información.

0

http://www.w3.org/TR/xslt#literal-result-element muestra cómo resolver el problema de duplicate-xsl-namespace al escribir una hoja de estilos XSL que transforma su hoja de estilos XSL existente en una hoja de estilos XSL con el <xsl:import> s expandido.

Tenga cuidado, sin embargo, acerca de la diferencia entre <xsl:import> y <xsl:include>.