我正在尝试使用Saxon-He 9.5.1-5在Android上执行XLST 2.0转换。问题是以下代码:
final Source xsltSource = new StreamSource(context.getAssets().open(styleSheet));
TransformerFactory factory = TransformerFactoryImpl.newInstance();
factory.setURIResolver(new URIResolver() {
@Override
public Source resolve(final String href, final String base) throws TransformerException {
Source source = null;
try {
source = new StreamSource(context.getAssets().open(href));
} catch (Throwable t) {
Log.i("ERROR", Log.getStackTraceString(t));
}
return source;
}
});
Transformer transformer = factory.newTransformer(xsltSource);
导致变换器为空。 xsltSource变量是我的assets目录中的XSLT文件。在logcat中我看到以下错误
W/System.err﹕ SystemId Unknown; Line #12; Column #8; Could not find function: tokenize
我发现使用“fn:”为方法tokenize()添加前缀解决了这个问题,但重新编译导致了我的XSLT文件中声明的所有其他函数的类似错误。使用“fn:”为所有这些函数添加前缀会导致我出现“instance of”错误。这似乎是一个兔子洞,并想知道是否有人有这方面的经验?我不能发布XSLT文件,因为它们对我的客户是保密的,但我知道它们都是有效的,因为它们使用相同的Saxon-HE lib运行良好的服务器端。提前谢谢!
答案 0 :(得分:0)
Saxon并不是开箱即用的Android游戏。我们做了一些工作,看看它有多可行,我们得到的答案几乎肯定是可以完成的,但这将是非常重要的,并且会创建另一个版本的产品。如果有人想要更详细地探索需要哪些更改来使Saxon-HE在Android上编译和运行,我们Saxonica将非常有兴趣听取结果。
答案 1 :(得分:0)
我想指出,我已经使用Saxon在Android上使用以下解决方法进行XQuery:
以下是一些示例代码:
import net.sf.saxon.Configuration;
import net.sf.saxon.DynamicQueryContext;
import net.sf.saxon.XQueryExpression;
import javax.xml.parsers.SAXParser;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
...
Configuration config = Configuration.newConfiguration();
InputSource src = ...;
SAXParser saxParser =...;
SAXSource ss = new SAXSource(saxParser.getXMLReader(), src);
dqc.setContextItem(config.buildDocument(ss));
DynamicQueryContext dqc =
new DynamicQueryContext(config);
dqc.setContextItem(config.buildDocument(new DOMSource(contextNode)));
XQueryExpression query = ...;
Object result = query.evaluateSingle(dqc);