1

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

    }
4

1 回答 1

2

用于抑制 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>

工作示例

于 2013-03-28T06:31:47.393 回答