1

我做了一个 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('xsdResult.xml') 和 document('result.xml') 中,它们总是在 eclipse_home 目录下搜索,而不是在 tomcat webapps 目录下搜索。

4

1 回答 1

0

您需要的是URI Resolver。查看ApplyTag 内部发生的情况,我不知道您将如何提供自己的。

似乎还有另一个 Apache taglib 可以做类似的事情 - xtags。与 相比,StyleTagin there 似乎做得更好ApplyTag,它使用了 URI Resolver(查看第 154 行)。但是,我没有看到一个干净的方法来传递你自己的而不继承它。您可以将代码进一步跟踪到URLHelper 中,看看在document()函数中修改 URI 是否/WEB-INF/...会产生更好的结果。

尽管如此,您很可能会在转换的第二步遇到另一个问题,您希望从文件系统中获取第一遍的结果。第一遍将转储到fullresult.xml哪里?应用程序服务器代表运行的进程是否有权写入其中的文件系统?您甚至希望它写入文件系统吗?

我觉得你最好用普通的 Java 编写一个小的实用程序类,它可以使用 JAXP API 来管道你的转换。您将拥有对解析器功能(包括 URI 解析)的所有控制,并且您不需要将文件系统用作中间存储。当您这样做时,您还可以考虑一次性运行转换。您可以将文档合并到 a 中xsl:variable,然后在其上应用模板,或者仅将模板分别应用于每个document()函数的结果。当然,除非您还需要保留 XML 合并的结果。

希望能帮助到你

于 2012-05-08T13:47:27.240 回答