2010-08-16 4 views
2

J'ai besoin de votre esprit brillant! J'ai le prochain problème: J'ai un document xsl et je veux passer un tableau en tant que param (ou variable) à ce xsl pour itérer dessus.Passez un tableau de double comme un param en xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:include href="properties.xsl" /> 
<xsl:param name="upperLimit" /> 
<xsl:param name="value" /> 
<xsl:variable name="array" /> 
<xsl:template match="/"> 
    <Chart zdepth="60" exeTime="2" chartOrder="area,column"> 
     <categories> 
      <category label="Jan"/> 
      <category label="Feb"/> 
      <category label="Mar"/> 
      <category label="Apr"/> 
      <category label="May"/> 
      <category label="Jun"/> 
      <category label="Jul"/> 
      <category label="Aug"/> 
      <category label="Sep"/> 
      <category label="Oct"/> 
      <category label="Nov"/> 
      <category label="Dec"/> 
     </categories> 
     <dataset seriesName="budget" color="1E90FF" plotBorderColor="1E90FF" renderAs="column"> 
      <set value="{$value}"/> 
      <set value="32800"/> 
      <set value="32600"/> 
      <set value="29600"/> 
      <set value="32600"/> 
      <set value="32600"/> 
      <set value="31800"/> 
      <set value="36700"/> 
      <set value="29700"/> 
      <set value="31900"/> 
      <set value="32900"/> 
      <set value="34800"/> 
     </dataset> 
     <dataset seriesName="sales" color="EE2C2C" plotBorderColor="EE2C2C" renderAs="area"> 
      <xsl:for-each select="$array"> 
       <xsl:copy-of select="."/> 
      </xsl:for-each> 

     </dataset> 
     <styles> 
      <definition> 
       <style name="captionFont" type="font" size="15"/> 
      </definition> 
      <application> 
       <apply toObject="caption" styles="captionfont"/> 
      </application> 
     </styles> 

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

    </Chart> 
</xsl:template> 

je élément, dans lequel j'ai éléments et je veux ont chacun une valeur de « tableau ». (quelque chose comme ça:, ou même dans une boucle:).

Comment est-ce que je peux faire ceci? Toute suggestion sera très utile et le plus rapidement possible!

Merci.

+0

Quel langage de programmation ... – codymanix

+0

Bonne question (+1). Voir ma réponse pour une description détaillée des possibilités existantes pour représenter une gamme de doubles dans XSLT 1.0 et XSLT 2.0. –

Répondre

0

XSLT 1.0 et XPath 1.0 n'ont rien de suffisamment proche du "tableau de doubles".

Dans XSLT un tel tableau peut être simulé par un ensemble de nœuds d'éléments avec un enfant unique texte noeud (contenu somple dans la terminologie XSD), comme ceci:

<num>1.2345</num> 
<num>2.2345</num> 
<num>3.2345</num> 
<num>4.2345</num> 
<num>-.2345</num> 

tel un ensemble de nœuds peut être passé en tant que paramètre externe par l'invocateur de la transformation et la façon dont cela est fait dépend du processeur XSLT concret. Par exemple, la manière de transmettre les paramètres à XslCompiledTransform.Transform() est définie here.

Si l'ensemble de nœuds ci-dessus a été adoptée comme la valeur du définie globalement xsl:param nommé pDoubles, puis

$pDoubles[$k] sélectionne l'élément $ k-ième num dans l'ensemble de nœuds et il est l'enfant du texte nœud peut être utilisé implicitement dans d'autres expressions. Par exemple:

$pDoubles[1] + $pDoubles[2]

évalue à

3.469 

Dans XPath 2.0 (et donc dans XSLT 2.0), il y a un type de données qui est beaucoup plus proche d'un tableau de valeurs - la séquence de type de données.

Le plus proche du tableau de doubles dans XPath 2.0 est une séquence de doubles (xs:double). Une telle séquence peut être transmise en tant que paramètre externe à une transformation XSLT 2.0 et, à nouveau, les détails sur la façon de procéder sont spécifiques au fournisseur. Par exemple, comment faire cela pour Saxon, regardez here.

Prenez note: ensembles de noeuds dans XPath 1.0 et des séquences en XPath 2.0 uniquement simulent tableaux - ils ne sont pas des tableaux et l'une des différences les plus importantes est que si un accès au tableau est extrêmement rapide (O (1)), l'accès à un nœud/élément arbitraire d'un ensemble de nœuds/séquence peut être O (N).

Questions connexes