java - Java 中的 XSLT 编译错误

标签 java xml xslt saxon

我需要将样式表加载到缓存中。使用以下代码编译 XSLT,出现异常:

javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected.

虽然附加了 XSLT,但 XSLT 没有错误。下面是 XSLT

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
        <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/>
        <xsl:template match="/">
            <xsl:copy-of select='.'/>
        </xsl:template>
    </xsl:stylesheet>

我怀疑语句 InputStream stream=ClassLoader.getSystemResourceAsStream(filename); 是否正在加载文件。

请帮我理解为什么编译失败;我没有太多 Java 经验

    package file;

    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    import javax.xml.transform.Source;
    import javax.xml.transform.Templates;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.URIResolver;
    import javax.xml.transform.stream.StreamSource;

    public class XSLT {

        private static Map<String, Templates> templatesMap = new HashMap<String, Templates>();

        public XSLT(){

        }
        public static void main(String[] args) throws Exception{
            XSLT xs=new XSLT();
            System.out.println(xs.readXSLT("/RemoveNamespaces.xslt"));
        }
        public String readXSLT(String filename) throws Exception{
            System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl");
            //String result="";
            InputStream stream=XSLT.class.getResourceAsStream(filename);
            TransformerFactory xformFactory=TransformerFactory.newInstance();
            xformFactory.setURIResolver(new SimpleURIResolver());

            Source source=new StreamSource(stream);
            try{
                Templates templates=xformFactory.newTemplates(source);
            }
            catch(TransformerConfigurationException  e){
                e.printStackTrace();
            }
            templatesMap.put(filename, xformFactory.newTemplates(source));
            //return templatesMap.get(filename).toString();
            return "Dummy";
        }
    }

    class SimpleURIResolver implements URIResolver {
        public Source resolve(String href, String base) throws TransformerException {
            InputStream stream = ClassLoader.getSystemResourceAsStream(href);
            return new StreamSource(stream);
        }

    }

最佳答案

第一个问题是您的代码没有输出 XSLT 编译器报告的错误。这使得很难识别错误是什么。您仅输出异常消息,表明已报告错误,这没有多大帮助。

Saxon 默认情况下将错误消息发送到标准错误输出,这可能会发送到某个日志文件中的某个地方 - 这完全取决于您运行的环境。您可以将消息发送到其他地方,例如通过编写您自己的 ErrorListener 并调用 xFormFactory.setErrorListener(); 或者您可以通过设置工厂的配置属性 http://来更改 Saxon 标准错误监听器的输出目标saxon.sf.net/feature/standardErrorOutputFile 为您想要写入消息的文件的名称。

话虽如此,我强烈怀疑这些消息只会告诉您您没有正确选择样式表文件。但修复应用程序绝对值得,这样当您将来在样式表中出错时,您就可以看到消息。

关于java - Java 中的 XSLT 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467369/

相关文章:

php - 具有相同名称的 WSDL 函数。如何选择一个?

xml - 如何使用 XML 的 XPATH 获取子节点计数

xml - 在 XSL 中读取和显示 XML id 属性

java - 重构使用全局变量的类

java - Generic querydsl orderBy 带左连接的动态路径生成

xml - Golang 指定 xml 结构中的顶级标签

java - 制作一个创建对象并在单击时显示的按钮

xslt - foreach内部标记化

java - 在同一个锁上同步

java - cassandra-spring 摄取命令不起作用