0

在我进入具体细节之前,我之前使用 Oracle 的parser.v2XSLT 库尝试过这个并遇到了同样的问题(请参阅我的第一个问题)。但是,当我使用 C# 时它工作正常。

// 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# 处理转换的方式有什么不同吗?它没有失败或给我任何我可以告诉的警告。它只是没有改变任何东西。

4

1 回答 1

1

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

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

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

在这方面,Java 或 C# 之间没有任何区别。如果第一次转换的输出不是格式良好的 XML,那么 C# 不应该接受它作为 XML。我无法解释它为什么会这样做——如果 C# 的 XML 处理器接受格式不正确的 XML,它就会不兼容。我想你没有得到任何输出的原因是转换只是由于非 XML 源而失败。为了找出实际发生的情况,您可以javax.xml.transform.ErrorListener在 Transformer 上设置一个,然后在 ErrorListener 中将所有内容转储到日志中。

(作为一个切线,您还声明您需要使用 Oracle 的 XSL 处理器。真的吗?我假设 Oracle 的实现中必须有一些 Xalan 或 Saxon 中不可用的功能,就像您一样将代码绑定到实现而不是使用 JAXP API,这当然不是推荐的做法。在对 API 编码时调试问题可能会更好,以确保它们不依赖于实现,因为您无法更改实现的内部代码,最好只调试您自己的缺陷,而不是 Oracle 的。但鉴于您上面的示例代码似乎使用 JAXP API,我假设您遇到的问题实际上与 Oracle 的 XSLProcessor 无关.)

于 2012-08-17T02:53:00.667 回答