应用xsl合并jsp中的两个xml文件

时间:2012-05-08 12:54:21

标签: xml jsp xslt

我做了一个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。

1 个答案:

答案 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合并的结果。

希望有所帮助