2009-04-23 4 views
1

Comment trouver le maximum de trois nombres dans XSL? Plus d'informations: J'ai trois numéros dire 1.0, 2.0, 5.0 .... Je n'ai pas de nœuds ensemble ... Je voudrais trouver au maximum de 1,0, 2,0 et 5,0 .....Trouver le maximum de trois nombres dans XSL

Exemple:

AIM : TO know which type of node <MYNODE>, <DOC>, <PIC> 
is having maximum count and whant's the count number ? 

    <ROOT> 
       <MYNODES> 
        <MYNODE>A</MYNODE> 
        <MYNODE>B</MYNODE> 
        <MYNODE>C</MYNODE> 
        <MYNODE>D</MYNODE> 
       </MYNODES> 
       <DOCS> 
        <DOC>1</DOC> 
        <DOC>2</DOC> 
        <DOC>3</DOC> 
       </DOC> 
       <PICS> 
        <PIC>a.jpeg</PIC> 
        <PIC>b.jpeg</PIC> 
        <PIC>c.jpeg</PIC> 
        <PIC>d.jpeg</PIC> 
        <PIC>e.jpeg</PIC> 
       </PICS> 
    </ROOT> 
+0

Plus d'informations: J'ai trois nombres disons 1.0, 2.0, 5.0 .... Je n'ai pas de nœuds ensemble ... Je voudrais trouver au maximum de 1,0, 2,0 et 5,0 ..... –

+0

Que voulez-vous dire 3 chiffres simples, l'être importé en tant que fichier dans xsl? – TStamper

+0

Les 3 nombres sont-ils liés comme 3 variables différentes? Sont-ils intégrés dans une chaîne? Ou sont-ils le contenu de 3 nœuds différents? Plus d'informations sont nécessaires pour une réponse appropriée. –

Répondre

1

Cette question est mal formulée et la condition " Document XML 'n'est pas bien formé!

Notez qu'il il est généralement meaningle ss à poser sur le maximum d'un ensemble de nombres. Il peut y avoir plus d'un nombre avec la valeur la plus élevée. Par conséquent, les solutions ci-dessous montrent seulement le premier élément avec la valeur maximale.

C'est une solution XSLT 1.0 possible:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:variable name="vNameMaxCount"> 
      <xsl:for-each select="*/*"> 
      <xsl:sort select="count(*)" data-type="number" 
      order="descending"/> 

      <xsl:if test="position() = 1"> 
       <xsl:value-of select="concat(name(),'+', count(*))"/> 
      </xsl:if> 
      </xsl:for-each> 
     </xsl:variable> 

     One element with maximum children is: <xsl:text/> 
     <xsl:value-of select="substring-before($vNameMaxCount, '+')"/> 

     Maximum number of children: <xsl:text/> 
     <xsl:value-of select="substring-after($vNameMaxCount, '+')"/> 

    </xsl:template> 
</xsl:stylesheet> 

lorsque la transformation ci-dessus est appliquée sur le document XML suivant (produit à partir de celui fourni après avoir passé 10 minutes pour le rendre bien formé !):

<ROOT> 
    <MYNODES> 
     <MYNODE>A</MYNODE> 
     <MYNODE>B</MYNODE> 
     <MYNODE>C</MYNODE> 
     <MYNODE>D</MYNODE> 
    </MYNODES> 
    <DOCS> 
     <DOC>1</DOC> 
     <DOC>2</DOC> 
     <DOC>3</DOC> 
    </DOCS> 
    <PICS> 
     <PIC>a.jpeg</PIC> 
     <PIC>b.jpeg</PIC> 
     <PIC>c.jpeg</PIC> 
     <PIC>d.jpeg</PIC> 
     <PIC>e.jpeg</PIC> 
    </PICS> 
</ROOT> 

le résultat recherché est produit

One element with maximum children is: PICS 

    Maximum number of children: 5 

Une solution XSLT 2.0 (en fait juste un XPath 2.0 Soulution):

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "for $vmaxChildrein in max(/*/*/count(*)), 
     $vmaxNode in */*[count(*) = $vmaxChildrein][1] 
     return 
     (name($vmaxNode), 
      'has the max no of children:', 
      $vmaxChildrein 
     ) 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le document ci-dessus, le résultat recherché est produit:

PICS has the max no of children: 5 

Pour trouver le maximum de propriétés plus délicates ne peut pas être immédiatement exprimé comme une expression XPath et utilisé dans <xsl:sort>, utilisent la fonction f:maximum() de FXSL.

+0

Est-ce que ceci trouvera le nombre maximum d'enfants ou de frères et sœurs d'un noeud? – TStamper

+0

@TStamper Les deux solutions présentées * font * trouver le nombre maximum d'éléments enfants. Tu ne le vois pas toi-même? –

+0

+1 pour signaler qu'il s'agit d'un * un * nœud (pas * le * nœud) avec le nombre maximal d'enfants. Autre que c'est est égal à ma solution. – Tomalak

0

5.0 est le plus grand des trois nombres. Hardcode et faites-le avec. :-)

Sérieusement, vous voudrez peut-être prendre un autre chemin. Une telle logique est triviale dans d'autres langues, mais peut être pénible dans XSLT. Vous devriez envisager d'écrire une simple extension pour le moteur XSLT plutôt que d'essayer de faire en sorte que XSLT fasse ce que vous voulez.

+0

Salut Peter, Je suis nouveau à XSL .... Pouvez-vous s'il vous plaît m'aider dans l'extension ... Tous les liens ou les pointeurs seraient utiles –

+0

+1 pour me faire rire! – Cerebrus

+0

L'écriture d'une extension XSLT doit être effectuée différemment selon l'implémentation XSLT utilisée. Lequel utilisez-vous? Xalan en Java, Xalan en C++, Saxon, MSXML, Firefox? –

2

Avec votre XML d'entrée, vous trouverez le nombre maximum que vous recherchez comme ceci:

<xsl:variable name="vMaxChildren"> 
    <xsl:for-each select="/ROOT/*"> 
    <xsl:sort select="count(*)" data-type="number" order="descending" /> 
    <xsl:if test="position() = 1"> 
     <xsl:value-of select="concat(name(), ': ', count(*))" /> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:value-of select="$vMaxChildren" /> 

qui produirait:

PICS: 5 
+0

Up-voté comme complètement correct. Voir mon commentaire-réponse à votre commentaire à ma réponse. :) –

Questions connexes