2010-09-01 12 views
0

J'utilise javax.xml.transform.Transformer.transform() pour convertir un xml en un autre via une feuille de style xsl. Je voudrais programmer le tri du premier niveau des enfants, mais je ne sais pas comment y aller. J'ai vérifié le docs, mais je ne comprends pas quel type de propriété/paramètre à utiliser et comment spécifier en sorte:Comment spécifier un sortBy via un appel javax.xml.transform.Transformer.transform()?

<xsl:sort select="*need to get property or parameter to here*"/>

Je suis ouvert à d'autres idées, mais préfère ne pas analyser le résultat XML dans un document W3C.

Edit: Pour clarifier Je cherche à définir la clé de tri et de la direction pour les éléments dans une balise xsl:for-each via l'API Transformer.

+0

On ne sait pas si vous voulez juste de définir l'expression de tri (très simple comme la réponse de Thorbjørn) ou vous vouloir passer la clé de tri en tant que paramètre. –

+0

Je souhaite transmettre la clé de tri en tant que paramètre via l'API Transformer. Je mentionne le tag xsl: sort uniquement parce que c'était la seule méthode de tri que je pouvais trouver. – Adam

Répondre

1

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="pSortingBy" select="/root/@sorting"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/root"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"> 
       <xsl:sort select="*[name()=$pSortingBy]"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée:

<root sorting="prop4"> 
    <elem1> 
     <prop1>A</prop1> 
     <prop2>B</prop2> 
     <prop3>C</prop3> 
     <prop4>D</prop4> 
     <prop5>A</prop5> 
    </elem1> 
    <elem2> 
     <prop1>B</prop1> 
     <prop2>C</prop2> 
     <prop3>D</prop3> 
     <prop4>A</prop4> 
     <prop5>B</prop5> 
    </elem2> 
    <elem3> 
     <prop1>C</prop1> 
     <prop2>D</prop2> 
     <prop3>A</prop3> 
     <prop4>B</prop4> 
     <prop5>C</prop5> 
    </elem3> 
</root> 

Sortie:

<root sorting="prop4"> 
    <elem2> 
     <prop1>B</prop1> 
     <prop2>C</prop2> 
     <prop3>D</prop3> 
     <prop4>A</prop4> 
     <prop5>B</prop5> 
    </elem2> 
    <elem3> 
     <prop1>C</prop1> 
     <prop2>D</prop2> 
     <prop3>A</prop3> 
     <prop4>B</prop4> 
     <prop5>C</prop5> 
    </elem3> 
    <elem1> 
     <prop1>A</prop1> 
     <prop2>B</prop2> 
     <prop3>C</prop3> 
     <prop4>D</prop4> 
     <prop5>A</prop5> 
    </elem1> 
</root> 

Remarque: Vous pouvez définir pSortingBy param comme nom d'élément suivant les spécifications de votre processeur XSLT.

Modifier: Je ne suis pas un expert en java, mais je pense que vous pouvez faire:

javax.xml.transform.TransformerFactory transFact = 
         javax.xml.transform.TransformerFactory.newInstance(); 
javax.xml.transform.Transformer trans = transFact.newTransformer(xsltSource); 
trans.setParameter("pSortingBy", "prop5"); 
+0

J'apprécie votre réponse, mais vous définissez pSortingBy avec le document XML d'entrée. Est-il possible de définir pSortingBy via l'API Transformer dans votre exemple? Dans les docs de Transformer je vois setParamter(), mais je ne comprends pas comment l'appeler pour que je puisse obtenir le paramètre en utilisant '$ pSortingBy' dans le xsl. – Adam

+0

@Adam: C'est une autre question impliquant une fonctionnalité spécifique du processeur XSLT. Et c'est pourquoi Dimitre a revérifié votre question. –

+0

@Alejandro Merci, cela clarifie comment setParameter interagit avec le xsd. – Adam

0

Il doit aller dans un for-each ou apply-templates, et vous spécifiez l'expression à trier.

De http://www.w3schools.com/xsl/el_sort.asp:

<xsl:for-each select="catalog/cd"> 
     <xsl:sort select="artist"/> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="artist"/></td> 
     </tr> 
    </xsl:for-each> 
+0

à droite, je comprends tous les exemples de w3schools. Ma question est comment placer le blah dans '' pour être, par exemple, titre OU artiste par programme de l'API javax Transformer? – Adam