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

标签 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. 在 res/raw 下构建您的 XSLT 文件,
  2. 解析您的 XML 或准备好您的 XML(在 res/raw 中)
  3. 最后,使用这些在 Android Webview 中显示

您的 cdcatalog_with_xsl.xmlcdcatalog.xsl 必须在 res/raw 中/em>。我构建了满足您需求的 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

希望对大家有所帮助!

关于xml - 如何用xslt转换xml并在Android webview中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318998/

相关文章:

java - 为什么 minHeight 属性在 WebView Android 中不起作用?

ios - 如何强制在 WebView 中单击的任何链接在 Safari 中打开?

javascript - 是否可以在 native Android 应用程序中实现 HTML5(我计划使用 WebRTC)作为 WebView?

java - 解析 xml 时检查属性是否存在

ios - 艺术家 ID 的 iTunes Store RSS 提要?

xml - Youtube XML ASP经典问题

Python 3.5 - 更新 XML 并保留 &lt;!DOCTYPE>

xml - XSLT 将结果分成 3 组

xslt - 选择属性不同的几个元素之一

sorting - XSL 中的条件排序