gpt4 book ai didi

java - 使用 Saxon 和 XSLT 转换 JDOM XML 文档

转载 作者:行者123 更新时间:2023-12-02 08:20:46 25 4
gpt4 key购买 nike

我正在尝试转换一些 XML,以便 iso8879 实体字符串将出现在字符的位置。例如,字符串 1234-5678 将变为 1234‐5678。我已经使用字符映射和样式表来完成此操作 http://www.w3.org/2003/entities/iso8879doc/overview.html

我的 xslt 的第一部分如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="iso8879map.xsl"/>
<xsl:output omit-xml-declaration = "yes" use-character-maps="iso8879"/>

当我使用 Saxon XSLT 引擎在 Eclipse 中运行此样式表时,它工作正常并输出一个 XML 文件,其中连字符实体字符串代替了连字符。然而,我需要自动化这个过程,所以我使用 JDOM 包。不幸的是,角色在转换过程中没有被替换。执行转换的代码看起来有点像这样:

System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl"); // use saxon for xslt 2.0 support


SAXBuilder builder = new SAXBuilder();
builder.setExpandEntities(false);
XSLTransformer transformer = new XSLTransformer(styleSheet);

Document toTransform = builder.build(Fileref); // transform
Document transformed = transformer.transform(toTransform);

然后,我使用以下方法将文档写入文件:

public static void writeXMLDoc(File xmlDoc, Document jdomDoc){

try {
Format format = Format.getPrettyFormat();
format.setOmitDeclaration(true);
format.setEncoding("ISO-8859-1");
XMLOutputter outputter = new XMLOutputter(format);
//outputter.output((org.jdom.Document) allChapters, System.out);
FileWriter writer = new FileWriter(xmlDoc.getAbsolutePath());
outputter.output((org.jdom.Document) jdomDoc, writer);
writer.close();
}
catch (java.io.IOException exp) {
exp.printStackTrace();
}
}

我已经开始在 Eclipse 中进行调试,看起来连字符在 xslt 转换期间没有被替换。我已经使用 Saxon xslt 引擎对其进行了测试,它确实有效,因此这可能与从 Java 和 Jdom 使用它有关。有人可以帮忙吗?

非常感谢。

吉姆

最佳答案

问题确实是因为没有使用 Saxon 提供的 JDOM 包装类。下面是可供引用的工作代码,显示了 JDOM 文档正在被转换并作为新的 JDOM 文档返回:

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");  // use saxon for xslt 2.0 support
File styleSheet = new File("filePath");

// Get a TransformerFactory
System.setProperty("javax.xml.transform.TransformerFactory",
"com.saxonica.config.ProfessionalTransformerFactory");
TransformerFactory tfactory = TransformerFactory.newInstance();
ProfessionalConfiguration config = (ProfessionalConfiguration)((TransformerFactoryImpl)tfactory).getConfiguration();

// Get a SAXBuilder
SAXBuilder builder = new SAXBuilder();

//Build JDOM Document
Document toTransform = builder.build(inputFileHandle);

//Give it a Saxon wrapper
DocumentWrapper docw = new DocumentWrapper(toTransform, inputHandle.getAbsolutePath(), config);

// Compile the stylesheet
Templates templates = tfactory.newTemplates(new StreamSource(styleSheet));
Transformer transformer = templates.newTransformer();

// Now do a transformation
ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
transformer.transform(docw, new StreamResult(outStream));

ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
Document transformed = builder.build(inStream);

关于java - 使用 Saxon 和 XSLT 转换 JDOM XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5516580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com