2011-12-18 4 views
2

J'ai une application écrite en C# qui doit appliquer un nom de modèle à un fichier xml défini dans un fichier XSLT.XSLT choisir le modèle

Exemple XML:

<Data> 
    <Person> 
     <Name>bob</Name> 
     <Age>43</Age> 
    </Person> 
    <Thing> 
     <Color>Red</Color> 
    </Thing> 
</Data> 

Exemple XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:param name="TargetName" /> 
    <xsl:param name="RootPath" /> 

    <xsl:Template Name="AgeGrabber"> 
     <xsl:value-of select="/Person/Age" /> 
    </xsl:Template> 

    <xsl:Template Name="ColorGrabber"> 
     <xsl:value-of select="/Color" /> 
    </xsl:Template> 

</xsl:stylesheet> 

Dire que je voulais exécuter le modèle "ColorGrabber" avec le chemin "/ Data/Thing" puis exécuter une autre transformée avec le modèle "AgeGrabber" avec le chemin "/ Data". Est-ce possible? Je pensais que je pourrais passer dans le chemin et le nom du modèle (hense les 2 params en haut) et ensuite faire un certain type de commutateur mais il ressemble à xsl: call-template ne peut pas prendre un paramètre comme attribut name.

Comment puis-je obtenir ce comportement?

+1

Quel est exactement le résultat attendu de la transformation? – mzjn

Répondre

1

Il y a un certain nombre de problèmes avec cette question:

  1. <xsl:stylesheet version="2.0" ... est spécifié, cependant, à l'heure actuelle> NET ne supporte pas nativement XSLT 2.0.

  2. theCode exemple est pas trop significatif, car un document XML unique ne peut pas contenir à la fois /Person/Age et /Color éléments - un document XML wellformed ne dispose que d'un élément supérieur unique et il peut être Person ou Color, mais pas les deux.

Dans le cas où il y avait un exemple plus significatif:

<Person> 
<Age>27</Age> 
<HairColor>blond</HairColor> 
</Person> 

une solution simple est:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pProperty" select="'Age'"/> 

<xsl:template match="/"> 
    <xsl:value-of select="/*/*[name()=$pProperty]"/> 
</xsl:template> 
</xsl:stylesheet> 

et quand cette transformation est appliquée sur le document XML ci-dessus , on obtient le résultat souhaité:

27 

Dans le cas où l'emboîtement des éléments d'intérêt peut être arbitraire et/ou nous devons faire un traitement différent sur les différents éléments, puis une solution appropriée consiste à utiliser correspondant à modèles (et pas les nommés):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pProperty" select="'HairColor'"/> 

<xsl:template match="Age"> 
    <xsl:if test="$pProperty = 'Age'"> 
    This person is <xsl:value-of select="."/> old. 
    </xsl:if> 
</xsl:template> 

<xsl:template match="HairColor"> 
    <xsl:if test="$pProperty = 'HairColor'"> 
    This person has <xsl:value-of select="."/> hair. 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur le même document XML (ci-dessus), encore une fois le résultat correct est produit:

This person has blond hair. 

Enfin, si vous voulez vraiment simuler des fonctions d'ordre supérieur (FOH) dans XSLT 1.0 ou XSLT 2.0, voir cette réponse: https://stackoverflow.com/a/8363249/36305, ou en apprendre davantage sur FXSL.

0

Beaucoup plus simple: préparer deux règles apply-templates (pour les éléments de l'âge et couleur) et envoyer conditionnellement noeud propre à transformer -//personne/âge ou//Thing/Couleur

0

Vous avez en arrière. Vous devez créer des modèles, correspondant aux nœuds que vous souhaitez utiliser.

<xsl:stylesheet> 
    <xsl:template match="Person|Thing"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Person"> 
     <xsl:value-of select="Age" /> 
    </xsl:template> 

    <xsl:template match="Thing"> 
     <xsl:value-of select="Color" /> 
    </xsl:template> 

</xsl:stylesheet> 
Questions connexes