Question

J'ai une feuille de style XSLT 1.0 (2.0 n'est pas une option) qui produit XHTML. Selon un paramètre, il peut produire un fichier XHTML complet. document valide ou simplement un extrait de < div > ... < / div > destiné à inclusion dans une page Web.

Mon problème est de produire différentes déclarations XML dans ces deux cas. Pour la page autonome, il me faut:

<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

Et pour le < div > :

<xsl:output omit-xml-declaration="yes"/>

Mais < xsl: output > ne peut pas être inclus dans un < xsl: if > . Il ne peut s'agir que de l'enfant direct de < xsl: stylesheet > .

La seule solution que je vois est de créer une feuille de style avec la plupart des modèles, puis deux petits " wrappers " avec le droit < xsl: output > et qui va < xsl: importer > la feuille de style principale.

Je cherchais une meilleure idée, mais apparemment, il n'y en a pas. Suivant les conseils d’Andrew Hare et de jelovirt, j’ai écrit deux "pilotes", deux feuilles de style simples, qui appellent le < xsl: output > approprié, puis la feuille de style principale. Voici l'un de ces pilotes, celui du HTML autonome:

<?xml version="1.0" encoding="us-ascii"?>
<!-- This file is intended to be used as the main stylesheet, it creates a 
 standalone Web page. 
-->
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

  <xsl:import href="traceroute2html.xsl"/>

  <xsl:param name="standalone" select="'true'"/>

  <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

</xsl:stylesheet>
Était-ce utile?

La solution

On dirait que vous avez besoin de deux feuilles de style différentes. Si possible, créez deux feuilles de style distinctes et appelez dynamiquement celle dont vous avez besoin à partir de code.

Autres conseils

Une autre option, que j'ai récemment eu à employer, est la suivante:

  1. Omettre la déclaration XML dans tous les cas.
  2. Sous certaines conditions, affichez la déclaration en tant que texte non échappé .

Cela ne fonctionne que dans XSLT 1.0 et 2.0 si vous exportez dans un fichier. Cela ne fonctionnera pas si vous devez traiter la sortie au format XML dans la même passe, par exemple lors du stockage dans une variable.

(Notez que les fonctions d'extension XSLT 2.0 peuvent permettre de prendre cette sortie et de la traiter en une seule fois comme XML, et XSLT 3.0 intègre une fonction permettant d'analyser une chaîne d'entrée au format XML.)

Exemple d'extrait de code:

<!-- Omit the XML declaration as the base case:
    we can conditionally output a declaration 
    as text, but we *cannot* apply conditions on
    this `omit-xml-declaration` attribute here.  -->
<xsl:output method="xml" indent="no" 
    omit-xml-declaration="yes"
/>

<!-- Root element match: evaluate different cases, output XML declaration,
    XHTML DOCTYPE, or something else, then process the rest of the input. -->
<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="'... some condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</xsl:text>
        </xsl:when>
        <xsl:when test="'... some other condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <!-- ... some third kind of output ... -->
        </xsl:otherwise>
    </xsl:choose>
    <!-- Just process the rest -->
    <xsl:apply-templates/>
</xsl:template>


... [ other code ] ...

Dans XSLT, la valeur de omit-xml-declaration doit être oui ou non , vous ne pouvez pas y utiliser de modèles de valeur d'attribut. . Ceci s’applique à la fois aux versions 1.0 et 2.0.

Les attributs de type de document peuvent utiliser des fichiers AVT, mais le problème est que vous ne pouvez pas l'omettre, vous pouvez uniquement générer un attribut vide, ce qui conduit à une sortie contenant des chaînes de type de type vides.

Désolé, cela n’est pas possible avec XSLT. Vous pouvez utiliser deux feuilles de style différentes ou définir les paramètres de sortie dans le code qui appelle le processeur XSLT.

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