プロが教える店舗&オフィスのセキュリティ対策術

Doxygenで生成したxmlデータをWordprocessingML対応データに変換したいのですが、Doxygenで生成したxmlデータには、不要な要素が多数含まれており、それを無視してxslで変換した場合、テンプレートが無い要素はそのままコピーされて困っています。

出力例
test.c
struct_test
<w:p xmlns:w="http://schemas.microsoft.com/office/word/2003/wo …マクロ定義</w:t></w:r></w:p><w:p xmlns:w="http://schemas.microsoft.com/office/word/2003/wo … </w:t><w:t>mmm</w:t><w:t>
</w:t><w:t>ソースファイル テスト </w:t></w:r></w:p>

タグで囲まれていない箇所が問題の箇所。

ひとつのやり方として
<xsl:template match="compoundname"/>
のようにして、無視したい要素をスキップすることは知っていますが、数が多くて対応しきれません。これ以外の方法で、指定した要素以外を全て無視する方法は無いでしょうか?よろしくお願いします。

A 回答 (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

この回答への補足

いろいろ丁寧にありがとうございます。

自分も
><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>

で出力されました。
何かいい方法があればいいのですが。。。

補足日時:2009/03/09 23:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!