使用Java XML Transformer时如何避免添加XMLNS?

时间:2011-06-19 03:26:31

标签: java xml xpath

在JAVA中,我使用importNode将节点从一个XML文档复制到另一个新文档。在原始文档中有一个xmlns定义,但在输出文档中我想不会为我复制的每个元素定义xmlns。怎么做?

3 个答案:

答案 0 :(得分:1)

这取决于你的意思。当XML文档有xmlns时,它实际上是元素名称的简写;例如如果xmlns是“http://example.com/#”,那么

的真正元素名称
    <foo attr="xxx">...</foo>

http://example.com/#foo,您可以在没有xmlns的情况下编写

    <http://example.com/#foo attr="xxx">...</http://example.com/#foo>

如果您希望输出XML看起来像这样,那么应该可以通过调整XML编写器参数来实现它。

如果您希望输出XML看起来像原始XML,但没有xmlns,那么实际上正在改变XML的含义。干净的方法是使用XSL转换器。

答案 1 :(得分:1)

您说您正在使用Java XML Transformer,但不清楚您是指复制品(TransformerFactory.newTransformer())还是XSLT转换的Java接口。

听起来好像你正在使用一个复制文档的操作,当你需要一个转换它的操作时,例如通过改变元素名称。

答案 2 :(得分:1)

使用如下定义的XSL的javax.xml.transform.Transformer似乎是一个很好的解决方案:

    String stylesheet = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
            "<xsl:output method=\"xml\" version=\"1.0\" indent=\"no\"/>" +
            "<xsl:template match=\"*\">" +
            "<xsl:element name=\"{local-name()}\">" +
            "<xsl:for-each select=\"@*\">" +
            "<xsl:attribute name=\"{local-name()}\">" +
            "<xsl:value-of select=\".\"/>" +
            "</xsl:attribute>" +
            "</xsl:for-each>" +
            "<xsl:apply-templates/>" +
            "</xsl:element>" +
            "</xsl:template>" +
            "</xsl:stylesheet>";

    StreamSource xslSource = new StreamSource(new StringReader(stylesheet));
    Transformer transformer = tf.newTransformer(xslSource);