在.jsp中使用c:import导入特定元素

时间:2011-11-16 22:25:09

标签: java jsp xpath import jstl

我想将外部xhtml文件中的特定元素导入到JSP中。这可能与JSTL库有关吗?

背景

我们有一个XHTML帮助页面。每个帮助主题都在div元素中,每个div都有一个id。在我们的应用程序的其他部分,我们希望从帮助页面导入特定的id以提供特定于上下文的帮助。

我们一直在尝试

<c:import var="helpData" url="file:/tmp/help.html"/>
<x:parse var="helpXml" doc="${helpData}  " />
<x:out select="$helpXml//div[@id='helpTopicXXX']" escapeXml="false"/>

然而我们有两个问题

  1. parse在XHTML上非常缓慢(约10秒)(将第一行更改为<?xml... <!DOCTYPE...修复此问题。)

  2. 所选元素中的任何标记都会消失。示例I <b>love</b> tacos显示为I love tacos

  3. 有没有人有一个很好的方法来显示外部来源的特定元素?有谁知道如何让JSTL xml库将所选节点显示为xml而不是文本(以解决问题2)?

1 个答案:

答案 0 :(得分:0)

我决定使用JSoup和自定义标记来执行此操作。 我们的概念证明是

WEB-INF /标签/ htmlParser.tag

<%@ attribute description = "The html data to parse." name="html" required="true" rtexprvalue="true" %>
<%@ attribute description = "The id to grab from the html." name="id" required="true" rtexprvalue="true" %>
<%
 org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(html);
 org.jsoup.nodes.Element e = doc.select("#" + id).first();
 if (e != null) {
    out.println(e.outerHtml());
 } else {
getJspBody().invoke(out);
 }
%>

和示例.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %>
<head></head>
<body>
<c:import var="helpData" url="file:/tmp/help.html"/>

<p>Help loaded from other file:</p>
<h:htmlParser html="${helpData}" id="helpTopic1"/>

<p>Example loading invalid id</p>
<h:htmlParser html="${helpData}" id="taco">
Display this text if id <i>taco</i> doesn't exist.
</h:htmlParser>

</body>