我想将外部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"/>
然而我们有两个问题
parse
在XHTML上非常缓慢(约10秒)(将第一行更改为<?xml...
<!DOCTYPE...
修复此问题。)
所选元素中的任何标记都会消失。示例I <b>love</b> tacos
显示为I love tacos
有没有人有一个很好的方法来显示外部来源的特定元素?有谁知道如何让JSTL xml库将所选节点显示为xml而不是文本(以解决问题2)?
答案 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>