Je dois sélectionner uniquement des enregistrements uniques à partir d'un document XML, dans le contexte d'une boucle <xsl:for-each>
. Je suis limité par Visual Studio à l'aide de XSL 1.0.Sélection d'enregistrements uniques dans XSLT/XPath
<availList>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-25</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>13:00:00</schFrmTime>
<schToTime>14:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
</availList>
L'unicité doit être fondée sur la valeur des trois éléments de l'enfant: schDate
, schFrmTime
et schToTime
. Si deux éléments item
ont les mêmes valeurs pour les trois éléments enfants, ils sont des doublons. Dans le XML ci-dessus, les éléments un et deux sont des doublons. Le reste est unique. Comme indiqué ci-dessus, chaque élément contient d'autres éléments que nous ne souhaitons pas inclure dans la comparaison. "Unicité" devrait être un facteur de ces trois éléments, et ceux-là seuls.
J'ai essayé d'y arriver par les moyens suivants:
availList/item[not(schDate = preceding:: schDate and schFrmTime = preceding:: schFrmTime and schToTime = preceding:: schToTime)]
L'idée est de sélectionner les enregistrements où il n'y a aucun élément précédent avec le même schDate
, schFrmTime
et schToTime
. Cependant, sa sortie est manquant le dernier article. C'est parce que ma XPath est en fait en train d'exclure les éléments où toutes les valeurs de l'élément enfant correspondent dans tout le document précédent. Aucun item
ne correspond à tous les éléments enfants du dernier élément - mais comme la valeur de chaque élément est individuellement présente dans un autre élément, le dernier élément est exclu.
je pourrais obtenir le résultat correct en comparant toutes les valeurs de l'enfant en tant que chaîne concaténée à les mêmes valeurs concaténées pour chaque élément précédent. Est-ce que quelqu'un sait d'une manière que je pourrais faire ceci?
Bonne question (+1). Voir ma réponse pour une XPath et une solution XSLT. –
La méthode utilisant key() est communément appelée méthode Muenchian: http://www.jenitennison.com/xslt/grouping/muenchian.html –