• 締切済み

使用しない要素を無視するにはどうすれば?

Doxygenで生成したxmlデータをWordprocessingML対応データに変換したいのですが、Doxygenで生成したxmlデータには、不要な要素が多数含まれており、それを無視してxslで変換した場合、テンプレートが無い要素はそのままコピーされて困っています。 出力例 test.c struct_test <w:p xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"><w:r><w:t>マクロ定義</w:t></w:r></w:p><w:p xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"><w:r><w:t>#define </w:t><w:t>mmm</w:t><w:t> </w:t><w:t>ソースファイル テスト </w:t></w:r></w:p> タグで囲まれていない箇所が問題の箇所。 ひとつのやり方として <xsl:template match="compoundname"/> のようにして、無視したい要素をスキップすることは知っていますが、数が多くて対応しきれません。これ以外の方法で、指定した要素以外を全て無視する方法は無いでしょうか?よろしくお願いします。

みんなの回答

回答No.1

ごめん,いちいちリストアップする方法しか思いつかない。 ===以下,単なる独り言。(本来は回答とするつもりであったが,エラーらしいのでorz)============= 最初出来ると思ってた。XMLマスターBasic試験で, マッチするテンプレートが複数ある場合の処理が出たような気がするけどな…。 http://www.w3.org/TR/xslt#conflict It is possible for a source node to match more than one template rule. The template rule to be used is determined as follows: ソースノードに対してマッチするテンプレートルールが二つ以上存在する事がある。どのテンプレートルールが使われるかは以下によって決定される。 It is an error if this leaves more than one matching template rule. (上記の手段により,マッチするものとして)二つ以上のテンプレートが残った場合,エラーである。 An XSLT processor may signal the error; XSLTプロセッサはエラーを通知する事がある。 if it does not signal the error, it must recover by choosing, もし,エラーを通知しない場合,XSLTプロセッサは from amongst the matching template rules that are left, the one 残ったテンプレートルールの中で, that occurs last in the stylesheet. スタイルシート中一番最後に登場するものを使わなければならない。 ===================================== …手元のいくつかの実装はエラーを通知しないようで, 一番最後のテンプレートルールが選ばれる じゃあ,今までのテンプレートルールの前に <xsl:template match="*" /> とか書いて置けば,今までテンプレートルールで定義されていた奴はそっちが使われ,残りの要素はこのテンプレートルールに引っかかって何もしなくなるんじゃないか? ==== …と、思ったんだけどねぇ。 ちなみに,マッチするテンプレートルールが無いときはビルトインテンプレートが適用されるよ。 http://www.w3.org/TR/xslt#built-in-rule

mdfdq495
質問者

補足

いろいろ丁寧にありがとうございます。 自分も ><xsl:template match="*" /> >とか書いて置けば,今までテンプレートルールで定義されていた奴は>そっちが使われ,残りの要素はこのテンプレートルールに引っかかっ>て何もしなくなるんじゃないか? と思い <xsl:template match="/" priority="1"> <w:document> <w:body> <xsl:apply-templates/> </w:body> </w:document> </xsl:template> <xsl:template match="sectiondef" priority="1" > <xsl:choose> <xsl:when test="./@kind='define'"> <w:p> <w:r> <w:t>マクロ定義</w:t> </w:r> </w:p> <w:p> <w:r> <w:t>#define </w:t> <w:t><xsl:value-of select="memberdef/name"/></w:t> <w:t><xsl:value-of select="memberdef/briefdescription"/></w:t> <w:t><xsl:value-of select="memberdef/detaileddescription/para"/></w:t> </w:r> </w:p> </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="*|/" priority="0" /> のように記述したのですが、結果 <?xml version="1.0" encoding="UTF-16"?><w:document xmlns:w=http~><w:body></w:body></w:document> で出力されました。 何かいい方法があればいいのですが。。。

関連するQ&A