有谁用Xalan编译过XSL吗?

wangwenyou 2003-08-20 03:04:47
Xalan的XSLTC.compile可将XSL编译为class,本意上是为了提高效率;
可我看了它的调用与实现,好象只支持物理存储的XML。调用时必须DOMImpl dom = new DOMImpl()或从cache中retrieve,好丑陋的接口!
我的XML一般来源于内存字符串,如果来一次磁盘IO,然后再用Class.forName,理论上效率更低。

请问哪位使用过Xalan的这个功能,效率如何?有变通的方法可绕开磁盘IO吗?先谢谢了
...全文
88 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangwenyou 2003-08-22
  • 打赏
  • 举报
回复
大哥,您还是没看明白我的意思。编译我会!我要的是基于已编译的XSL进行XSLT!@
hk2000c 2003-08-21
  • 打赏
  • 举报
回复
看了第二遍,明白你意思了。
你所说的org.apache.xalan.xsltc.compiler.XSLTC
有很多种形式,你随便挑种就可以了,谁说只能从物理文件读取Document的?apache不会作出那么傻得类的。
boolean compile(InputSource input, java.lang.String name)
Compiles an XSL stylesheet passed in through an InputStream
boolean compile(java.io.InputStream stream, java.lang.String name)
Compiles an XSL stylesheet passed in through an InputStream
byte[][] compile(java.lang.String name, InputSource input)
Compiles a stylesheet pointed to by a URL.
byte[][] compile(java.lang.String name, InputSource input, int outputType)
Compiles a stylesheet pointed to by a URL.
boolean compile(java.net.URL url)
Compiles an XSL stylesheet pointed to by a URL
boolean compile(java.net.URL url, java.lang.String name)
Compiles an XSL stylesheet pointed to by a URL
boolean compile(java.util.Vector stylesheets)
Compiles a set of stylesheets pointed to by a Vector of URLs
==========================
就拿这条把
compile
public boolean compile(java.io.InputStream stream,
java.lang.String name)Compiles an XSL stylesheet passed in through an InputStream
Parameters:
input - An InputStream that will pass in the stylesheet contents
name - The name of the translet class to generate
Returns:
'true' if the compilation was successful
我想InputStream不必是一定是物理文件吧。
上面的文件再改一下!

public static void transformAndCompile(String stylesheet,String url,String className)
throws JDOMException {
try {
SAXBuilder builder = new SAXBuilder();
Document in = builder.build(url);
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
Document trasformed = out.getDeocument();
XMLOutputter xmlOutputter = new XMLOutputter();
// Output to the I/O stream
InputStream resultIn = new InputStream();
OutputStream resultOut = new OutputStream(resultIn);
xmlOutputter.output(trasformed , sourceOut);
org.apache.xalan.xsltc.compiler.XSLTC xsltc = new org.apache.xalan.xsltc.compiler.XSLTC ();
xsltc.compile(resultIn,className);
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
catch(XXXExeption...){..}
}


大致是这样吧,你再试试。
wangwenyou 2003-08-21
  • 打赏
  • 举报
回复
对不起,我不是想知道如何使用JAXP或JDOM的XSLT;我关心的是将XSL编译为class文件。
谢谢了
hk2000c 2003-08-21
  • 打赏
  • 举报
回复
上有误
public static Document transform(String stylesheet,String url)
throws JDOMException {
try {
SAXBuilder builder = new SAXBuilder();
Document in = builder.build(url);
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getDeocument();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}

hk2000c 2003-08-21
  • 打赏
  • 举报
回复
上有误
public static Document transform(String stylesheet,String url)
throws JDOMException {
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getDeocument();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}

这样就可以了。
hk2000c 2003-08-21
  • 打赏
  • 举报
回复
修改后为这样:最后如果你需要使用w3c的Document需要转换一下。
public static Document transform(Document in, String stylesheet,String url)
throws JDOMException {
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getDeocument();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}
Debian 2003-08-21
  • 打赏
  • 举报
回复
DOM不是将xml文档一次性读入内存的吗?
Debian 2003-08-21
  • 打赏
  • 举报
回复
DOM不是将xml文档一次性读入内存的吗?
Debian 2003-08-21
  • 打赏
  • 举报
回复
DOM不是将xml文档一次性读入内存的吗?
hk2000c 2003-08-21
  • 打赏
  • 举报
回复
上面你应该使用以下语句效率会快些。
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);


============以上类除Transformer均在Jdom中定义,不是org.w3c.dom中的。
hk2000c 2003-08-21
  • 打赏
  • 举报
回复
你可以使用Jdom(以下Document类是在jdom中定义的)
DOMBuilder builder = new DOMBuilder();
Document doc = builder.build(url);
使用如下函数对你的数据源转换:
public static List transform(Document in, String stylesheet)
throws JDOMException {
try {
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getResult();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}
wangwenyou 2003-08-21
  • 打赏
  • 举报
回复
加100分,如无答复,只好结了:(
wangwenyou 2003-08-20
  • 打赏
  • 举报
回复
一般的处理步骤是这样的:
1、将一个XSL文件编译为一个class文件,例如xsl编译后className为com.isee.sample.Test;
2、进行XSLT时,通常代码如下:
Class tc = Class.forName(className);
AbstractTranslet translet = (AbstractTranslet)tc.newInstance();
...
DOMImpl dom = new DOMImpl(uri);// uri为XML的来源,可为filename,也可为URL
translet.transform(dom, ...);

关键问题就出在这,dom必须从物理存储介质读取,要满足它的要求,内存中的XML字符串就必须进行一次IO。
tpz_stamp 2003-08-20
  • 打赏
  • 举报
回复
难道是避开读取xsl文件,直接load相关的class做transform?
那怎么transform?
tpz_stamp 2003-08-20
  • 打赏
  • 举报
回复
如果仅仅要将xsl文件编译为class,可以使用xmlc。不十分理解你的问题。
将xsl编译后,如何使用???
jouny0 2003-08-20
  • 打赏
  • 举报
回复
up

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧