2010-11-11 123 views
3

我想使用xsl文件转换某些xml并以某种方式输出结果(我使用的是Android Api Level 8)。Android:使用xslt转换xml

我目前的活动看起来像这样,但变压器保持空。 LogCat抛出System.errorg.apache.harmony.xml.ExpatParser$ParseException,说这个XML格式不正确,但我确信它是。

我在LogCat中发现一条暗示SystemId Unknown就在上述错误消息之前。

我在做什么错?

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(); 
     } 
    } 
} 

这是XML文件进行改造(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> 

而且这也有相应的XSL(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

嗨,我想练习我自己的项目的效益您的例子庸人自扰,但我不能实例化或进口StringOutputStream。如果从这个类吗?你自己写的吗?我也使用API​​ 8谢谢 – TomaszRykala 2011-03-13 17:53:02

回答

0

我刚刚发现问题所在:我将XML/XSLT文件放在res/xml中,而不是在res/raw中导致XML格式错乱。

无事:(

0

真在这么小的一段代码中没有太多的错误空间。我的猜测是,XML或XSL应该归咎于所有。它可能有一个小错字。你还可以附加XML/XSLT吗?

+0

我添加了XML/XSLT这只是一个简单的示例转换我还在LogCat中发现了一个提示我也提出了这个问题 – wonne 2010-11-14 18:46:38

+0

XSL缺少在顶部 – kichik 2010-11-14 19:03:35

+0

这不是错误,我只是忘了发布。 – wonne 2010-11-15 11:29:25