Xml Saxon找不到函数:当前组

Xml Saxon找不到函数:当前组,xml,maven,xslt-2.0,saxon,xslt-grouping,Xml,Maven,Xslt 2.0,Saxon,Xslt Grouping,我试图将Saxon与XSLT样式表结合使用,并使用XSLT2规范()中的代码示例 这会在输出控制台上引发错误 SystemId Unknown; Line #13; Column #70; Could not find function: current-group SystemId Unknown; Line #13; Column #70; function token not found. (Location of error unknown)java.lang.NullPointerEx

我试图将Saxon与XSLT样式表结合使用,并使用XSLT2规范()中的代码示例

这会在输出控制台上引发错误

SystemId Unknown; Line #13; Column #70; Could not find function: current-group
SystemId Unknown; Line #13; Column #70; function token not found.
(Location of error unknown)java.lang.NullPointerException

我正在使用的Saxon版本中是否缺少此函数,或者我做错了什么?

我现在发现了一些可以工作的功能

    @Test
    public void testSaxonXslt2GroupTest1() throws Exception {
//      http://stackoverflow.com/questions/9925483/calling-java-from-xsl-saxon  

        File xml_file = Fixtures.XSLT2_TEST1_XML;
        File xsl_file = Fixtures.XSLT2_TEST1_XSL;
        LOG.debug(FileUtils.readFileToString(xsl_file));
//用属性方法替换完全限定的类名似乎是可行的

        System.setProperty("javax.xml.transform.TransformerFactory",
                "net.sf.saxon.TransformerFactoryImpl");
        TransformerFactory tfactory = TransformerFactory.newInstance();
//


我原以为使用精确的构造函数就足够了,但似乎不行。

JAXP又来了!问题是,您实际上并没有运行Saxon

执行此操作时:

factory = net.sf.saxon.TransformerFactoryImpl.newInstance();
看起来你真的在调用一个Saxon方法,不是吗?但在Java中,静态方法不能以这种方式重写(如果可以的话,我会…)。您只需在基类上调用newInstance()方法,该方法在类路径中搜索找到的第一个XSLT处理器。如果您想显式地调用Saxon,最好通过执行以下操作来避免类路径搜索

factory = new net.sf.saxon.TransformerFactoryImpl();

我不认为这会带来麻烦,但为什么要指定
version=“1.0”
?我认为这是一个转录错误,应该是2.0。我将对照我的实际代码进行检查。我正在使用xsl:version=“2.0”在本地运行它。我试图重现这一点,但由于XSLT具有
,因此示例的格式甚至不好。当我将代码更正为
时,Saxon将输出一个结果,至少从命令行运行它。感谢您的耐心等待。我的代码具有格式良好的XML/XSL。我将重新编写…我认为您可以直接执行
TransformerFactory tFactory=new transformerfactorympl()导入net.sf.saxon.TransformerFactoryImpl
或者确实需要设置系统属性。
newInstance
方法是继承的,在中没有覆盖。谢谢-这似乎可以解释-也许应该覆盖或捕获它。如果您认为应该在Saxon中修复,您可以向Saxonica报告错误或通知@MichaelKay。谢谢。现在一切都有意义了。有一种危险是,有不止一种方法可以做到这一点,所以我最终从已知的例子中剪切和粘贴,并混淆了一些东西。希望这个例子能帮助其他人做对
        System.setProperty("javax.xml.transform.TransformerFactory",
                "net.sf.saxon.TransformerFactoryImpl");
        TransformerFactory tfactory = TransformerFactory.newInstance();
  Transformer transformer = tfactory.newTransformer(new StreamSource(xsl_file));
            File saxonDir = new File("target/saxon/");
            saxonDir.mkdirs();
            try {
                transformer.transform(new StreamSource(xml_file),  
                    new StreamResult(new FileOutputStream(new File(saxonDir, "test1.xml"))));
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
factory = net.sf.saxon.TransformerFactoryImpl.newInstance();
factory = new net.sf.saxon.TransformerFactoryImpl();