Je me rends compte que je devrais peut-être expliquer pourquoi.
- Le paramètre test est évalué comme une expression xpath. (Si cette expression n'est pas booléenne, on passe implicitement son résultat par la fonction boolean() pour qu'elle le devienne. Nous allons voir que dans le cas qui nous intéresse, elle est booléenne.)
- Les opérateurs = et != produisent des booléens. Les règles de calcul dépendent des types des opérandes.
- Tes deux paramètres sont des expressions d'ensembles de nœuds. Ça n'a pas d'importance, mais en les regardant on peut voir que les nœuds sont forcément des attributs. On peut aussi supposer que ça ne sélectionne, soit qu'un seul attribut, soit aucun attribut. Donc probablement des ensembles, soit d'un seul nœud, soit de zéro nœud.
- Sur des ensembles de nœud, les opérateurs = et != sont définis ainsi :
-- la condition est vraie si et seulement si, il existe une paire de nœuds, un nœud tiré de la première opérande et l'autre de la deuxième opérande, telle que, les résultats de la fonction string() sur ces nœuds, vérifie la condition suscitée.
Autrement dit, pour $a != $b, il s'agit de trouver deux nœuds, un tiré de $a et un tiré de $b, tels que string() sur celui de $a != string() sur celui de $b.
-- On en conclut que contre-intuitivement, si on n'a pas $a = $b, on n'a pas forcément non plus $a != $b. Ni l'inverse.
-- On en conclut aussi que si un est opérande est l'ensemble vide, la condition est forcément fausse. Autrement dit l'ensemble vide n'est égal à rien, et n'est différent de rien. Chose amusante, l'ensemble vide n'est pas égal à l'ensemble vide.
Comment marchent les corrections ?
<xsl:when test="not($start_am = $prev_start_am)">
Ici il s'agit de tester si les deux ensembles vérifient l'opérateur =, et de prendre l'inverse du résultat. Je trouve que c'est ce que devrait faire l'opérateur !=, mais ce n'est pas ce qu'il fait.
<xsl:when test="string($start_am) != string($prev_start_am)">
En passant les opérandes par string() d'abord, on convertir leur type. Ce ne sont plus des ensembles de nœuds, ce sont des chaînes de caractères. Pour l'ensemble vide c'est la chaîne vide, pour les autres c'est la valeur de string() sur le premier nœud.
Et les opérateurs = et != sur des opérandes chaînes de caractères sont beaucoup plus intuitifs.
Partager