如何抑制java.xml Transformer添加到导入的外部系统实体中的xml:base属性?



必须有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) {
        //...
    }
joepie的回答起作用了。下面是包含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>

工作示例

最新更新