[XSLT] Récupération de données XML et namespace
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:
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:
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:
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> |
La sortie :
Code:
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:
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:
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 ?? :roll:
D'avance, merci pour votre aide.
Nico alias Dread38