2010-12-02 4 views
2

Salut J'ai besoin d'obtenir un tableau d'éléments (avant "-" si existant) par xsl.xsl obtenir tableau d'éléments

xml est

<Cars> 
<Car Trunck="511"/> 
<Car Trunck="483-20"/> 
<Car Trunck="745"/> 
</Cars> 

xsl est

<xsl:variable name="testarr"> 
<xsl:for-each select="//Cars//Car/@Trunck"> 
<xsl:value-of select="number(substring(.,1,3))" /> 
       </xsl:for-each> 
         </xsl:variable> 

(je suppose que tous les numéros est numéro à trois chiffres, si quelqu'un connaît une solution pour toutes les conditions seront heureux d'entendre la proposition) si je fais cela je reçois tous les nombres dans une ligne: 511483745 et je dois les obtenir dans le tableau parce que j'ai aussi besoin d'obtenir la valeur maximale

grâce

+0

XSLT n'a pas la notion de 'arrays' - l'élément le plus proche est node-sets. – Oded

+0

Bonne question, +1. La réponse d'Alejandro est significativement meilleure que celle actuellement sélectionnée et je l'ai mise à jour. Cependant, je pense que ma réponse est encore meilleure. :) –

Répondre

1

Vous pouvez utiliser les substring-before et substring-after fonctions: Voir l'excellent tutoriel ZVON http://zvon.org/xxl/XSLTreference/Output/function_substring-after.html

Dans votre exemple, vous n'extrayez les valeurs (qui sont des chaînes) qui obtiennent concaténer. Peut-être vous avez besoin d'envelopper le résultat dans votre propre élément

<xsl:for-each select="//Cars//Car/@Trunck"> 
    <truck> 
    <xsl:value-of select="number(substring(.,1,3))" /> 
    </truck> 
</xsl:for-each> 
2

Salut, je dois obtenir ensemble d'éléments (avant « - » si elles existent) [...] je dois obtenir les dans le tableau parce que je également besoin d'obtenir la valeur max

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:for-each select="/Cars/Car/@Trunck"> 
      <xsl:sort select="concat(substring-before(.,'-'), 
            substring(., 1 div not(contains(.,'-'))))" 
        data-type="number" order="descending"/> 
      <xsl:if test="position()=1"> 
       <xsl:value-of 
        select="concat(substring-before(.,'-'), 
            substring(.,1 div not(contains(.,'-'))))"/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

sortie:

745 

XPath 2.0 une ligne:

max(/Cars/Car/@Trunck/number(replace(.,'-.*',''))) 
+0

+1 pour la meilleure solution. –

0

Même si vous avez deux bonnes réponses (en particulier que par @Alejandro), voici une de moi que je pense est encore mieux:

Cette transformation:

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

<xsl:template match="/*"> 
    <xsl:apply-templates select="*"> 
    <xsl:sort data-type="number" order="descending" 
    select="substring-before(concat(@Trunck,'-'),'-')"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Car"> 
    <xsl:if test="not(position() > $pTopNums)"> 
    <xsl:value-of select= 
    "substring-before(concat(@Trunck,'-'),'-')"/> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

lorsque appli ed sur ce document XML (l'origine fourni un, légèrement modifié pour être plus difficile):

<Cars> 
    <Car Trunck="483-20"/> 
    <Car Trunck="311"/> 
    <Car Trunck="745"/> 
</Cars> 

produit le résultat souhaité, correct (les deux premiers chiffres qui proviennent de @Trunck comme indiqué dans la question):

745 
483 
+0

+1 Meilleure expression pour l'extraction de valeur –