我试图转换一些XML,以便iso8879实体字符串将出现在字符位置。例如,字符串1234-5678
将变成1234‐5678
。我已经使用字符映射和http://www.w3.org/2003/entities/iso8879doc/overview.html中的样式表完成了这个工作。使用Saxon和XSLT转换JDOM XML文档
我的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"/>
当我运行这个样式表在Eclipse与撒克逊XSLT引擎正常工作和到位的输出与连字符entitiy字符串的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使用它有关。任何人都可以帮忙吗?
非常感谢。
吉姆
字符映射未完成的变换,它的输出序列的一部分,所以你可能看不到他们在变换中改变。序列化输出的是JDOM,而不是撒克逊。 – 2011-04-01 19:19:54
“我需要自动化这个过程,所以我使用JDOM包”......后者不是由前者规定的结论。撒克逊工作,所以为什么不使用撒克逊自动化过程? – 2011-04-01 20:53:43
事实上,如果您有充分的理由使用JDOM,您可以将其与Saxon一起使用。当您使用其XSLTransformer API时,JDOM使用XSLT 1.0 Xalan处理器,但Saxon也将接受JDOM文档作为输入,允许您使用XSLT 2.0字符映射。 – 2011-04-02 22:14:30