繁体   English   中英

变压器未从文档对象读取特殊字符

[英]Transformer not reading Special Character from Document Object

我正在尝试从文档对象读取xml数据,然后使用转换器使用XSL将文档对象内部的数据呈现为pdf,

我的代码是:

Document doc = toXML(arg1,arg2);

doc包含如下数据: İlkyönetmeliğiwith in tags

InputStream inputStream = new FileInputStream(xslFilePath);
transformer = factory.newTransformer(new StreamSource(inputStream));
transformer.setParameter("encoding", "UTF-8");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc.getDocumentElement()), res);

xml中存在的特殊字符不会相应地呈现,并且显示如下

#lk码#m

我也已将编码设置为UTF-8,但仍显示如上。

目前还不清楚是什么原因导致你的编码的问题,因为我看不到你的文档的读取/建造和改造的结果如何res设置。 尝试使用以下独立的示例代码来处理XSLT编码。 也许您甚至可以逐步修改它以使用您的实际数据以查看出了什么问题。

public static void main(String[] args) {
    try {
        String inputEncoding = "UTF-16";
        String xsltEncoding = "ASCII";
        String outputEncoding = "UTF-8";

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(bos, inputEncoding);
        osw.write("<?xml version='1.0' encoding='" + inputEncoding + "'?>");
        osw.write("<root>İlkyönetmeliği</root>"); osw.close();
        byte[] inputBytes = bos.toByteArray();
        bos.reset();

        osw = new OutputStreamWriter(bos, xsltEncoding);
        osw.write("<?xml version='1.0' encoding='" + xsltEncoding + "'?>");
        osw.write("<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>");
        osw.write("<xsl:template match='@*|node()'><xsl:copy><xsl:apply-templates select='@*|node()'/></xsl:copy></xsl:template>");
        osw.write("</xsl:stylesheet>"); osw.close();
        byte[] xsltBytes = bos.toByteArray();
        bos.reset();

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document d = db.parse(new InputSource(new InputStreamReader(new ByteArrayInputStream(inputBytes), inputEncoding)));
        // if encoding declaration correct, use: Document d = db.parse(new InputSource(new ByteArrayInputStream(inputBytes)));
        System.out.println(XPathFactory.newInstance().newXPath().evaluate("/root[1]", d));

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(new InputStreamReader(new ByteArrayInputStream(xsltBytes), xsltEncoding)));
        // if encoding declaration correct, use: Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsltBytes)));
        StreamResult sr = new StreamResult(new OutputStreamWriter(bos, outputEncoding));
        t.setOutputProperty(OutputKeys.ENCODING, outputEncoding);
        t.transform(new DOMSource(d.getDocumentElement()), sr);
        byte[] outputBytes = bos.toByteArray();

        Scanner s = new Scanner(new InputStreamReader(new ByteArrayInputStream(outputBytes), outputEncoding));
        String output = s.useDelimiter("</>").next(); // read all
        s.close();

        System.out.println(output);
    } catch (Exception ex) {
        ex.printStackTrace(System.err);
    }

该示例代码将XSLT身份模板应用于包含非ASCII字符的最小输入。

我输出字符串以检查是否已使用XPath在文档中正确解析了该字符串。 如果您知道如何使用XPath查找文档,则可能需要检查(中间)文档。

请注意,如果存在解析器,则在读取XML文件时,默认情况下解析器将尝试获取XML处理指令(PI)中声明的编码。 假定实际和声明的编码相同。 如果它们不同或缺少PI,则可以强制执行实际的编码,例如通过使用上面代码中的InputStreamReader

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM