2013-05-01 9 views
6

Próbuję wyświetlić dane xml, które zostały przekształcone przez plik Xsl, na webview w aplikacji Android. Jednak dane nie są wyświetlane zgodnie z oczekiwaniami.Jak przekształcić xml za pomocą xslt i wyświetlić go w przeglądarce internetowej

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> 

Czy ktoś mógłby mi pomóc z przykładowym kodem, aby załadować te dane do przeglądarki aplikacji na Androida?

+0

Prawdopodobnie potrzebujesz dokładniej określić oczekiwane wyniki. – Henrik

+0

Nie mogę przesłać zrzutu ekranu z wyjścia ... jednak oczekuje się, aby wyświetlić tabelę z dwiema kolumnami i dwoma wierszami danych z xml. –

Odpowiedz

10

Jest to dość podstępne, staram się ułatwić zrozumienie. Wystarczy postępować zgodnie z poniższymi steps_

  1. budować swój plik XSLT pod RES/surowców,
  2. albo przeanalizować swoją XML lub być gotowy z XML (w res/raw)
  3. Wreszcie, zużywają one być wyświetlane w Android WebView

swój cdcatalog_with_xsl.xml & cdcatalog.xsl musi być tam w res/raw. Muszę zbudować LoadXSLTinWebview że serwery Twój 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

Mam nadzieję, że to pomoże wszystkim!

+0

Tak, to mi bardzo pomaga. Dziękuję za opublikowanie tego, co oszczędza mój czas. –

+0

Dziękuję za tę odpowiedź! Zauważyłeś tylko, że zmieniasz XML i XSL w onCreate. Powinieneś to zmienić, po raz pierwszy spróbowałem tego kodu, który nie działał. Jest to tylko zmiana nazwy dwóch ciągów;) –

Powiązane problemy