7

我正在尝试将由 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 中吗?

4

1 回答 1

11

它相当棘手,我尽量让它易于理解。只需按照以下步骤_

  1. 在 res/raw 下构建您的 XSLT 文件,
  2. 解析您的 XML 或准备好您的 XML(在 res/raw 中)
  3. 最后,使用这些在 Android Webview 中显示

你的cdcatalog_with_xsl.xml&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:

输出

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

于 2013-10-16T11:20:01.317 回答