java.lang.IllegalArgumentException:不支持:indent-number

时间:2013-02-28 11:53:30

标签: java xml xslt

public String filter(String message) {
        if (message == null) {
            return null;
        }

        // Remove formatting, transformer fails to handle wrong indentation correctly.
        message = message.replaceAll(">\\s*[\\r\\n]+\\s*", ">");
        message = message.replaceAll("\\s*[\\r\\n]+\\s*", " "); // for wrapped attribute lists

        Source xmlInput = new StreamSource(new StringReader(message));
        StringWriter stringWriter = new StringWriter();
        try {
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            transformerFactory.setAttribute("indent-number", INDENT); // for Java 6

            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", INDENT.toString()); // Java 1.5
            transformer.transform(xmlInput, new StreamResult(stringWriter));

            String pretty = stringWriter.toString();
            pretty = pretty.replace("\r\n", "\n");
            return pretty;
        } catch (TransformerException e) {
            if (e.getCause() != null && e.getCause() instanceof SAXParseException) {
                return message;
            }
            throw new RuntimeException(e);
        }
    }

但我在这里得到例外:

transformerFactory.setAttribute("indent-number", INDENT); // for Java 6
  

java.lang.IllegalArgumentException:不支持:indent-number

我的java:

java version "1.6.0_33"

为什么我会收到此错误?

4 个答案:

答案 0 :(得分:12)

我通过评论此行来修复该异常:

transformerFactory.setAttribute("indent-number", indent);

并添加以下行:

transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

即使浏览器中出现的修改不正确,异常也就消失了。

答案 1 :(得分:1)

而不是

TransformerFactory transformerFactory = TransformerFactory.newInstance();

你应该写

TransformerFactory transformerFactory = new TransformerFactoryImpl();

因为并非TransformerFactory的所有实施都具有该字段"indent-number"

答案 2 :(得分:0)

可能因为Xalan(在JDK1.6 / 1.7中打包)支持“indent-number”,但是其他人没有并且有自己的方式来指定缩进的大小。所以你必须放入适合XSLT提供程序的字符串。找出你正在使用的内容并查看其文档

不是那些没有指明这些事情的标准吗?

答案 3 :(得分:-2)

您应该使用预定义的常量OutputKeys.INDENT,或者如果您真的坚持对值进行硬编码,则应该是'缩进',而不是'缩进号码'。