2010-11-11 8 views
3

Je veux transformer du xml en utilisant un fichier xsl et sortir le résultat en quelque sorte (j'utilise Android Api Level 8).Android: Convertir xml en utilisant xslt

Mon activité actuelle ressemble à ceci, mais le transformateur reste nul. LogCat lève un System.err avec org.apache.harmony.xml.ExpatParser$ParseException, en disant que le xml n'est pas bien formé, mais j'en ai vérifié l'existence.

J'ai trouvé un indice dans LogCat qui indique SystemId Unknown juste avant le message d'erreur ci-dessus.

Qu'est-ce que je fais mal?

import java.io.OutputStream; 

import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.TransformerFactoryConfigurationError; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import android.app.Activity; 
import android.os.Bundle; 

public class XsltTester extends Activity { 

    private static String TAG = XsltTester.class.getSimpleName(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try { 

      Source xmlSource = new StreamSource(this.getResources().openRawResource(R.xml.source)); 
      Source xsltSource = new StreamSource(this.getResources().openRawResource(R.xml.products)); 

      TransformerFactory transFact = TransformerFactory.newInstance(); 
      Transformer trans = transFact.newTransformer(xsltSource); 
      OutputStream output = new StringOutputStream(); 
      StreamResult result = new StreamResult(output); 
      trans.transform(xmlSource, result); 

     } catch (TransformerConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerFactoryConfigurationError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

C'est le fichier XML à transformer (de source.xml)

<?xml version="1.0"?> 
<!-- <?xml-stylesheet href="beatle.xsl" type="text/xsl"?> --> 
<person> 
<name> 
    <firstname>Paul</firstname> 
    <lastname>McCartney</lastname> 
</name> 
<job>Singer</job> 
<gender>Male</gender> 
</person> 

Et c'est le xsl correspondant (Products.xsl)

<xsl:template match="child::person"> 
<html> 
    <head> 
    <title> 
    <xsl:value-of select="descendant::firstname" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="descendant::lastname" /> 
    </title> 
    </head> 
    <body> 
    <xsl:value-of select="descendant::firstname" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="descendant::lastname" /> 
    </body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 
+0

Salut, je suis en train de pratiquer votre exemple au profit de mon propre projet, mais je ne peux pas instancier ou StringOutputStream d'importation. Où est cette classe de? Avez-vous écrit vous-même? J'utilise aussi l'API 8. Merci – TomaszRykala

Répondre

0

Je viens de découvrir quel est le problème: J'ai mis les fichiers XML/XSLT dans res/xml pas dans res/raw avec le résultat du format XML mutilé.

Beaucoup de bruit pour rien :(

0

Il vraiment Il n'y a pas beaucoup de place pour l'erreur dans un si petit morceau de code. Ma conjecture est que le XML ou XSL est à blâmer après tout. Il y a probablement une minuscule faute de frappe. Pouvez-vous joindre le XML/XSLT aussi?

+0

J'ai ajouté le XML/XSLT, un simple exemple de transformation J'ai trouvé un indice dans LogCat J'ai aussi mis la question – wonne

+0

Le XSL manque au sommet – kichik

+0

Ce n'est pas l'erreur, j'ai juste oublié de poster. – wonne

Questions connexes