在JAVA中,我使用importNode将节点从一个XML文档复制到另一个新文档。在原始文档中有一个xmlns定义,但在输出文档中我想不会为我复制的每个元素定义xmlns。怎么做?
答案 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);