xsl: import et xsl: include dans les feuilles de style ne fonctionnent pas sur Google Chrome

StackOverflow https://stackoverflow.com/questions/1620589

  •  06-07-2019
  •  | 
  •  

Question

Je construis un site Web qui utilise des feuilles de style xsl et une petite bibliothèque de fonctions utiles dans une feuille de style util que d'autres feuilles importent avec

<xsl:import href="util" />

en haut de chaque feuille. Cela ne fonctionne pas dans Google Chrome, car il ne supporte pas encore xsl: import. Quelqu'un peut-il m'écrire, s'il vous plaît, une feuille de style que je peux exécuter côté serveur et qui lira la ligne xsl: import et importera la feuille de style correspondante avant son envoi au client?

Était-ce utile?

La solution

Je ferais quelque chose comme ce qui suit, qui combinera la feuille de style par les serveurs, avant que cela arrive à Chrome. La première étape est en place car xsl:import n’est pas la même chose que de remplacer tous les espaces par les feuilles de style importées.

  1. Remplacez tous les xsl:include par <=> (la priorité d'importation ne s'applique pas à <=>. Par conséquent, vous devrez peut-être modifier votre code et utiliser les priorités à la place)
  2. Utilisez la feuille de style côté serveur ci-dessous pour les fusionner en une avant de servir
  3. Attendez quelques semaines (cela peut prendre des mois). J'ai créé un correctif pour Chrome et je travaille actuellement avec l'équipe de développeurs pour l'inclure dans la construction.
<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>

Mise à jour : remarque: le bogue de Google Chrome apparaît également dans Safari.

Autres conseils

Vous pouvez le faire en Python avec les modules libxml2 et libxslt ... pour ne pas faire tout votre travail à votre place, mais à partir de quelque chose comme ceci:

import libxml2, libxslt

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

Ensuite, servez simplement la chose.

Essayez quelque chose comme ça 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 montre comment résoudre le problème de duplicate-xsl-namespace lors de l'écriture d'une feuille de style XSL transformant votre feuille de style XSL existante en une feuille de style XSL avec les <xsl:import> s développées.

Attention toutefois à la différence entre <xsl:include> et <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top