Android上的Saxon-HE

时间:2014-06-18 16:36:54

标签: android xslt-2.0 saxon

我正在尝试使用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运行良好的服务器端。提前谢谢!

2 个答案:

答案 0 :(得分:0)

Saxon并不是开箱即用的Android游戏。我们做了一些工作,看看它有多可行,我们得到的答案几乎肯定是可以完成的,但这将是非常重要的,并且会创建另一个版本的产品。如果有人想要更详细地探索需要哪些更改来使Saxon-HE在Android上编译和运行,我们Saxonica将非常有兴趣听取结果。

答案 1 :(得分:0)

我想指出,我已经使用Saxon在Android上使用以下解决方法进行XQuery:

  1. 从Saxon jar文件中删除javax。*包
  2. 不要使用DOMWrapper或DOMSource - 和谐DOM实现不完整并打破Saxon。将Configuration.buildDocument与SAXSource一起使用。
  3. 以下是一些示例代码:

     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);