Bonjour,

Etant un peu expérimenté mais pas expert de XPath, je me prend la tête sur une petite chose : la fameuse formule magique qui va me permettre d'obtenir ce qu'il me faut de mon fichier XML.

Le voici :


<texts>
 <text id="mnuCalendar">
  <language lang="FR">Calendrier</language> 
  <language lang="NL">Kalender</language> 
 </text>
 <text id="mnuLinks">
  <language lang="FR">Liens</language> 
  <language lang="NL">Links</language> 
 </text>
</texts>


On aura vite compris qu'il s'agit d'un fichier contenant les traductions de certaines parties de pages web.

Le contexte est le PHP mais ca importe peu ici. J'ai fait une fonction qui lit ce fichier et retourne un tableau avec comme clé ceci : <text id="mnuLinks"> et comme valeur, le contenu du noeud "language" correspondant à la langue choisie.

Je voudrais récupérer par exemple le fichier suivant :


<texts>
 <text id="mnuCalendar">
  <language lang="FR">Calendrier</language> 
 </text>
 <text id="mnuLinks">
  <language lang="FR">Liens</language> 
 </text>
</texts>


... si l'utilisateur est francophone.

Ce qui m'occupe est donc de pouvoir récupérer tous les noeuds <text> et le noeud qu'ils contiennent dont l'attribut "lang" est égal à true.

J'ai testé sans succès l'expression " /text/language[@lang="FR"] " mais visiblement c'est pas ca...

J'ai aussi essayé avec le prédicat "descendant-or-self" mais j'ai du mal m'y prendre car j'ai une forte impression que tous les éléments ci-dessus sont susceptibles de ne pas être loins de la réponse.

Quelqu'un aurait-il une idée ?

Merci d'avance !

Heriquet
Modifié par Heriquet (17 Feb 2006 - 08:41)
Autre proposition de solution possible :

//text/descendant-or-self::[language[@lang='FR']]

...pas encore pu tester mais c'est le flou total... besoin d'aide ! Smiley ohwell
Beaucoup de solutions conviennent. Par ailleurs je ne suis pas certain que ton problème ne provienne que d'un souci Xpath.
Voici un template simple relatif à ton exemple :
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()[not(@lang!='FR')]"/>
  </xsl:copy>
</xsl:template>
Je pense avoir trouvé la solution :

/texts/text/language[@lang='FR']

Je dois tester sur l'applic mais ca semble être ca.

Je précise que j'utilise DOM et PHP pour ces manipulations.

Merci,

A+

Heriquet

PS : pour info je mettrais la solution finale sur le site, ce soir normalement.
Sans doute n'ai je pas bien compris ton problème ? mais il me semble que puisque tu manipules des objets XML sous PHP, le plus simple pour obtenir le résultat est quand même d'appliquer une transformée XSL (voir le code donné ci-dessus) à ton objet XML source.
Bon je suis pas spécialiste...

J'ai ma solution bien en tête et normalement ca doit marcher.

Comme tu dis, il doit y avoir plusieurs possibilités. Si ca t'intéresse, je mettrais la mienne complête ce soir, ou alors je te l'envoi par mail.

Mon idée est de charger un tableau (provenant du fichier XML) en mémoire, et lors de la création de la page, d'aller y puiser les traductions de mes textes à l'aide d'une clé.

Je suis ouvert à toute proposition d'optimisation, car j'aimerais obtenir le meilleur résultat possible mais je ne connais pas tout des technologies Web dans lesquelles je débute.

A+