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 :

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>
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.
Mon fichier résultat devrait ressembler à ça :
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...
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...

Voici mon 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
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">&lt;/AcceptConfigurationTransmit&gt;</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>
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
 
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'ai les bonnes balises dans le bon ordre, par contre :
j'obtiens :
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">
Alors que je voudrais :
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">
- Le xmlns n'est pas dans le bon ordre dans la 1ère balise
- 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