przetwarzanie xml interfejsem saxon i wyświetlanie w serwlec

0

Witam,

mam dziwny problem. Miałem napisany serwlet przetwarzający xml przez interfejs saxon i wszystko było ok, generował wynik, i nagle przestało działać po edycji ręcznej.. pliku xml, który był zaczytywany. Zmieniłem tylko dwie wartości, które miały być wyświetlane i serwlet wyświetla pustą stronę. W czasie zmiany pliku xml Tomcat był uruchomiony, ale wydaje mi się, że to nie powinno mieć znaczenia, a jeśli nawet, to po restarcie Tomcata wszystko powinno wrócić do normy..

wkleje kody

  1. plik xml:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<?xml-stylesheet type="text/xsl" href="lab73.xsl" ?>

<DATA>
<PERSON ID="1">
<NAME>player1</NAME> 
<POINT>4</POINT> 
</PERSON>
<PERSON ID="2">
<NAME>player2</NAME> 
<POINT>3</POINT> 
</PERSON>
<PERSON ID="3">
<NAME>player3</NAME> 
<POINT>6</POINT> 
</PERSON>
<PERSON ID="4">
<NAME>player4</NAME> 
<POINT>7</POINT> 
</PERSON>
</DATA>
  1. plik xq:
<html>
<head>
<title>A list of books</title>
</head>
<body>
<h1>A list of books</h1>
<ul>
{
for $b in //DATA/PERSON
order by $b/POINT ascending
return
<li><i> { string($b/NAME) } </i> by { string($b/PIONT) } </li>
}
</ul>
</body>
  1. kod serwletu:
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import net.sf.saxon.Configuration;
import net.sf.saxon.query.DynamicQueryContext;
import net.sf.saxon.query.StaticQueryContext;
import net.sf.saxon.query.XQueryExpression;
import net.sf.saxon.trans.XPathException;

/**
 * Servlet implementation class SerwletXQuery
 */
public class SerwletXQuery extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SerwletXQuery() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try {
		
		Configuration config = new Configuration();
		// --- UTWORZENIE ZAPYTANIA XQUERY ---
		StaticQueryContext sqc = new StaticQueryContext(config);
		XQueryExpression exp = sqc.compileQuery(new FileReader("C:\\kernow\\lab82.xq"));
		// --- ZAŁADOWANIE PLIKU XML ---
		DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
		dynamicContext.setContextItem(config.buildDocument(new StreamSource("C:\\kernow\\lab82.xml")));
		// --- USTAWIENIE WLASCIWOSCI WYNIKU ---
		Properties props = new Properties();
		props.setProperty(OutputKeys.METHOD, "html");
		props.setProperty(OutputKeys.DOCTYPE_PUBLIC, "-//W3C//DTD HTML 4.01 Transitional//EN");
		props.setProperty(OutputKeys.ENCODING, "UTF-8");
		// --- przetworzenie zapytania ---
				exp.run(dynamicContext, new StreamResult(response.getWriter()), props);
		} catch (XPathException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Mam nadzieje, że ktoś pomoże...

0

Sprawdź kodowanie znaków. Najlepiej, aby było UTF-8.

0
__krzysiek85 napisał(a)

Sprawdź kodowanie znaków. Najlepiej, aby było UTF-8.

konwertowałem plik na ansi, utf, utf bez BOM, i to samo, utworzyłem plik ponownie z każdym z tych kodowań, i nadal nic nie wyświetla :/

0

trzeba było w pliku .xq domknąć tag <html>

działa, dziwne tylko że raz zadziałało bez domkniętego tagu

0

szukam szukam i nie mogę znaleźć.. jak ograniczyć wyniki, które mają być wyświetlone za pomocą zapytania.
Zapytanie zwraca 7 rekordów, a ja chce wyświetlić tylko 5 z największą ilością pkt
próbowałem tak:

<html> <head> <title>A list of books</title> </head> <body>

A list of books

  • { for $b in //DATA/PERSON order by $b/POINT descending return if ($b[position()<6]) then
  • { string($b/NAME) } by { string($b/POINT) } }
</body> </html>

ale niestety nie działa..

1 użytkowników online, w tym zalogowanych: 0, gości: 1