2010-01-17 2 views
1

Comment transformer une section d'un document XML plusieurs fois? J'appelle un modèle à partir d'une feuille de style pour un nœud particulier. Lorsque j'importe un autre utilitaire qui transforme ces mêmes données, l'original cesse de fonctionner.en utilisant une seule partie de données XML à plusieurs endroits

Comment faire fonctionner les deux feuilles de style?

+0

Voulez-vous le résultat d'avoir deux fichiers différents, ou tout simplement avoir les deux ensembles de modèles exécuter pour le nœud XML donné (s) et de produire différents morceaux de sortie dans le même fichier de résultats? –

+0

Un exemple de code serait plus apporter des informations plus élaborées .. –

Répondre

1

Il est difficile à diagnostiquer sans voir les feuilles de style, mais je soupçonne que votre importation stylesheet et importés stylesheet ont des modèles avec les mêmes critères de correspondance ou le même nom et le importation stylesheet a « surchargée » la modèle de feuille de style importé, l'empêchant d'être exécuté.

Les feuilles de style importées ont une priorité inférieure aux modèles de votre feuille de style de premier niveau.

Vous pouvez utiliser au sein de votre principal modèle de feuille de style pour appliquer le modèle importé pour ce noeud.

<xsl:template match="foo"> 
    <!--First, turn foo into bar --> 
    <bar> 
    <xsl:apply-templates /> 
    </bar> 
    <!--Now, apply the template from the imported file to do whatever it does--> 
    <xsl:apply-imports /> 
</xsl:template> 

Vous pouvez également utiliser le mode pour définir plusieurs modèles pour un noeud donné, puis apply-templates dans différents modes de contrôle quand ils sont exécutés.

http://www.dpawson.co.uk/xsl/sect2/modes.html

Par exemple, si vous voulez appliquer style1.xsl ou style2.xsl de style.xsl, vous pouvez définir tous les modèles en style1.xsl avec mode = "style1" (et utiliser l'attribut mode dans tous les modèles d'appel et apply-templates) et tous les modèles dans style2.xsl avec mode = "style2".

Ensuite, vous pourriez avoir un style.xsl styelsheet qui contient:

<xsl:include href="style1.xsl"/> 
<xsl:include href="style2.xsl"/> 

<xsl:template match="some pattern"> 
    <xsl:choose> 
    <xsl:when test="some test"> 
     <xsl:apply-templates select="." mode="style1"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:apply-templates select="." mode="style2"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
0

Si possible, utilisez un nom de modèle, pas une correspondance de données.

Utilisez cette

<xsl:call-template name="test" /> 

<xsl:template name="test"> 
    <!-- content --> 
</xsl:template> 

pas

<xsl:template match="test/entry"> 
    <!-- content --> 
</xsl:template> 
Questions connexes