Bonjour,
je reposte un vieux problème dont voici les données d'entrées :
XML:
Pour l'instant j'utilise ce XSL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="simple_view.xslt"?> <REPORT> <RDSSTATUS>0</RDSSTATUS> <RDSMESSAGE> </RDSMESSAGE> <EXPRESSION type="multi"> <MULTI> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname1</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489695' start='1298489695'>success</ITEM> </INSTANCE> </MULTI> <MULTI> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname1</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489754' start='1298489754'>success</ITEM> </INSTANCE> </MULTI> <MULTI name="LabCdc"> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname1</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489695' start='1298489695'>success</ITEM> </INSTANCE> </MULTI> <MULTI name="LabCdc"> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname1</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489695' start='1298489695'>success</ITEM> </INSTANCE> </MULTI> <MULTI name="LabCdc"> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname2</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489695' start='1298489695'>success</ITEM> </INSTANCE> </MULTI> <MULTI name="LabCdc"> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname2</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298490092' start='1298490092'>success</ITEM> </INSTANCE> </MULTI> <MULTI name="LabCdc"> <INSTANCE name="Client" cast="String" key="true" trend="false"> <ITEM end='-1' start='-1'>hostname2</ITEM> </INSTANCE> <INSTANCE name="Status" cast="String" key="false" trend="false"> <ITEM end='1298489695' start='1298489695'>failed</ITEM> </INSTANCE> </MULTI> </EXPRESSION> </REPORT>
J'obtiens le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" omit-xml-declaration="yes"/> <xsl:key name="client_status" match="/REPORT/EXPRESSION[1]/MULTI" use="concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM)"/> <xsl:template match="REPORT"> <xsl:apply-templates select="/REPORT/EXPRESSION[1]"/> </xsl:template> <xsl:template match="/REPORT/EXPRESSION[1]"> <xsl:for-each select="//MULTI[generate-id() = generate-id(key('client_status', concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM))[1])]"> <xsl:sort select="INSTANCE[@name='Client']/ITEM"/> <xsl:choose> <xsl:when test="INSTANCE[@name='Status']/ITEM = 'failed'"> <xsl:text> failed</xsl:text> <xsl:value-of select="INSTANCE[@name='Client']/ITEM"/> </xsl:when> <xsl:otherwise> <xsl:text> success</xsl:text> <xsl:value-of select="INSTANCE[@name='Client']/ITEM"/> </xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Ce que je cherche à faire c'est de me retrouver avec une ligne par hostname. Si le couple failed hostnameX est trouvé alors je n'affiche que celui la. Je ne veux afficher le "success" s'il existe au moins un failed pour ce hostname. Cet exemple se retrouve dans ma sortie ci-dessus.successhostname1
successhostname2
failedhostname2
je souhaite alors obtenir :
La solution XSL que j'utilisais ne peux pas marcher car je filtre sur le couple hostname+status. Cependant apres plusieurs essais vains, je n'arrive pas à trouver une solution viable. Je pensais à de l'imbrication de for-each mais pas trouvé!successhostname1
failedhostname2
merci
Partager