Как создать полный список и выбранные детали из XML с помощью XSLT? - PullRequest
1 голос
/ 23 октября 2011

У меня есть все данные в файлах XML, хорошо помеченные. Данные из резюме, 1000 из них. Мне нужно создать интерфейс на Java, в котором я буду отображать эти резюме двумя способами:

  1. Полный файл HTML всех из них.
  2. И полный HTML-файл из выбранных. Например: пользователь выбирает Java, затем те резюме, которые имеют Java, будут отображаться в формате HTML.

Я написал XSLT-код, который отображает все резюме. и теперь я совершенно запутался с другим типом дисплея. Мне нужен совет экспертов. :)

Также мне потребуется 2 отдельных XSLT для отображения резюме двумя способами, как было сказано ранее.

* Обновление:

public static void main(String[] args) throws IOException, URISyntaxException, TransformerException 
{
    TransformerFactory factory = TransformerFactory.newInstance();
    Source xslt = new StreamSource(new File("Resume.xslt"));
    Transformer transformer = factory.newTransformer(xslt);

    Source text = new StreamSource(new File("Resume.xml"));
    transformer.transform(text, new StreamResult(new File("ResumeAll.html")));
}

Приведенный выше код является кодом Java для преобразования XML в HTML с использованием XSLT.

Этот код отобразит все резюме. Теперь, чтобы отобразить конкретное резюме или выбранные резюме, мне нужно будет передать параметры, используя метод setParamaters(). Верно?

Ниже приведен пример кода XSLT:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='html' media-type='text/html'/>

<xsl:template match="/">
<html>
 <body>
    <xsl:apply-templates/>
 </body>
</html>
</xsl:template>

<xsl:template match="Resume">
<table align='center' width='800' style="font-family:tahoma; font-size:13pt;">
<tr><td>
    <xsl:apply-templates/>
    </td></tr>
    </table>
</xsl:template>

<xsl:template match="Name">
<table align="center"><tr>
<th style="font-size:24pt; color:navy">
    <xsl:apply-templates/>
</th>
</tr></table>
</xsl:template>

Приведенный выше код Java и файл XSLT преобразуют XML в файл HTML, который будет отображать все резюме.

Что я должен сделать, чтобы отобразить резюме на основе определенных условий? Для этого мне понадобятся 2 разных XSLT-файла? Или только тот, который показан, будет работать с небольшими изменениями?

1 Ответ

1 голос
/ 24 октября 2011

Вы можете использовать в качестве источника не StreamSource, а SAXSource и реализовать собственный настраиваемый фильтр для него.Этот SAX-фильтр должен пропускать теги, которые вы не хотите видеть в потоке результатов.Например:

//...

TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("Resume.xslt"));
Transformer transformer = factory.newTransformer(xslt);

SAXParser parser = saxParserFactory.newSAXParser();
XMLSkipResumeFilter reader = new XMLSkipResumeFilter(parser.getXMLReader(), resumeIdsToLeave);
InputStream is = new FileInputStream("Resume.xml");
Source text = new SAXSource(filter, is);

transformer.transform(text, new StreamResult(new File("ResumeAll.html")));

//...

XMLSkipResumeFilter.java:

public class XMLSkipResumeFilter extends XMLFilterImpl {
    private boolean skipCurrentTag = false;
    private Set resumeIdsToLeave;

    public XMLSkipResumeFilter(XMLReader parent, Set resumeIdsToLeave) {
        super(parent);

        this.resumeIdsToLeave = resumeIdsToLeave;
    }

    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        // analyze if current tag should be skipped or check if parent tag is already marked as skipped
        // if (...) { return; }
        // if this resume should be rendered calling to super method
        // if (...) { super.startElement(uri, localName, qName, atts); }
    }

    //implements other method of XMLFilterImpl
}
...