如何使用xslt转换xml并在Android webview中显示它

时间:2013-05-01 13:27:05

标签: xml xslt webview transform

我正在尝试将由xsl文件转换的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中?

1 个答案:

答案 0 :(得分:10)

它非常棘手,我试着让它易于理解。请按照以下步骤_

  1. 在res / raw,
  2. 下构建您的XSLT文件
  3. 要么解析XML,要么准备好使用XML(在res / raw中)
  4. 最后,使用这些以在Android Webview中显示
  5. 你的cdcatalog_with_xsl.xml&amp; cdcatalog.xsl 中必须有res/raw。我已经构建了 LoadXSLTinWebview 来满足您的需求_

    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

    我希望这会对所有人有所帮助!