2011-06-19 18 views
1

JAVAでは、importNodeを使用して、あるXML文書から別の新しい文書にノードをコピーします。元のドキュメントには定義されているxmlnsがありますが、出力ドキュメントでは、コピーした各要素ごとにxmlnsを定義したくありません。どうやってするの?Java XML Transformerを使用してXMLNSを追加しないでください。

答えて

1

は良い解決策のようだ:

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); 
1

どういう意味ですか。 XML文書にxmlnsがある場合、それは実際には要素名の簡略表記です。例えばxmlnsは「http://example.com/#」であるならば、

<foo attr="xxx">...</foo> 

のための真の要素名は、あなたがしたい場合は、

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

などのxmlnsずに書くでしょうhttp://example.com/#foo、ありますそのように見えるようにXMLを出力するには、XMLライターのパラメータを調整することでそれを達成することが可能でなければなりません。

出力XMLを元のように表示するにはxmlnsを使用しない場合は、実際にはというXMLの意味を変更します。これを行うためのきれいな方法は、XSLトランスフォーマを使用することです。

+0

あなたはXSLトランスなしでそれを行う方法を知っていますか?私は通常のトランスを使用して、元のXMLからコピーされた各ノードに、xmlnsが追加されました - 私は望みません。 – Inez

+0

私はあなたのアプリケーションが文書のすべての 'Element'ノードを訪問し、' setPrefix(...) 'を使って要素の接頭辞を変更することができると思います。警告があります。 javadocを読んでください。 –

1

あなたはJava XML Transformerを使用していますが、アイデンティティトランスフォーマ(TransformerFactory.newTransformer())を意味するのか、XSLTトランスフォーメーションのJavaインターフェイスを使用するのかは明確ではありません。

たとえば、要素名を変更するなどして、ドキュメントを変換する操作が必要なときにドキュメントをコピーする操作をしているかのように聞こえます。以下のように定義されたXSLでたjavax.xml.transform.Transformerを使用して

関連する問題