我在XML文件中有所有的数据,标记好了。数据是关于几千份简历的。我必须用Java构建一个前端,在其中我将以两种方式显示这些简历:
- 一个完整的HTML文件。
- 和一个完整的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")));
}
以上代码是使用XSLT将XML转换为HTML的Java代码。
这段代码将显示所有的resume。现在要显示特定的简历或选定的简历,我必须使用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文件,该文件将显示所有的resume。
我应该如何根据某些条件来展示简历?为此需要2个不同的XSLT文件吗?或者只有一个显示将工作与小修改?
您可以使用SAXSource而不是StreamSource作为源,并为其实现您自己的自定义过滤器。这个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
}