2010-06-30 7 views
1

Mon système génère un fichier XML contenant un noeud qui, selon le type d'événement, a un nom différent. Le nom peut être <floatRate> ou <fixedRate>. Le chemin est toujours le même, seul le nom du nœud est différent.Comment faire un résultat de noeud différent en fonction de l'existence d'un noeud donné en utilisant XLST?

J'ai besoin d'une transformation qui peut remplir un champ basé sur ce nom. Le champ sera appelé <type> et le contend doit être flottant ou fixe, basé sur le nom de noeud. Est-ce que cela peut être fait?

+0

Bonne question (+1). Voir ma réponse pour une solution complète qui suit l'esprit de XSLT. –

Répondre

1

Cette transformation:

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

<xsl:template match="fixedRate|floatRate"> 
    <type><xsl:value-of select= 
      "substring-before(name(),'Rate')"/></type> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML:

<rates> 
    <fixedRate>2.3</fixedRate> 
    <floatRate>1.1</floatRate> 
</rates> 

produit le résultat souhaité:

<rates> 
    <type>fixed</type> 
    <type>float</type> 
</rates> 
+0

Je crois que je vais utiliser quelque chose comme ça. Réservoirs à nouveau Dimitre. –

0

Sélectionner/expressions mach peuvent faire booléen « ou », comme dans

match="floatRate|fixedRate" 

Modifier votre question et ajouter des échantillons d'entrée, de sortie prévu et ce que vous avez déjà essayé d'obtenir plus d'aide

+0

Ce n'est pas "booléen ou" c'est l'opérateur de l'union XPath. –

+0

Je ne me suis pas rendu compte que les expressions select/mach peuvent faire booléen (ou union). Plus, que c'est la façon la plus simple de faire ce dont j'ai besoin. Réservoirs pour l'aide. Avec ceci et les exemples que l'autre donne, je crois que je trouve une solution de travail. –

0

Supposons que nous ayons ce document en entrée:

<result> 
    <floatRate>1.1</floatRate> 
</result> 

cette feuille de style:

<xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      version="1.0"> 
    <xsl:template match="result"> 
     <type> 
     <xsl:value-of select="substring-before(name(floatRate|fixedRate),'Rate')"/> 
     </type> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

Sortie:

<type>float</type> 
+0

Je n'ai pas besoin de l'expression . Pourquoi est-ce? –

+0

@Daniel Corsi: Ce modèle remplace le modèle intégré pour les nœuds de texte (il suffit de sortir sa valeur). Dans ce cas, n'est pas vraiment nécessaire: le modèle 'result' casse la récursion avant d'atteindre le noeud de texte de' floatRate'. –

Questions connexes