2013-05-01 35 views
6

我试图在xml文件中显示由xsl文件转换的xml数据到Android应用程序的webview中。但是,数据不按预期显示。如何使用xslt转换xml并在Android中显示它webview

XML file used (cdcatalog_with_xsl.xml) -- Sample xml data 
-------------------------------------- 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 
<!-- Edited by XMLSpy® --> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
</catalog> 


XSL file used (cdcatalog.xsl) -- Sample xsl file 
----------------------------- 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
     </tr> 
     <xsl:for-each select="catalog/cd"> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="artist"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

有些机构会帮助我用示例代码将此数据加载到Android应用的webview中吗?

+0

您可能需要更具体地了解预期产出。 – Henrik 2013-05-01 13:47:03

+0

我无法上传输出的屏幕截图...但是,预期会显示一个包含xml中两列和两行数据的表。 – 2013-05-01 14:01:38

回答

10

它很棘手,我尽量让它容易理解。只要按照下面steps_

  1. 打造下RES /原始XSLT文件,
  2. 无论是分析XML或与您的XML准备好(在res/RAW)
  3. 最后,消费这些在Android的网页视图中显示

cdcatalog_with_xsl.xml & cdcatalog.xsl必须有在res/raw。我有建LoadXSLTinWebview该服务器的need_

public class LoadXSLTinWebview extends Activity { 

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

    getWindow().requestFeature(Window.FEATURE_PROGRESS); 

    WebView webview = new WebView(this); 
    setContentView(webview); 

    //Reading XSLT 
    String strXSLT = GetStyleSheet(R.raw.cdcatalog); 
    //Reading XML 
    String strXML = GetStyleSheet(R.raw.cdcatalog_with_xsl); 
    /* 
    * Loading XSLT... 
    */ 
     //Transform ... 
     String html=StaticTransform(strXSLT, strXML); 
     //Loading the above transformed CSLT in to Webview... 
     webview.loadData(html,"text/html",null); 

} 

/* 
* Transform XSLT to HTML string 
*/ 
public static String StaticTransform(String strXsl, String strXml) { 
    String html = ""; 

    try { 

     InputStream ds = null; 
     ds = new ByteArrayInputStream(strXml.getBytes("UTF-8")); 

     Source xmlSource = new StreamSource(ds); 

     InputStream xs = new ByteArrayInputStream(strXsl.getBytes("UTF-8")); 
     Source xsltSource = new StreamSource(xs); 

     StringWriter writer = new StringWriter(); 
     Result result = new StreamResult(writer); 
     TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(xsltSource); 
     transformer.transform(xmlSource, result); 

     html = writer.toString(); 

     ds.close(); 
     xs.close(); 

     xmlSource = null; 
     xsltSource = null; 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (TransformerConfigurationException e) { 
     e.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e) { 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return html; 
} 

/* 
* Read file from res/raw... 
*/ 
private String GetStyleSheet(int fileId) { 
    String strXsl = null; 

     InputStream raw = getResources().openRawResource(fileId); 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     int size = 0; 
     // Read the entire resource into a local byte buffer. 
     byte[] buffer = new byte[1024]; 
     try { 
      while ((size = raw.read(buffer, 0, 1024)) >= 0) { 
       outputStream.write(buffer, 0, size); 
      } 
      raw.close(); 

      strXsl = outputStream.toString(); 

      Log.v("Log", "xsl ==> " + strXsl); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    return strXsl; 

} 

} 

OutPut:

output

我希望这将帮助所有!

+0

是的,这可以帮助我很多。感谢张贴这节省了我的时间。 – 2016-01-16 04:59:52

+0

谢谢你的回答!只注意到您在onCreate中更改了XML和XSL。你应该改变这一点,我第一次尝试这个代码,它不工作。它只改变了2个字符串名称;) – 2016-11-18 09:09:24