2011-12-01 2 views
1

J'utilise la feuille de style suivante pour afficher une table dans le classeur Excel avec les données. Je ne suis pas en mesure d'obtenir le résultat souhaité à la place, il s'affiche différemment comme indiqué ci-dessous.XSL: Problème de segmentation dans la boucle for

Suggestions Pls?

La feuille utilisée:

<xsl:stylesheet> 
<xsl:template match="/"> 
    <xsl:variable name="test1" select="str:tokenize('1$,$2$,$3$,$4$,$5','$,$')" /> 
    <xsl:variable name="test2" select="str:tokenize('a$,$b$,$c$,$d$,$e','$,$')" /> 
    <xsl:for-each select="str:split('1a$,$2b$,$3c$,$4d$,$5e','$,$')> 
     <row> 
      <cell Index="1"> 
       <xsl:value-of select="$test1[position()]" /> 
      </cell> 
      <cell Index="2"> 
       <xsl:value-of select="$test2[position()]" /> 
      </cell> 
     </row> 
    </xsl:for-each> 
</xsl:template> 

Résultat attendu:

1 un

2 b

3 c

4 d

5 e

Lorsque, le résultat affiché comme

a b

c d

e

Il semble que plus il affiche les dernières valeurs de tokenize. Comment obtenir des valeurs respectées.

+0

Pourriez-vous plaidoyer Se nous fournir une feuille de style plus complète? Vous utilisez des fonctions dans un espace de noms lié à 'str', mais nous ne savons pas d'où elles viennent. Utilisez-vous des fonctions d'extension avec Java? Des fonctions personnalisées à partir d'une ressource en ligne? –

+0

Le str est un espace de noms qui fait référence à "http://exslt.org/strings" – Bugude

Répondre

2

Bonne question, +1.

Il me semble qu'au lieu de:

<xsl:value-of select="$test1[position()]" /> 

cela doit être:

<xsl:value-of select="$test1[position() = current()]" /> 

Exactement la même observation vaut pour la deuxième<xsl:value-of>

Explication:

Toute expression

$var[position()] 

est équivalent à:

$var 

parce position() ne peut avoir des valeurs> = 1 et [position()] signifie la valeur booléenne deposition(), et La valeur booléenne de tout nombre non négatif par définition est true().

Si nous voulons sélectionner le nœud $ k-ème dans le jeu de nœuds $ var, dans XPath 1.0, qui est faiblement typé et on ne sait pas que $k détient un nombre entier, nous devons écrire:

$var[position() = $k] 

Voici une solution complète XSLT, 2.0 correspondant:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:variable name="test1" select= 
     "tokenize('1$,$2$,$3$,$4$,$5','\$,\$')" /> 

     <xsl:variable name="test2" select= 
     "tokenize('a$,$b$,$c$,$d$,$e','\$,\$')" /> 

     <xsl:for-each select="tokenize('1a$,$2b$,$3c$,$4d$,$5e','\$,\$')"> 
      <row> 
       <cell Index="1"> 
        <xsl:value-of select="$test1[position()]" /> 
       </cell> 
       <cell Index="2"> 
        <xsl:value-of select="$test2[position()]" /> 
       </cell> 
      </row> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur un document XML (ignoré), le résultat voulu, correct est produit:

<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
+0

Dans la boucle, Position() agit comme compteur, comme tokenize sépare la chaîne en fonction du délimiteur et les résultats en ensemble de nœuds, nous pouvons utiliser position() comme index pour obtenir la valeur spécifiée de l'ensemble de nœuds – Bugude

+0

cela n'a pas fonctionné pour moi. Lorsque j'essaie d'imprimer les valeurs des jetons, j'obtiens toujours les valeurs test2 au lieu des valeurs respectives test1 et test2. – Bugude

+0

@Bugude: Voir la mise à jour de ma question. Je ne connais pas bien la spécification des fonctions EXSLT, mais en XPath 2.0 standard, le caractère '$' doit être échappé sous la forme '\ $'. –

Questions connexes