Pregunta

Estoy creando un sitio web que utiliza hojas de estilo xsl y estoy creando una pequeña biblioteca de funciones útiles en una hoja de estilo util con la que otras hojas importan.

<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.¿Alguien puede escribirme una hoja de estilo que pueda ejecutar en el lado del servidor y que lea la línea xsl:import e importe la hoja de estilo relevante antes de enviarla al cliente?

¿Fue útil?

Solución

Haría algo como lo siguiente, que combinará el lado del servidor de la hoja de estilo, 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. Reemplace todo xsl:include con <=> (la prioridad de importación no es aplicable a <=>, por lo que es posible que deba cambiar su código y usar prioridades en su lugar)
  2. Use la hoja de estilo del lado del servidor a continuación para combinarlos en uno antes de servir
  3. Espere unas pocas semanas (pueden ser meses). He creado una solución para Chrome y actualmente estoy trabajando con el equipo de desarrolladores para incluir la solució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: Solo una nota: el error de Chrome también aparece en Safari.

Otros consejos

Podría hacerlo en Python con los módulos libxml2 y libxslt ... no para hacer todo su trabajo por usted, sino comenzando con algo como esto:

import libxml2, libxslt

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

Luego, simplemente devuelve la cosa.

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

http://www.w3.org/TR/xslt#literal-result-element muestra cómo resolver el problema del espacio de nombres xsl duplicado al escribir una hoja de estilo XSL que transforma su hoja de estilo XSL existente en una hoja de estilo XSL con el <xsl:import>s ampliado.

Sin embargo, tenga cuidado con la diferencia entre <xsl:import> y <xsl:include>.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top