【问题标题】:How to generate full List and selected Details from XML using XSLT?如何使用 XSLT 从 XML 生成完整的列表和选定的详细信息?
【发布时间】:2011-10-23 08:13:24
【问题描述】:

我拥有 XML 文件中的所有数据,并且标记良好。数据是简历,有 1000 份。 我必须用 Java 构建一个前端,我将在其中以 2 种方式显示这些简历:

  1. 一个完整的 HTML 文件。
  2. 以及所选文件的完整 HTML 文件。例如:用户选择Java,那么那些带有Java的简历将以HTML格式显示。

我编写了显示所有简历的 XSLT 代码。现在我对另一种类型的显示器感到很困惑。我需要专家的建议。 :)

如前所述,我还需要 2 个单独的 XSLT 来以 2 种方式显示简历。

*更新:

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 代码。

此代码将显示所有简历。现在要显示特定的简历或选定的简历,我必须使用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 文件吗?还是只显示显示的那一项,只需稍加修改即可使用?

【问题讨论】:

  • 您在筛选必要的简历以进行展示时遇到问题了吗?你用什么javax.xml.transform.Source?
  • 如果您显示您为第一次显示编写的代码(至少总结一下),我们可以更好地建议如何添加第二次。
  • 这应该是对您已经工作的代码的一个非常小的修改。如果不查看您现有的代码,并且不知道您为什么会发现它很困难,就很难就该修改提出建议。
  • @_John:这是我们不应该问的一个例子:太笼统,没有例子,好像在问“如何在生活中做得好”——每个人都会收到很多答案它们与问题本身一样普遍和无用。请编辑和改进。
  • @LarsH-您的请求已完成。

标签: java xml xslt xslt-1.0


【解决方案1】:

您可以使用 SAXSource 而不是 StreamSource 作为 Source,并为它实现您自己的自定义过滤器。此 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
}

【讨论】:

  • @svaor- 我会试一试,然后告诉你同样的情况
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2019-08-09
相关资源
最近更新 更多