在同一个应用程序中使用和不使用xinclude的java xalan转换

时间:2014-06-25 14:50:36

标签: java xml xslt xalan xinclude

我在java中编写了一本书籍数据库应用程序。这些书以XML格式存储。每本书都是XML。书籍可以包含短篇小说,短篇小说可以是XML。 在这种情况下,这本书看起来像:

<?xml version="1.0" encoding="UTF-8"?>
...
<book>
  <content>
    <xi:include  xmlns:xi="http://www.w3.org/2001/XInclude" href="shortStory.xml"/>
  </content>
</book>

因为用户只能上传一个xml,并且它可以是“book.xml”而不是“shortStory.xml”(之前总是上传的shortStory.xml),我需要在没有xinclude的情况下进行XSLT转换。 (et case这两个文件的路径不一样)

但是在上传之后(在其他用例中)我需要用XInclude进行XSLT转换(两个文件是相同的路径)

使用Xinclude的每个解决方案在从Transformerfactory获取实例之前设置系统属性:

System.setProperty(
    "org.apache.xerces.xni.parser.XMLParserConfiguration",
    "org.apache.xerces.parsers.XIncludeParserConfiguration"); 

或使用DocumentBuilderFactory.setXIncludeAware()。

我想要两个javax.xml.transform.Transformer设置使用xinclude而不使用xinclude。 或者一个transformert但是javax.xml.transform.stream.StreamSource的一个简单方法来打开/包含xinclude。

thanx

修改

尝试Martin Honnen的解决方案,但转换存在问题,因此我将SAXreader更改为Documentbuilder:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(input);
Source source = new DOMSource(doc);
...
transformer.transform(source, result);

1 个答案:

答案 0 :(得分:0)

我认为这更像是与XML解析器相关的问题,而不是与XSLT处理器相关的问题。根据{{​​3}},您可以设置

import javax.xml.parsers.SAXParser;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

SAXParser parser = /* created from SAXParserFactory */;
XMLReader reader = parser.getXMLReader();
try {
    reader.setFeature("http://apache.org/xml/features/xinclude", 
                      true);
} 
catch (SAXException e) {
    System.err.println("could not set parser feature");
}

然后你可以用我认为的那个阅读器构建一个SAXSource:

SAXSource source = new SAXSource();
source.setXMLReader(reader);

通过这种方式,您可以打开或关闭XInclude来构建源,而无需设置系统属性。