2008-09-16 7 views
7

J'ai une feuille de style xslt avec plusieurs xsl:import s et je veux les fusionner tous dans le fichier xslt.Fusionner plusieurs feuilles de style xslt

Il s'agit d'une limitation du système que nous utilisons lorsqu'il passe autour de la feuille de style xsl en tant qu'objet de chaîne stocké en mémoire. Ceci est transmis à la machine distante où elle effectue la transformation. Comme il n'est pas chargé à partir du disque, les liens href sont rompus. Nous devons donc supprimer les xsl:import s de la feuille de style.

Existe-t-il des outils pour cela?

Répondre

15

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

Par conséquent, vous devez d'abord remplacer le xsl: import avec xsl: include, résoudre les conflits et tester si vous obtenez toujours les bons résultats. Après cela, vous pouvez utiliser la feuille de style suivante pour fusionner vos feuilles de style existantes en une seule. Il suffit d'appliquer à votre maître stylesheet:

<?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 xsl: include de avec les feuilles de style inclus en utilisant la fonction de document qui se lit dans le fichier référencé dans l'attribut href. Le deuxième modèle est le identity transformation. Je l'ai testé avec Xalan et il semble fonctionner correctement. L'utilisateur explique: «(le fichier est) transmis à la machine distante où il effectue la transformation.

+1

Cela semble ne pas fonctionner si comprend des chemins relatifs ont comme ci-dessous: Tous moyen de contourner ces scénarios aussi? – Shiv

0

Pourquoi voudriez-vous? Ils sont généralement séparés pour une raison après (souvent maintenabilité)

Vous pouvez toujours écrire la fusion vous-même - lire les fichiers XSL, sélectionner les éléments de modèle qui vous intéresse et écrire dans un nouveau fichier maître XSL ..

+0

Comme il n'est pas chargé à partir du disque, les liens href sont rompus " –

+0

J'ai édité la requête pour inclure la raison, car cette réponse a été postée avant cette modification – roo

1

Une fusion manuelle est probablement la meilleure option.

La principale considération sera probablement de s'assurer que la logique des modèles de correspondance fonctionne dans la feuille de style combinée.

+0

Voilà ce dont j'avais peur: \ – roo

2

Il est impossible d'inclure des feuilles de style importées dans le fichier principal sans rompre import precedence. 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, vous obtiendrez deux variables avec le même nom et la priorité d'importation, ce qui entraînera une erreur.

La solution de contournement est deux remplacer xsl: importer avec xsl: include et résoudre tout conflicts. Après cela, vous êtes sûr de remplacer xsl: inclure des instructions avec les contenu des fichiers correspondants, car c'est ce XSLT-processor does:

L'inclusion fonctionne au niveau de l'arborescence XML. La ressource localisée par la valeur d'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 dans le document inclus. Le fait que les règles ou les définitions de modèle soient incluses n'affecte pas la façon dont elles sont traitées.

-1
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/> 
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/> 
Questions connexes