2012-07-12 73 views
0

在我进入具体细节之前,我先用Oracle的parser.v2 XSLT库尝试了这一点,并遇到同样的问题(请参阅my first question)。但是,当我使用C#时,它工作正常。SAXTransform链中的第二个XSLT似乎没有做任何事情

// from the example I see everywhere on the internet 
SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); 

Templates t_cctagstrip = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\first.xsl"))); 
Templates t_cctable = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\second.xsl"))); 

TransformerHandler th1 = stf.newTransformerHandler(t_cctagstrip); 
TransformerHandler th2 = stf.newTransformerHandler(t_cctable); 

// transform 1 pipes into transform 2 
th1.setResult(new SAXResult(th2)); 

// transform 2 pipes to System.out 
th2.setResult(new StreamResult(System.out)); 

Transformer t = stf.newTransformer(); 
t.transform(new StreamSource(new FileInputStream("C:\\path\\to\\source.xml")), new SAXResult(th1)); 

我在想,也许问题就在于从第一变换的输出是在根级文本片段?

text at root level 
<tag> ... tags that need extra processing ... </tag> 
more text at root level 

C#如何处理转换有什么不同吗?这不是失败或给我任何警告,我可以告诉。这只是没有改变任何东西。

回答

1

您在第一个问题中没有提及您遇到的实际问题,例如提供任何日志消息等,因此无法知道您的XSLT转换失败的原因。但在第二个问题中,你清楚地揭示了为什么事情失败了。

通常,XSLT转换要求所有解析的内容至少为至少格式良好的XML。如果您的源文档未包含“根”元素(实际上称为文档元素),那么它不是格式良好的XML,因此不是定义XML,因此不适用于XML处理。

作为一种解决方案,如果您可以将第一个转换的输出包装到文档元素中,您可以继续将其解析为XML。之后您可以通过非XML流程剥离它。

Java或C#在这方面不会有任何区别。如果第一次转换的输出不是格式良好的XML,那么C#不应该将其作为XML接受。我无法解释为什么它可能会这样做—如果C#的XML处理器接受非格式良好的XML,它将不符合规范。我想,你没有得到任何输出的原因是,由于非XML源代码,转换只是失败。为了找出实际发生的事情,您可以在Transformer上设置javax.xml.transform.ErrorListener,并在ErrorListener中将所有内容转储到日志中。我认为在Oracle的实现中必须有一些在Xalan或Saxon中不可用的特性,我们假设你需要使用Oracle的XSL处理器。真的吗? ,因为你将代码绑定到一个实现上,而不是使用JAXP API,这当然不是推荐的做法。当编码到API以确保它们不依赖于实现时调试问题可能更好,因为你不能改变实现的内部代码,最好只是调试你自己的缺陷,而不是甲骨文的。但是鉴于你上面的示例代码似乎使用JAXP API,我假设你遇到的问题不是'实际上与Oracle的XSLProcessor绑定)。

+0

我找不到日志消息。它似乎没有失败 - 只是没有改变XML。但是,你的失败原因是正确的,所以我将其标记为答案。 – climbage 2012-09-04 22:18:35

相关问题