gpt4 book ai didi

java - 如何抑制 xml :base attribute that the java. xml Transformer 正在添加到导入的外部系统实体?

转载 作者:行者123 更新时间:2023-11-30 04:26:49 24 4
gpt4 key购买 nike

必须有一个 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)));

}

最佳答案

用于抑制 xml:base 属性的 XSLT 1.0 模板:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!-- Suppress xml:base attributes -->
<xsl:template match="@xml:base"/>

</xsl:transform>

<强> Working Example

关于java - 如何抑制 xml :base attribute that the java. xml Transformer 正在添加到导入的外部系统实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com