2008-10-09 5 views
1

J'ai XML qui ressemble àTester si un certain type d'élément non nul existe ... quelque part

<answers> 
    <answer> 
     <question-number>1</question-number> 
     <value>3</value> 
     <mean xsi:nil="1" /> 
    </answer> 
    <answer> 
     <question-number>2</question-number> 
     <value>2</value> 
     <mean>2.3</mean> 
    </answer> 
    <answer> 
     <question-number>3</question-number> 
     <value>3</value> 
     <mean xsi:nil="1" /> 
    </answer> 
.... 
</answers> 

Je formatage de chaque réponse en utilisant xsl: for-each. S'il y a un présent moyen, j'ai une représentation graphique de la moyenne. Pour certaines listes de réponses potentielles, la moyenne sera toujours nulle.

Au bas de la page, je veux mettre une légende expliquant la représentation graphique de la moyenne. Mais je veux seulement que cela apparaisse si j'ai réellement montré un moyen du tout. Donc je veux être capable de faire une vérification, après avoir fermé le xsl: for-each, pour dire "est-ce que l'un des éléments de réponse a une valeur moyenne non nulle?".

Je ne sais vraiment pas comment faire cela.

+0

Pourquoi avez-vous un élément moyen quand il n'y a pas de moyenne? Il serait certainement plus logique que l'attribut entier soit absent dans le cas d'un manque de moyenne, plutôt que de lui assigner une valeur «nulle» arbitraire. – workmad3

+0

Juste point. Je vais essayer de l'attaquer de cette direction aussi, mais c'est le XML qui est généré par le sérialiseur utilisé par ce projet (avant mon temps).xsi: nil est censé être utilisé pour indiquer qu'un élément qui n'est généralement pas vide est supposé être vide. Peut-être que je peux l'éteindre. –

Répondre

1

Voici ce que finalement fonctionné pour moi:

<xsl:if test="//answers/answer/mean>0"> 

C'est-à-dire, "existe-t-il des éléments de réponse pour lesquels la valeur moyenne est supérieure à zéro". Heureusement, je sais que la valeur moyenne, s'il y en a une, sera toujours supérieure à zéro - malheureusement, ce n'est pas une solution généralisée pour cette raison. Je pense toujours que l'approche que jasper et workmad3 prenaient (en vérifiant l'attribut xsi: nil) devrait fonctionner, mais je n'ai pas réussi à obtenir la syntaxe pour réellement travailler ....

Un grand merci à tous.

+0

Heureux que ça a marché! –

0

Quelque chose comme ceci devrait fonctionner. Si vous avez des moyens, il retournera vrai

<xs:if test="/answers/answer/mean">You have a mean</xs:if> 

Je pense que c'est ce que vous voulez dire.

Editer: peut-être cela?

<xs:if test="(count(/answers/answer/mean)==1)">You have a mean<xs:if> 

Je ne sais pas si cela fonctionne, mais il pourrait

<xs:if test="/answers/answer/mean != nil">You have a mean</xs:if> 
+0

Cela semble vérifier s'il y a un élément appelé mean, qu'il soit nul ou non. Dans mon exemple XML ci-dessus, si tous les éléments "moyens" avaient xsi: nil = "1", alors je ne veux pas afficher, merci! –

+0

Peut-être que je pourrais vérifier l'existence d'un "élément" d'un niveau inférieur à la moyenne - comme test = "answers/answer/mean/*"? Je vais essayer ça. –

+0

Non, cela ne semble jamais afficher. –

5

faire l'un des éléments de réponse ont une valeur moyenne non nulle? exemple basé sur roberts

<xs:if test="(count(/answers/answer/mean[not(@xsi:nil)])>0"><xs:if> 

EDIT:

<xs:if test="//answer/mean[not(text())]"><xs:if> 

EDIT DERNIER (avant de rentrer chez ...)

<xs:if test="//answer/mean[attribute::xsi:nil]"><xs:if> 
+0

a du sens pour moi - bonne reformulation de ma question - mais en fait il ne s'affiche jamais lors de l'utilisation de ce test. –

+1

Le second que vous avez posté - pas (// answer/mean/text()) - semble revenir vrai tout le temps. –

+0

Je vois que le second a été copié-collé de la mauvaise page;). Le (maintenant) deuxième et troisième devrait vous donner le même jeu de nœuds. – Jasper

0

Qu'en est-il quelque chose comme ça?

<xsl:for-each select="/answers/answer"> 
     <xsl:if test="mean &gt;= 0"> 
      ... other code ... 
     </xsl:if> 
    </xsl:for-each> 
+0

Cela ne va-t-il pas entraîner l'affichage de ma légende une fois pour chaque fois qu'il existe une moyenne non nulle? Je veux qu'il affiche une fois, seulement, s'il y a des moyens non-null du tout, et sinon ne pas afficher. –

+0

Oui, vous voudriez le faire en dehors de votre boucle for-each, comme vous l'avez dans votre réponse ci-dessous. –

2
<xs:if test="count(/answers/answer/mean[@xsi:nil != '1']) > 0">Mean stuff here</xs:if> 

devrait faire ce que vous voulez (compter les moyens où l'attribut xsi: nul n'est pas réglé sur 1)

+0

Hmm. Comme avec Jasper, cela a du sens et devrait fonctionner, mais il ne s'affiche jamais (c'est-à-dire qu'il ne retourne jamais vrai, même si certains des éléments moyens ont une valeur numérique). Je continuerai à explorer cette approche. –

Questions connexes