我做了一个xsl合并两个xml到一个,然后使用输出到另一个xsl进行html视图。
当我使用xmlSpy来测试它时,它运行得很好,但是当我把它们放在一个java Web应用程序下时,有些事情是错误的。
xsl如下:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:strip-space elements="*" />
<xsl:variable name="xsdresult" select="document('xsdResult.xml')" />
<xsl:variable name="schresult" select="document('result.xml')" />
<xsl:template match="/">
<xsl:result-document href="fullresult.xml" method="xml">
<fullresult>
<xsl:copy-of select="$schresult/node()" />
<xsl:copy-of select="$xsdresult/node()" />
</fullresult>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
此文件和xml文件都在同一目录下,输出文件相同。
应用此xslt的jsp:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@taglib uri="http://jakarta.apache.org/taglibs/xsl-1.0" prefix="xsl"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page%>
<title>test</title>
</head>
<body>
<p>
<xsl:apply xml="WEB-INF/classes/result/result.xml" xsl="WEB-INF/classes/result/merge.xsl" />
<xsl:apply xml="WEB-INF/classes/result/xsdResult.xml" xsl="WEB-INF/classes/result/merge.xsl" />
<xsl:apply xml="WEB-INF/classes/result/fullresult.xml" xsl="WEB-INF/classes/result/anotherone.xsl" />
</p>
</body>
</html>
问题出在merge.xsl,document(&#39; xsdResult.xml&#39;)和文档(&#39; result.xml&#39;)中,它们总是在eclipse_home目录下搜索,而不是tomcat webapps direcotry。
答案 0 :(得分:0)
您需要的是URI Resolver。看what happens inside the ApplyTag我不知道你怎么能提供自己的。
似乎还有另一个用于执行类似操作的Apache taglib - xtags。与StyleTag
相比,ApplyTag
似乎做得更好, 使用URI解析器(查看line 154)。但是,我没有看到一种干净的方式来传递你自己没有子类化。您可以将代码进一步跟踪到URLHelper,并查看将document()
函数中的URI修改为类似/WEB-INF/...
的内容是否会产生更好的结果。
然而,如果您希望从文件系统中获取第一个传递的结果,那么您很可能会遇到转换的第二步中的另一个问题。第一次传递将在何处转储fullresult.xml
?应用服务器代表运行的进程是否具有写入文件系统的权限?你甚至想要它写入文件系统吗?
我觉得你在普通Java中组合一个小实用程序类会更好,它可以使用JAXP API来管理你的转换。您将拥有所需的所有控制权,而不是解析器功能,包括URI解析,您不需要将文件系统用作中间存储。当你这样做时,你也可以考虑一次性运行转换。您可以将文档合并到xsl:variable
中,然后在其上应用模板,或者仅将模板应用于每个document()
函数的结果。当然,除非您需要保留XML合并的结果。
希望有所帮助