2015-02-11 3 views
0

Я пытаюсь распечатать преобразованный документ XML с помощью Java Servlet (GlassFish Server). Я получаю xml с внешнего веб-сайта, преобразуя его с помощью XSLT, а затем пытаюсь распечатать преобразованный документ. Я считаю, что файл XSL верен и выполняет правильное преобразование.Печать XSLT преобразованного XML-документа в Java Servlet

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import java.io.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.servlet.*; 

import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.Result; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 

/** 
* 
* @author Kirie 
*/ 
public class getArticles extends HttpServlet { 

    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException, TransformerConfigurationException, TransformerException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 


      // get the xsl stored in this project 
      ServletContext context = getServletContext();      
      InputStream xsl = (InputStream) 
           (context.getResourceAsStream("/XSLTransformerCode.xsl")); 

      // We need two source objects and one result 
      // get an external xml document using a url in a 
      // string format 
      String topic = request.getParameter("topic"); 
      String urlAsString = ""; 
      if(topic.equals("Business")) 
       urlAsString = "http://rss.nytimes.com/services/xml/rss/nyt/Business.xml"; 
      else if(topic.equals("Technology")) 
       urlAsString = "http://rss.nytimes.com/services/xml/rss/nyt/Technology.xml"; 
      else if(topic.equals("World")) 
       urlAsString = "http://rss.nytimes.com/services/xml/rss/nyt/World.xml"; 

      Source xmlDoc = new StreamSource(urlAsString); 
      Source xslDoc = new StreamSource(xsl); 
      Result result = new StreamResult(out);   

      // Prepare to transform 


      // The transformed document is returned to the browser. 
      TransformerFactory factory = TransformerFactory.newInstance(); 
      Transformer trans = factory.newTransformer(xslDoc); 
      trans.transform(xmlDoc,result); 

      out.println(result.toString()); 

     } 
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (TransformerException ex) { 
      Logger.getLogger(getArticles.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (TransformerException ex) { 
      Logger.getLogger(getArticles.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Returns a short description of the servlet. 
    * 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 

Это сервлет, который выполняет перевод. Вы можете посетить XML-документы по указанному выше URL-адресу. Это RSS-каналы.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <xsl:output method="xml" 
     omit-xml-declaration="yes" 
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
     doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/> 

    <xsl:template match="/"> 
    <html><head></head> 
    <body> 
    <h1>News Articles</h1> 
    <ul> 
     <xsl:for-each select = "rss/channel/item"> 
     <li> 
      <xsl:value-of select = "title"/> 
     </li> 
     </xsl:for-each> 
    </ul> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Это файл XSL, который я использую для преобразования файла. К сожалению, я не знаю, где проблема. Я попытался разобраться в этом, но я не могу этого сделать. Любой вход будет полезен и оценен. Я буду в сети некоторое время, поэтому я смогу ответить на вопросы!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head> 
<body> 
<h1>News Articles</h1> 
<ul> 
<li>Obama to Seek War Power Bill From Congress, to Fight ISIS</li> 
<li>Kayla Mueller&rsquo;s Parents Are Said to Receive Photos of Her Corpse From ISIS</li> 
<li>Towers of Secrecy: Mexican Political Family Has Close PRI Ties, and Homes in the U.S.</li> 
<li>Jordan and Emirates Carry Out Airstrikes in Syria Against Islamic State</li> 
<li>Australia Holds 2 in Terrorism Case</li> 
<li>Bangkok Journal: In Thailand, the Ghost Business Thrives</li> 
<li>Open Source: On YouTube, Vivid Evidence of War&rsquo;s Horror in Ukraine</li> 
<li>Terrorist Claims Return Sept. 11 Suit to Spotlight</li> 
<li>Obama to Recall Military Personnel From Ebola Zone, Officials Say</li> 
<li>Agreement on Ukraine Cease-Fire Deal Is Reported</li> 
<li>Venezuela Announces Plan to Relax Currency Controls</li> 
<li>India&rsquo;s Aam Aadmi Party Sweeps Elections in Delhi</li> 
<li>World Briefing: New DNA Tests Ordered in Argentine Prosecutor&rsquo;s Death</li> 
<li>Robert Herzstein, 74, Dies; Historian Linked a U.N. Leader to War Crimes</li> 
<li>Niger Adds Its Troops to the War on Boko Haram</li> 
<li>Yemeni Militant Leader Pledges to Share Power</li> 
<li>Dominique Strauss-Kahn&rsquo;s Defense: He Didn&rsquo;t Know Prostitutes Were at the Orgies</li> 
<li>At War Blog: For Many Veterans, &lsquo;American Sniper,&rsquo; Right or Wrong, Starts an Important Conversation</li> 
<li>Battered Ukrainian City of Mariupol Braces for Worst as Rebels Close In</li> 
<li>Sinosphere Blog: University President Sees Echoes of Cultural Revolution in New Campaign</li> 
</ul> 
</body> 
</html> 

Я запустил XSLT в обычном java-приложении и сбрасывал результат в файл. Вышеупомянутый код HTML - результат, который был дан.

Заранее благодарен! Kirie

+0

Каково нынешнее поведение? Вы не видите выхода? –

+0

Исправить. При загрузке сервлета нет выхода. – kirie

ответ

0

Вы должны установить правильный Content-Type заголовок

response.setContentType("text/xml"); 

В настоящее время, браузер пытается интерпретировать ваш XML как HTML и, следовательно, не оказывает никакого.


Попробуйте изменить последнюю строку из out.println(result.toString()); в out.flush(); Я считаю, что это лишнее, как transform() также печать out через StreamResult. А также измените тип содержимого обратно на html.

+0

XSLT создает документ, который является надлежащим HTML. Я загрузил (в вопрос) результаты, когда я запускаю XLST-код против XML из RSS-ленты новостей World. Он попытался установить тип содержимого в text/xml, и он дал мне это сообщение .. «Этот XML-файл, похоже, не имеет связанной с ним информации о стиле. Дерево документов показано ниже». Ничего не видно ниже. Есть предположения? – kirie

+0

Не могли бы вы просто изменить последнюю строку из 'out.println (result.toString());' to' out.flush(); '? Я считаю, что это необязательно, так как 'transform()' также выводит 'out' через' Result'. А также измените тип содержимого обратно на html. –

+0

Вот что я думал. out.flush() ничего не меняет. Я боюсь, что он неправильно захватил два файла XSL или XML-файл. Знаете ли вы способ проверить, чтобы эти ресурсы были правильно восстановлены? – kirie