必须有一个 xslt 或 xalan 属性,但我找不到它。
假设我有一个声明外部系统实体的 xml 文件:
<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE stuff [
<!ENTITY imported_fragment SYSTEM "fragment.xml">
]>
<stuff>
<innerstuff name="a">
<lala>Hello!</lala>
</innerstuff>
&imported_fragment;
</stuff>
片段看起来像:
<innerstuff name="b">
<lala>Bye!</lala>
</innerstuff>
如果我使用 javax.xml 类读入并将其写回,我会得到:
<?xml version="1.0" standalone="yes" ?>
<stuff>
<innerstuff name="a">
<lala>Hello!</lala>
</innerstuff>
<innerstuff name="b" xml:base="file:/full/path/to/fragment.xml">
<lala>Bye!</lala>
</innerstuff>
</stuff>
xml:base
请注意它添加的属性。我该如何抑制这个?
这是我用来读写 xml 文件的代码:
Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
sLogger.info("Parsing file: " + fInputFile);
dom = db.parse(fInputFile);
} catch (SAXException | IOException | ParserConfigurationException e) {
//...
}
try {
Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.setOutputProperty(OutputKeys.METHOD, "xml");
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tr.setOutputProperty(OutputKeys.STANDALONE, "yes");
//tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
File outputFile = new File(fOutputDirectory, fInputFile.getName());
sLogger..info("Writing xml output to: " + outputFile);
tr.transform(new DOMSource(dom),
new StreamResult(new FileOutputStream(outputFile)));
} catch (IOException | TransformerException e) {
//...
}
编辑:乔皮的回答有效。这是包含他的 XSLT 的 java 代码
try {
Transformer tr = TransformerFactory.newInstance().newTransformer();
DOMResult domResult = new DOMResult();
tr.transform(new DOMSource(dom), domResult);
StreamSource source = new StreamSource(getClass().getResourceAsStream("removexmlbase.xslt"));
Transformer tr2 = TransformerFactory.newInstance().newTransformer(source);
tr2.setOutputProperty(OutputKeys.INDENT, "yes");
tr2.setOutputProperty(OutputKeys.METHOD, "xml");
tr2.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tr2.setOutputProperty(OutputKeys.STANDALONE, "yes");
//tr2.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
File outputFile = new File(fOutputDirectory, fXMLFile.getName());
getLog().info("Writing xml output to: " + outputFile);
// send DOM to file
tr2.transform(new DOMSource(domResult.getNode()), new StreamResult(new FileOutputStream(outputFile)));
}