Thread View: fr.comp.text.xml
4 messages
4 total messages
Started by CrazyCat
Mon, 04 Jan 2010 17:44
Xslt avec une seconde base xml
Author: CrazyCat
Date: Mon, 04 Jan 2010 17:44
Date: Mon, 04 Jan 2010 17:44
47 lines
2513 bytes
2513 bytes
Bonjour � tous, et meilleurs voeux !
Je dois faire une transformation XSL sur un fichier (jusque l� pas de
probl�me), et ce fichier contient des identifiants qui doivent me
permettre de retrouver des libell�s pr�sents dans un autre fichier XML.
Mon probl�me est que je ne vois pas trop comment faire. J'ai suivi une
piste qui m'am�nerait � faire:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:strip-space elements="*" />
<!-- Only make xml file if it's an agency which is a client -->
<!-- Parsing the xml file -->
<xsl:template match='Locations'>
<xsl:for-each select='Location'>
<xsl:value-of select="ZipCode" /> :
<xsl:variable name="CityId"
select="document('/home/user/Cities.xml', /CityId)" />
<xsl:value-of select="$CityId/@CityId" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Mon fichier initial est de la forme:
<?xml version="1.0" encoding="utf-8"?>
<root>
<Locations>
<Location>
<Address>Une adresse</Address>
<ZipCode>75000</ZipCode>
<CityId>1</CityId>
</Location>
</Locations>
</root>
Et mon fichier Cities.xml de la forme:
<Cities>
<City CityId="1">Paris</City>
<City CityId="2">Lyon</City>
</Cities>
Cette solution ne semble pas marcher, quelqu'un aurait-il une id�e ?
Merci d'avance.
Re: Xslt avec une seconde base xml
Author: Alain Ketterlin
Date: Mon, 04 Jan 2010 19:56
Date: Mon, 04 Jan 2010 19:56
62 lines
3430 bytes
3430 bytes
CrazyCat <crazycat@c-p-f.org> writes:
> Je dois faire une transformation XSL sur un fichier (jusque là pas de
> problème), et ce fichier contient des identifiants qui doivent me
> permettre de retrouver des libellés présents dans un autre fichier
> XML.
> <xsl:template match='Locations'>
> <xsl:for-each select='Location'>
> <xsl:value-of select="ZipCode" /> :
> <xsl:variable name="CityId"
> select="document('/home/user/Cities.xml', /CityId)" />
> <xsl:value-of select="$CityId/@CityId" />
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
Si le fichier ne dépend vraiment pas du contexte, autant le mettre dans
une variable globale (pour éviter le coût avec les processeurs qui
n'optimiseraient pas).
D'autre part, pourquoi /CityId comme second paramètre ? Cet élément
n'existe pas. J'imagine que tu veux que le fichier Cities.xml soit
recherché dans "le même répertoire" que le fichier initial. Le second
argument de document() sert bien à cela, mais encore faut-il qu'il
existe... En plus tu donnes un chemin absolu. Je te conseille de relire
la section portant sur document() dans la recommandation XSLT. Pour ton
cas, je te suggère :
- soit document("Cities.xml",/)
- soit document("/home/user/Cities.xml")
Enfin, $CityId/@CityId recherche l'attribut CityId dans l'élément
désigné par $CityId. Ce n'est pas non plus ce que tu cherches. Tu
cherches dans le document de racine $CityId l'élément City dont
l'attribut CityId a la même valeur que l'élément CityId de l'élément
contextuel. En clair : $CityId/Cities/City[@CityId=current()/CityId]
mais je te conseille de passer par une variable, puisque tout porte le
même nom.
> Mon fichier initial est de la forme:
> <?xml version="1.0" encoding="utf-8"?>
> <root>
> <Locations>
> <Location>
> <Address>Une adresse</Address>
> <ZipCode>75000</ZipCode>
> <CityId>1</CityId>
> </Location>
> </Locations>
> </root>
>
> Et mon fichier Cities.xml de la forme:
> <Cities>
> <City CityId="1">Paris</City>
> <City CityId="2">Lyon</City>
> </Cities>
-- Alain.
Re: Xslt avec une seconde base xml
Author: CrazyCat
Date: Mon, 04 Jan 2010 20:23
Date: Mon, 04 Jan 2010 20:23
25 lines
2164 bytes
2164 bytes
Le 04/01/2010 20:56, Alain Ketterlin a écrit :
> Si le fichier ne dépend vraiment pas du contexte, autant le mettre dans
> une variable globale (pour éviter le coût avec les processeurs qui
> n'optimiseraient pas).
Tout à fait, pour l'instant j'en suis à la version "j'essaye de faire
tourner" donc le code n'est pas du tout optimisé.
> existe... En plus tu donnes un chemin absolu. Je te conseille de relire
> la section portant sur document() dans la recommandation XSLT. Pour ton
> cas, je te suggère :
> - soit document("Cities.xml",/)
> - soit document("/home/user/Cities.xml")
Noté.
> Enfin, $CityId/@CityId recherche l'attribut CityId dans l'élément
> désigné par $CityId. Ce n'est pas non plus ce que tu cherches. Tu
> cherches dans le document de racine $CityId l'élément City dont
> l'attribut CityId a la même valeur que l'élément CityId de l'élément
> contextuel. En clair : $CityId/Cities/City[@CityId=current()/CityId]
> mais je te conseille de passer par une variable, puisque tout porte le
> même nom.
Ok, je teste ça dès demain matin et je dis quoi.
Re: Xslt avec une seconde base xml
Author: Marc
Date: Tue, 05 Jan 2010 07:09
Date: Tue, 05 Jan 2010 07:09
64 lines
3216 bytes
3216 bytes
Bonjour,
Voici ce que je ferais (non test�)
<xsl:variable name="CitiesFile" select="document('Cities.xml')/>
<xsl:template match='Locations'>
<xsl:for-each select='Location'>
<xsl:value-of select="ZipCode" />
<xsl:variable name="CityId" select="CityId"/>
<xsl:variable name="City" select="$CitiesFile//City[@CityId=$CityId]" />
<xsl:value-of select="$City" />
</xsl:for-each>
</xsl:template>
Es tu sur que tu as besoin d'un for-each, un template n'est suffisant?
Marc
Le 04/01/2010 18:44, CrazyCat a �crit :
> Bonjour � tous, et meilleurs voeux !
>
> Je dois faire une transformation XSL sur un fichier (jusque l� pas de
> probl�me), et ce fichier contient des identifiants qui doivent me
> permettre de retrouver des libell�s pr�sents dans un autre fichier XML.
>
> Mon probl�me est que je ne vois pas trop comment faire. J'ai suivi une
> piste qui m'am�nerait � faire:
>
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="xml" encoding="utf-8" indent="yes" />
> <xsl:strip-space elements="*" />
> <!-- Only make xml file if it's an agency which is a client -->
> <!-- Parsing the xml file -->
> <xsl:template match='Locations'>
> <xsl:for-each select='Location'>
> <xsl:value-of select="ZipCode" /> :
> <xsl:variable name="CityId" select="document('/home/user/Cities.xml',
> /CityId)" />
> <xsl:value-of select="$CityId/@CityId" />
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
>
> Mon fichier initial est de la forme:
> <?xml version="1.0" encoding="utf-8"?>
> <root>
> <Locations>
> <Location>
> <Address>Une adresse</Address>
> <ZipCode>75000</ZipCode>
> <CityId>1</CityId>
> </Location>
> </Locations>
> </root>
>
> Et mon fichier Cities.xml de la forme:
> <Cities>
> <City CityId="1">Paris</City>
> <City CityId="2">Lyon</City>
> </Cities>
>
> Cette solution ne semble pas marcher, quelqu'un aurait-il une id�e ?
>
> Merci d'avance.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads