Bonjour,

J'ai déja réaliser une partie de ce que je voulais réaliser mais j'ai encore un petit probleme.

Je vous explique mon probleme, Alors en fait un utilisateur va devoir choisir 2 langues(ou x langues),enfin 1 langue dans une liste et une autre langue dans une autre liste...(ou plusieurs autres listes).

Je récupere ensuite la langue des listes en parametres,que je transmets à php et que je transmets ensuite à ma feuille de style XSL pour creer un fichier XML en fonction de ces parametres.

En fait j'ai bien le fichier de sortie que je veux mais je voudrai avoir maintenant l'ordre dans lequel j'ai selectionné mes langues,en effet mais parametres sont "ls","lt","lt2","lt3","lt4","lt5"...et j'aimerai que la langue qui corresponde à "ls" soit toujours la 1ere,celle qui correspond à "lt" toujours la deuxieme,etc...

Je pense que ce n'est pas tres clair car je n'arrive pas bien à expliquer mon idée mais je vais vous mettre le code en didans ce que j'attends en entrée et en sortie.

En entrée j'ai un fichier XML de ce type :


 
<?xml version="1.0" encoding="UTF-8"?>
 <rows>
	<row id="0">
		<cell xml:lang="en"><![CDATA[English sentence 1]]></cell>
		<cell xml:lang="fr"><![CDATA[Phrase Francaise 1]]></cell>
                <cell xml:lang="sp"><![CDATA[Phrase Espagnol 1]]></cell>
                <cell xml:lang="jp"><![CDATA[Phrase Japonaise 1]]></cell>
                <cell xml:lang="it"><![CDATA[Phrase Italienne 1]]></cell>
                <cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
	</row>
 
	<row  id="1">
		<cell xml:lang="en"><![CDATA[English sentence 2]]></cell>
		<cell xml:lang="fr"><![CDATA[Phrase Francaise 2]]></cell>
                <cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
                <cell xml:lang="jp"><![CDATA[Phrase Japonaise 2]]></cell>
                <cell xml:lang="it"><![CDATA[Phrase Italienne 2]]></cell>
                <cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
	</row>

</rows>



Les <![CDATA[..]]> , c'est pour pouvoir lire les effets visuels mais ce n'est pas tres important pour l'instant.

Et en fait j'aimerai que si l'utilisateur choisisse Arabe en 1ere langue donc "ls"="ar" et Espagnol en 2eme langue donc "lt"="sp" celà ne prenne que les balise de ces langues et renvoie un XML ordonné de la forme:



 
<?xml version="1.0" encoding="UTF-8"?>
 
<rows>
 	<row id="0">
 		<cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
                <cell xml:lang="sp"><![CDATA[Phrase Espagnole 1]]></cell>
         </row>
 
	<row  id="1">
 		<cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
                <cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
         </row>
 
</rows>



car pour l'instant j'obtiens celà:


 
<?xml version="1.0" encoding="UTF-8"?>
 
<rows>
 	<row id="0">
 		<cell xml:lang="sp"><![CDATA[Phrase Espagnole 1]]></cell>
                <cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
         </row>
 
	<row  id="1">
 		<cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
                <cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
         </row>
 
</rows>



Voilà et j'obtiens celà avec ce code XSL:


<?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:param name="ls" />
<xsl:param name="lt" />
  
<xsl:template match="rows">

<rows>  
<xsl:for-each select="row">  
<row id='{position()-1}'>  
<xsl:apply-templates select="cell" />  
</row>  
</xsl:for-each>  
</rows>
</xsl:template>

<xsl:template match="cell">
	<xsl:variable name="lang" select="@xml:lang"/>
	<xsl:if test="$lang=$ls">
	<cell xml:lang='{$lang}'>
	<xsl:value-of select="." />
    </cell>	
	</xsl:if>
	<xsl:if test="$lang=$lt">
	<cell xml:lang='{$lang}'>
	<xsl:value-of select="." />
    </cell>	
	</xsl:if>
	
</xsl:template>
 
</xsl:stylesheet>


Je vous donne aussi mon code PHP si ca peut intérésser certain de passer des parametres à une feuille XSL:


<?php

$ls=$_POST["ls"];
$lt=$_POST["lt"];

$xh = xslt_create();
$filebase = 'file://' . getcwd () . '/test/';
xslt_set_base($xh,$filebase);
   
$xml = "SOURCE-XML.xml";
$xsl = "filtreXML.xsl";
touch("SOURCE-P-XML.xml");
$resultdoc ="SOURCE-P-XML.xml" ;
   
$parameters = array('ls' => $ls,'lt' => $lt);

$result = xslt_process($xh,$xml,$xsl,$resultdoc,NULL,$parameters);
if (!$result)
{
    die(sprintf("Cannot process XSLT document [%d]: %s",xslt_errno($xh), xslt_error($xh)));
}
echo "Result: ".$result."<br />";
xslt_free($xh);
?>


Voilà,j'espere que c'est plus clair,en fait il m'aurait fallu quelque choses sous XSL pour trier mais en fonction de mes parametres....donc si vous connaissez quelque chose de ce genre,c'est avec grand plaisir!!!

Merci
Modifié par titoff85 (11 Aug 2007 - 12:24)
Bonjour,

J'ai finalment trouvé la solution en allant voir les options de la fonction xsl:sort et j'ai vu qu'il était possible de mettre plusieurs clés de tri.

Je vous mets donc la solution si ca peu servir à quelqu'un:


<?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:param name="ls" />
<xsl:param name="lt" />
<xsl:param name="lt2" />
  
<xsl:template match="rows">
 
<rows>  
<xsl:for-each select="row">  
<row id='{position()-1}'>  
<xsl:for-each select="cell">

<xsl:sort select="@xml:lang=$lt2" />
<xsl:sort select="@xml:lang=$lt" />
<xsl:sort select="@xml:lang=$ls" />

<xsl:choose>
  <xsl:when test="@xml:lang=$ls">
	<xsl:copy-of select="." />
  </xsl:when>
  <xsl:when test="@xml:lang=$lt">
	<xsl:copy-of select="." />
  </xsl:when>
  <xsl:when test="@xml:lang=$lt2">
	<xsl:copy-of select="." />
  </xsl:when>
</xsl:choose>
</xsl:for-each>
</row>  
</xsl:for-each>  
</rows>
</xsl:template>
 
</xsl:stylesheet>


et avec celà j'obtiens bien un fichier de sortie de la forme (j'ai remplacé les langues par les parametres pour que ce soit compréhensible):


<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <row id="0">
    <cell xml:lang="$ls">Phrase 1 dans la langue ls </cell>
    <cell xml:lang="$lt">Phrase 1 dans la langue lt</cell>
    <cell xml:lang="$lt2">Phrase 1 dans la langue lt2</cell>
  </row>
  <row id="1">
    <cell xml:lang="$ls">Phrase 2 dans la langue ls </cell>
    <cell xml:lang="$lt">Phrase 2 dans la langue lt</cell>
    <cell xml:lang="$lt2">Phrase 2 dans la langue lt2</cell>
  </row>
</rows>


Voilà,bonne journée et bon week-end et bonne vacances pour certains Smiley cligne