2010-05-15 6 views
1

J'ai écrit un xslt qui lit certains noms de fichiers xml et effectue certaines opérations sur ceux-ci.
J'utilise un for-each pour les travailler un par un. J'ai chaque chemin à l'intérieur d'un paramètre $ path.Comment appeler une transformation xslt en feuille de style xsl

Mais maintenant je voudrais afficher le résultat de l'application d'une feuille de style externe à ces fichiers. J'écrirais quelque chose comme

<div> <something like xsl-transform($extern-xslt,$path)> </div> 

pour avoir l'arbre résultat de la transformation dans la sortie html principale. C'est possible?

+0

Bonne question! (+1), Voir ma réponse pour la seule solution complète en ce moment et pour un exemple de code de travail complet. :) –

Répondre

1

Vous pouvez utiliser la fonction XPath document() pour charger un fichier XML externe. Cela retourne un ensemble de nœuds qui peut être analysé avec un appel <xml:apply-templates>. L'inclusion d'une feuille de style externe peut être effectuée à l'aide d'une balise <xsl:include>.

<xsl:include href="$external"/> 
<xsl:apply-templates select="document($path)"/> 

Voir aussi the documentation for document()

2

Vous pouvez importer la feuille de style externe à votre feuille de style principale avec xsl:import, puis il suffit d'appliquer des modèles à ce fichier XML externe, que vous pouvez charger avec la fonction document.

<div><xsl:apply-templates select="document($path)"/></div> 

Si les modèles dans la feuille de style externe seraient entrer en collision avec les modèles dans la feuille de style principale, vous pouvez utiliser un mode différent pour eux.

0

J'ai écrit un xslt qui lit certains noms de fichiers xml et fait quelques opérations sur eux. J'utilise un for-each pour les travailler un par un. J'ai chaque chemin à l'intérieur d'un paramètre $ path.

Mais maintenant, je voudrais sortir le résultat de l'application d'un externe stylesheet à ces fichiers

La solution se compose de ces ingrédients:

  1. Utilisez la XSLT norme document() fonction pour charger et accéder au document XML externe.

  2. Importez la feuille de style externe à l'aide d'une instruction <xsl:import>.

  3. Les modèles de la feuille de style externe doivent être dans un mode spécial, non utilisé par la feuille de style principale.

  4. A l'endroit où le résultat de la « transformation externe » est voulu, problème <xsl:apply-templates> sélectionner les nœuds nécessaires du document externe (généralement le nœud racine / ou l'élément supérieur /*). Le mode spécifié sur <xsl:apply-templates> doit être identique au mode utilisé dans la feuille de style externe.

Voici un petit exemple simplifié (importé Aucune feuille de style externe, le "document externe" est intégré dans la feuille de style, et aucun mode est utilisé):

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:my="my:my" 
> 
<!-- <xsl:import href="myExternal.xsl"/> --> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <my:div> 
     <h2>Weather</h2> 
     <p >It will be raining today</p> 
    </my:div> 

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

<xsl:template match="insertContents"> 
    <xsl:apply-templates select="document('')/*/my:div/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur ce document XML:

<html> 
    <h1>Today's News </h1> 
    <insertContents/> 
</html> 

t il est produit désiré résultat:

<html> 

    <h1>Today's News </h1> 

    <h2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my:my">Weather</h2> 
    <p xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my:my">It will be raining today</p> 

</html> 

Remarque que les namespaces étrangers ci-dessus ne sont en raison des simplifications de cet exemple - ils ne seront pas générés si le document XML externe était dans son propre fichier.

Questions connexes