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