Bonjour à tous,
Cela fait déjà quelques jours que je suis sur un problème de XSLT. J'ai épluché pas mal de tuto, de fofo mais impossible de trouver une solution qui marche à 100%. A chaque fois, il y a un petit truc qui coince...
Je vous explique :
A partir de ce fichier XML, je cherche à créer un fichier intermédiaire qui va remodeler les infos d'une façon différente, c'est à dire 1 bloc de données XML par TopologyConfiguration, en sachant que le premier bloc de TopologyConf contiendra les infos du KeyValueGroupe.
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 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AcceptConfigurationTransmit xmlns:cdm="http://www.win.com/cdm/v2" xmlns="http://www.win.com/common/configurationservice/v2" mode="ConfigAdministrative" mandator="WIN" subsystem="Config"> <ObjectConfiguration name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"> <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66" /> <cdm:AttributeGroup name="Group Simulation"> <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height" /> <cdm:Attribute type="int" value="1" name="nodeType" /> </cdm:AttributeGroup> </ObjectConfiguration> <ObjectConfiguration name="S1_009" uuid="12345678-0000-0000-0000-000000080002" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"> <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66" /> <cdm:AttributeGroup name="Group Simulation"> <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height" /> <cdm:Attribute type="int" value="0" name="nodeType" /> </cdm:AttributeGroup> </ObjectConfiguration> <TopologyConfiguration released="false" topologyType="Fahrweg" isTemplate="false" description="network test" name="BIGNET_LIVE" uuid="12345678-1234-1234-1234-123456789012" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"> <cdm:Subsystems> <cdm:Subsystem>Sim</cdm:Subsystem> </cdm:Subsystems> <cdm:TopologyNodes> <cdm:TopologyNode yCoordinate="10000.0" xCoordinate="10000.0" segmentName="" name="INP_1" uuid="12345678-5678-0000-0000-123456780001"> <cdm:RepresentedCDMObject uuid="12345678-aaaa-aaaa-0000-123456780001"> <cdm:CDMObject>12345678-0000-0000-0000-000000080001</cdm:CDMObject> <cdm:Qualifier>SIMU</cdm:Qualifier> </cdm:RepresentedCDMObject> <cdm:DecoratingCDMObject uuid="12345678-6666-6666-6666-ddddddd80001"> <cdm:CDMObject>12345678-6666-6666-6666-123456780001</cdm:CDMObject> <cdm:Qualifier>SIMU_InputState</cdm:Qualifier> <cdm:Qualifier>SIMU_OutputState</cdm:Qualifier> </cdm:DecoratingCDMObject> </cdm:TopologyNode> </cdm:TopologyNodes> </TopologyConfiguration> <TopologyConfiguration> ..... </TopologyConfiguration> <KeyValueGroupConfiguration uuid="4bb0f010-cf94-11de-8a39-0800200c9a66" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"> <cdm:KeyValue type="string" value="GasCompo" key="QualityTrackingStyle" validTo="" validFrom="2009-05-01T06:00:00.000+00:02" /> </KeyValueGroupConfiguration> <KeyValueGroupConfiguration> ...... </KeyValueGroupConfiguration> </AcceptConfigurationTransmit>
Mon fichier résultat devrait ressembler à ça :
C'est uniquement de la copie selective de balise à différentes niveaux. Une fois le fichier généré, je le reparse pour faire 1 fichier XML / bloc de données...
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 Nombre de TopologyConfig #bloc 1: <AcceptConfigurationTransmit ....> <ObjectConfiguration1>....<ObjectConfigurationN> <TopologyConfiguration1> <KeyValueConfiguration1>....<KeyValueConfigurationN> </AcceptConfigurationTransmit> #bloc 2: <AcceptConfigurationTransmit ....> <ObjectConfiguration1>....<ObjectConfigurationN> <TopologyConfiguration2> </AcceptConfigurationTransmit> #bloc 3: <AcceptConfigurationTransmit ....> <ObjectConfiguration1>....<ObjectConfigurationN> <TopologyConfiguration3 </AcceptConfigurationTransmit> etc...
Voici mon XSL :
La sortie :
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
67
68
69
70
71
72
73
74 <?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:confserv="http://www.wintsm.com/common/configurationservice/v2" exclude-result-prefixes="confserv" > <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="ISO-8859-1" /> <!-- To avoid empty characters --> <xsl:strip-space elements="*" /> <xsl:template match="/"> <!-- Get the number of TopologyConf --> <xsl:variable name="nbTopo" select="count(//confserv:TopologyConfiguration)" /> <xsl:value-of select="$nbTopo" /> <xsl:text> </xsl:text> <xsl:call-template name="buildXML" /> </xsl:template> <xsl:template name="buildXML"> <xsl:for-each select="/confserv:AcceptConfigurationTransmit/confserv:TopologyConfiguration"> <!-- balise ouvrante --> <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit"/> <xsl:text> </xsl:text> <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit/confserv:ObjectConfiguration" /> <xsl:text> </xsl:text> <xsl:call-template name="showTopo"/> <xsl:text> </xsl:text> <xsl:if test="count(preceding::confserv:TopologyConfiguration) = 0"> <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit/confserv:KeyValueGroupConfiguration" /> </xsl:if> <xsl:text> </xsl:text> <!-- balise fermante --> <xsl:text disable-output-escaping="yes"></AcceptConfigurationTransmit></xsl:text> <xsl:text> </xsl:text> </xsl:for-each> <xsl:text> ENDOFFILE </xsl:text> </xsl:template> <xsl:template match="/confserv:AcceptConfigurationTransmit"> <xsl:copy> <xsl:copy-of select="@*" /> </xsl:copy> </xsl:template> <xsl:template match="/confserv:AcceptConfigurationTransmit/confserv:ObjectConfiguration"> <xsl:copy-of select="." /> </xsl:template> <xsl:template name="showTopo"> <xsl:copy> <xsl:copy-of select="@* | node()" /> </xsl:copy> </xsl:template> <xsl:template match="confserv:KeyValueGroupConfiguration"> <xsl:copy> <xsl:copy-of select="@* | node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
J'ai les bonnes balises dans le bon ordre, par contre :
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 2 <AcceptConfigurationTransmit xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config"/> <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"> <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66"/> <cdm:AttributeGroup name="Group Simulation"> <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height"/> <cdm:Attribute type="int" value="1" name="nodeType"/> </cdm:AttributeGroup> </ObjectConfiguration> <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" name="S1_009" uuid="12345678-0000-0000-0000-000000080002" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"> <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66"/> <cdm:AttributeGroup name="Group Simulation"> <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height"/> <cdm:Attribute type="int" value="0" name="nodeType"/> </cdm:AttributeGroup> </ObjectConfiguration> <TopologyConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" released="false" topologyType="Fahrweg" isTemplate="false" description="network test" name="BIGNET_LIVE" uuid="12345678-1234-1234-1234-123456789012" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"> <cdm:Subsystems> <cdm:Subsystem>Sim</cdm:Subsystem> </cdm:Subsystems> <cdm:TopologyNodes> <cdm:TopologyNode yCoordinate="10000.0" xCoordinate="10000.0" segmentName="" name="INP_1" uuid= "12345678-5678-0000-0000-123456780001"> <cdm:RepresentedCDMObject uuid="12345678-aaaa-aaaa-0000-123456780001"> <cdm:CDMObject>12345678-0000-0000-0000-000000080001 </cdm:CDMObject> <cdm:Qualifier>SIMU</cdm:Qualifier> </cdm:RepresentedCDMObject> </cdm:TopologyNode> </cdm:TopologyNodes> </TopologyConfiguration> <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" uuid="12345678-1234-1234-1234-123456789040" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"> <cdm:KeyValue type="string" value="Yes" key="GasQualityTracking" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/> <cdm:KeyValue type="string" value="Off" key="HeatDynamics" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/> </KeyValueGroupConfiguration> <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" uuid="1506cc10-cf94-11de-8a39-0800200c9a66" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"> <cdm:KeyValue type="float" value="51.0" key="BasicPressure" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/> <cdm:KeyValue type="string" value="3" key="SettingNormalCond" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/> </KeyValueGroupConfiguration> <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" uuid="4bb0f010-cf94-11de-8a39-0800200c9a66" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"> <cdm:KeyValue type="string" value="GasCompo" key="QualityTrackingStyle" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02"/> </KeyValueGroupConfiguration> </AcceptConfigurationTransmit> ENDOFFILE
j'obtiens :
Alors que je voudrais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <AcceptConfigurationTransmit xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config"/> <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm= "http://www.win.com/cdm/v2" name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02">
- Le xmlns n'est pas dans le bon ordre dans la 1ère balise
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <AcceptConfigurationTransmit xmlns:cdm="http://www.wintsm.com/cdm/v2" xmlns="http://www.wintsm.com/common/configurationservice/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config"> <ObjectConfiguration name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom= "2009-05-01T06:00:00.000+00:02">
- la 1ère balise se termine par subsystem="Config"/> au lieu de subsystem="Config">
- les namespaces apparaîssent dans la 2ième balise alors qu'il ne devrait pas...
Pourtant, j'ai mis le exclude-result-prefixes, mais il n'a pas l'air de vouloir marcher. Je dois certainement me tromper entre : @*, *, ., node()...
Pourriez vous m'aider s'il vous plaît ??
D'avance, merci pour votre aide.
Nico alias Dread38
Partager