Question

J'ai une feuille de style xslt avec plusieurs xsl: import et je souhaite les fusionner dans le même fichier xslt.

C’est une limitation du système que nous utilisons, où il passe autour de la feuille de style xsl en tant qu’objet chaîne stocké en mémoire. Ceci est transmis à la machine distante où il effectue la transformation. Comme il n’est pas chargé depuis le disque, les liens href sont cassés. Nous devons donc supprimer les éléments xsl: import de la feuille de style.

Existe-t-il des outils permettant de le faire?

Était-ce utile?

La solution

Vous pouvez utiliser une feuille de style XSL pour fusionner vos feuilles de style. Cependant, cela équivaut à utiliser l'élément xsl: include et non xsl: import (comme Azat Razetdinov l'a déjà souligné). Vous pouvez lire sur la différence ici .

Par conséquent, vous devez d’abord remplacer les fichiers xsl: import par ceux de xsl: include, résoudre les conflits éventuels et vérifier si vous obtenez toujours les résultats corrects. Après cela, vous pouvez utiliser la feuille de style suivante pour fusionner vos feuilles de style existantes en une seule. Appliquez-le simplement à votre feuille de style principale:

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">

<xsl:template match="xsl:include">
  <xsl:copy-of select="document(@href)/xsl:stylesheet/*"/>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Le premier modèle remplace tous les xsl: include par les feuilles de style incluses en utilisant la fonction document, qui lit le fichier référencé dans l'attribut href. Le deuxième modèle est le transformation d'identité .

Je l'ai testé avec Xalan et il semble bien fonctionner.

Autres conseils

Il est impossible d'inclure des feuilles de style importées dans le fichier principal sans interrompre priorité à l'importation. . Par exemple, vous définissez une variable de niveau supérieur dans une feuille de style importée et la redéfinissez dans le fichier principal. Si vous fusionnez deux fichiers en un seul, vous obtiendrez deux variables portant le même nom et la même priorité à l'importation, ce qui entraînera une erreur.

La solution de contournement consiste à remplacer deux xsl: import par xsl: include et résoudre les conflits . Après cela, vous pouvez remplacer les instructions xsl: include par le contenu des fichiers correspondants, car Le processeur XSLT fait :

  

L'inclusion fonctionne au niveau de l'arborescence XML. La ressource localisée par la valeur de l'attribut href est analysée en tant que document XML et les enfants de l'élément xsl: stylesheet de ce document remplacent l'élément xsl: include du document inclus. Le fait que des règles ou des définitions de modèles soient incluses n’affecte pas la manière dont elles sont traitées.

Une fusion manuelle sera probablement la meilleure option.

La principale préoccupation sera probablement de vous assurer que la logique de correspondance des modèles fonctionne dans la feuille de style combinée.

Pourquoi voudriez-vous? Ils sont généralement séparés pour une raison après tout (souvent la facilité de maintenance)

Vous pouvez toujours écrire vous-même la fusion: lisez les fichiers XSL, sélectionnez les éléments de modèle qui vous intéressent et écrivez dans un nouveau fichier XSL principal ...

 import multiple xsl in single xsl

      <xsl:import href="FpML_FXOption_Trade_Template1.xsl"/>
      <xsl:apply-imports/>

<calypso:keyword>
                <calypso:name>DisplayOptionStyle</calypso:name>
<calypso:value>Vanilla</calypso:value>
</calypso:keyword>

           <xsl:import href="FpML_FXOption_Trade_Template2.xsl"/>
           <xsl:apply-imports/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top