Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TransformerFactory-使用多个样式表_Java_Xml_Xslt_Xsd - Fatal编程技术网

Java TransformerFactory-使用多个样式表

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

我有多个XSL或样式表用于XML的schematron验证(其中一个是根目录,其他导入到根目录)。下面的代码用于一个样式表

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”)。这不需要是一个实际的物理目录。