Java 从数据库导入xslt

Java 从数据库导入xslt,java,xslt,Java,Xslt,我正在数据库中存储xslt。我想从另一个存储在数据库中的xslt调用模板。使用下面的示例代码,我能够正确运行xslt(考虑xsltOneStr是通过dao层来自数据库的xslt字符串,xmlStr也是要解析的xml) 但是,如果我在xsltOne.xsl中使用,它显然会抱怨,因为源xsltOne.xsl来自数据库,而被调用的xsltTwo.xsl也在数据库中。显然,在我的例子中使用import在逻辑上是不正确的,因为我不是使用文件系统来获取xsl,而是使用来自DB的字符流,但为了进行对话,我使用

我正在数据库中存储xslt。我想从另一个存储在数据库中的xslt调用模板。使用下面的示例代码,我能够正确运行xslt(考虑xsltOneStr是通过dao层来自数据库的xslt字符串,xmlStr也是要解析的xml)

但是,如果我在xsltOne.xsl中使用,它显然会抱怨,因为源xsltOne.xsl来自数据库,而被调用的xsltTwo.xsl也在数据库中。显然,在我的例子中使用import在逻辑上是不正确的,因为我不是使用文件系统来获取xsl,而是使用来自DB的字符流,但为了进行对话,我使用了import标记

既然xsl来自DB,那么我应该用什么来代替xsl:import呢。我正在使用Java&xslt能够调用Java方法。是否有任何方法可以使用java方法调用驻留在db中的第二个xslt(xsltTwo.xsl)。如果java方法无法调用xsltTwo.xsl的全部内容,那么我是否可以在xslttone.xsl中动态插入一个在xsltTwo中声明的模板

例如,我们可以调用java方法,使用java作为

类似地,我们可以分配整个模板,还是使用java方法从另一个xslt调用一个xslt

        Source xsltOne=new StreamSource(new StringReader(xsltOneStr));
        Source xml =new StreamSource(new StringReader(xmlStr));

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(xsltOne);

        StringWriter writer = new StringWriter();
        transformer.transform(xml, new StreamResult(writer));

您可以通过提供以下选项来调整使用
document()
xsl:import
xsl:include
加载XML样式表或文档:


现在,当工厂遇到
xsl:import
指令时,会通知您的URIResolver为导入的样式表提供
源代码。因此,您只需要提供一个URIResolver,它从数据库加载导入的样式表,并将其作为
Source
对象返回

如果有人在寻找如何创建解析器,我会找到一种如下所述的方法。”MyResolver’类使用一个构造函数,该构造函数将xslt字符串作为参数传递给‘factory.setURIResolver’方法。在转换时,它调用resolve方法,该方法依次传递StreamSource obj,该obj使用来自db/file的xstl字符串形成。(您可以使用more if&else子句构造resolve方法,具体取决于要传递的xslt的数量,并使用路径和名称使if更通用)

行factory.setURIResolver(新的MyResolver(xslttwstr));您可以看到它使用了“xslttwstr”,它只不过是xsltOne中需要的导入xslt字符串。您可以使用dao层调用db来引入xslt字符串(“xsltTwoStr”),或者只加载文件本身

        Source xsltOne=new StreamSource(new StringReader(xsltOneStr));
        Source xml =new StreamSource(new StringReader(xmlStr));


        TransformerFactory factory = TransformerFactory.newInstance();
        factory.setURIResolver(new MyResolver(xsltTwoStr));

        Transformer transformer = factory.newTransformer(xsltOne);

        StringWriter writer = new StringWriter();
        transformer.transform(xml, new StreamResult(writer));



class MyResolver implements URIResolver {
          String xsltStr;

          public MyResolver(String xsltStr) {
            this.xsltStr = xsltStr;
          }

          public Source resolve(String href,String base) {

              return new StreamSource(new StringReader(this.xsltStr));
          }
        }

在XSLT中使用
xsl:import
是没有问题的,即使您从数据库中读取它。您的问题更多的是如何处理XSLT,包括Java中的另一个XSLT,而不管数据库是什么。。你看过这个链接了吗?@user593029我刚刚注意到你问了很多问题,但很少回答。我在下面的链接中使用URIResolver获得了更多信息,但这对解析相对路径或从类路径加载相对路径很有帮助。在任何一种情况下,xslt都是物理存在的。在我的例子中,第二个xslt来自数据库,所以我不确定URIResolver如何帮助实现这一点。有人能告诉我如何集成/导入第二个XSLT吗?它是DB中的字符串。您有一些代码可以从数据库加载样式表(这就是您填充
xsltOneStr
)。现在在您的URIResolver中调用相同的代码来加载导入的样式表。URIResolver返回一个源对象。从数据库中以字符串形式读取样式表,将其包装在StringReader中,将StringReader包装在StreamSource中,然后返回StreamSource(它实现了Source)。在StreamSource上调用setSystemId()可能也是一个好主意,这样它就有了一个已知的基本URI。
        Source xsltOne=new StreamSource(new StringReader(xsltOneStr));
        Source xml =new StreamSource(new StringReader(xmlStr));


        TransformerFactory factory = TransformerFactory.newInstance();
        factory.setURIResolver(new MyResolver(xsltTwoStr));

        Transformer transformer = factory.newTransformer(xsltOne);

        StringWriter writer = new StringWriter();
        transformer.transform(xml, new StreamResult(writer));



class MyResolver implements URIResolver {
          String xsltStr;

          public MyResolver(String xsltStr) {
            this.xsltStr = xsltStr;
          }

          public Source resolve(String href,String base) {

              return new StreamSource(new StringReader(this.xsltStr));
          }
        }