2011-04-01 67 views
0

我试图转换一些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使用它有关。任何人都可以帮忙吗?

非常感谢。

吉姆

+0

字符映射未完成的变换,它的输出序列的一部分,所以你可能看不到他们在变换中改变。序列化输出的是JDOM,而不是撒克逊。 – 2011-04-01 19:19:54

+0

“我需要自动化这个过程,所以我使用JDOM包”......后者不是由前者规定的结论。撒克逊工作,所以为什么不使用撒克逊自动化过程? – 2011-04-01 20:53:43

+0

事实上,如果您有充分的理由使用JDOM,您可以将其与Saxon一起使用。当您使用其XSLTransformer API时,JDOM使用XSLT 1.0 Xalan处理器,但Saxon也将接受JDOM文档作为输入,允许您使用XSLT 2.0字符映射。 – 2011-04-02 22:14:30

回答

2

问题确实练得与不使用由撒克逊提供的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); 
+0

这是来自Michael Kay的文章:“这是Saxon 9.0的文档,你真的想下载Saxon 9.0吗?如果你有一个很好的理由,但它的方式已经过时 - 例如,JDOM支持适用于旧版本对于Saxon-B,看看SourceForge,对于Saxon-SA,它将在Saxonica网站上,尽管不再积极上市 在最近的版本中,JDOM支持捆绑在Saxon-PE和更高版本中;对于Saxon-HE if你真的希望JDOM支持你可以下载源代码并编译它。“ 因此,请注意,这是撒克逊旧版本的代码。 – 2013-09-11 12:53:50

+0

如果您希望使用最新的方式来执行此操作,请下载其他资源文件,该文件有一个JDOM示例:http://www.saxonica.com/download/download_page.xml – 2013-09-11 13:19:04

+1

上述代码仍然可以正常工作,但Saxon 9.5从9.0开始,您安装必要的支持库的方式发生了变化。从9.2开始,JDOM DocumentWrapper已经包含在带有Saxon-EE和Saxon-PE的二进制JAR文件中,但只能作为源代码与Saxon-HE(源代码位于saxon-resources下载中)一起提供。 – 2013-09-11 14:51:25