我在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);
答案 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来构建源,而无需设置系统属性。