Java TransformerFactory-使用多个样式表
我有多个XSL或样式表用于XML的schematron验证(其中一个是根目录,其他导入到根目录)。下面的代码用于一个样式表Java TransformerFactory-使用多个样式表,java,xml,xslt,xsd,Java,Xml,Xslt,Xsd,我有多个XSL或样式表用于XML的schematron验证(其中一个是根目录,其他导入到根目录)。下面的代码用于一个样式表 public XMLSaxonTransformer(InputStream styleSheet) { final TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null); try
public XMLSaxonTransformer(InputStream styleSheet) {
final TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
try {
styleSheetTemplate = transformerFactory.newTemplates(new StreamSource(styleSheet), new StreamSource(styleSheet));
} catch (TransformerConfigurationException e) {
throw new Exception("Exception caught while parsing StyleSheet", e);
}
}
以上内容适用于单个样式表。但是,我的要求是多个样式表,其中一个根目录中包含其他样式表
我的代码应该如下所示
public XMLSaxonTransformer(List<InputStream> styleSheetList) {
final TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
try {
// do something to add the XSL's list to the transformer
} catch (TransformerConfigurationException e) {
throw new Exception("Exception caught while parsing StyleSheet", e);
}}
公共XMLSaxonTransformer(列表样式表列表){
final TransformerFactory TransformerFactory=TransformerFactory.newInstance(“net.sf.saxon.TransformerFactoryImpl”,null);
试一试{
//执行一些操作将XSL列表添加到转换器中
}捕获(TransformerConfiguration异常e){
抛出新异常(“分析样式表时捕获的异常”,e);
}}
您应该只为
TransformerFactory.newTemplates()方法指定顶级样式表。顶级样式表将使用xsl:include
或xsl:import
引入其他样式表模块。如果这些样式表模块仅存在于内存中,则需要向TransformerFactory
指定一个URIResolver
。当遇到xsl:include
或xsl:import
声明时,将调用URIResolver
,它应该返回Source
对象(例如StreamSource
)来传递样式表模块的内容。是的,其中一个是包含其他内容的根。但是,我没有在本地文件系统中提供根目录。所有这些都作为StreamSource提供。根据这一点,当XSL遇到XSL:import时,只有当它们本地存储在同一目录中,并且使用URIResolver将此目录URI设置为TransformerFactory时,才可以提取它们。但是,我的XSL在S3存储中,不能在本地存储它们。我只有列表格式的所有XSL的StreamSource,没有关于根的线索。你误解了41865349的答案。最好使用newstreamsource()
的第二个参数来确保样式表模块具有基本URI(或“SystemId”)。这不需要是一个实际的物理目录。