- PR -

XSLTで特定のグループ要素以外は全て無視したい

投稿者投稿内容
kou
会議室デビュー日: 2003/03/10
投稿数: 17
投稿日時: 2003-05-27 13:38
いつもお世話になっております。
もしご存知の方がいらっしゃいましたら教えて頂けないでしょうか?


ルート要素配下に複数のグループ要素が存在するXML文書で、特定のグループ要素配下しか処理したくない場合、現在以下のような処理を行なっています。


■入力データ:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<main>
<member>あ</member>
<member>い</member>
<member>う</member>
<member>え</member>
<member>お</member>
</main>
<sub_1>
<value>A</value>
<value>B</value>
<value>C</value>
</sub_1>
</root>

■スタイルシート:
<?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" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="main">
<xsl:value-of select="."/>
</xsl:template>

<xsl:template match="sub_1">
<!-- なにもしない -->
</xsl:template>

</xsl:stylesheet>

■出力結果:
<?xml version="1.0" encoding="UTF-8"?>あいうえお


つまり、処理対象外のテンプレートを作成して何も処理せずに終了させているのですが、もしXML文書のルートノード配下に新たにグループ要素が追加された場合、それごとにこの部分を追加していかなければなりません。


XML文書内で特定のグループ要素以外は全て無視したい場合、他に何か良い方法はないでしょうか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-05-27 17:13
ども、ほむらです。
ふつうに
コード:
<xsl:template match="sub_1 | sub_2 | sub_3"> 
<!-- なにもしない --> 
</xsl:template> 


みたいな書き方ではダメですか?

もしかしたら、他にも方法があるのかもしれませんけど。
保守的に言って自分で指定したほうがよろしいかと。。。
でなければ、rootを展開するときにノードを指定するとか。。。
kou
会議室デビュー日: 2003/03/10
投稿数: 17
投稿日時: 2003-05-27 17:53
ご返答ありがとうございます。m(_ _)m

>保守的に言って自分で指定したほうがよろしいかと。。。
やはりそういうものなんでしょうか?
1つのXML文書を処理するスタイルシートがたくさんあったとして、もしXML文書の構造が変わった場合、全てのスタイルシートを修正しなければいけなくなりますよね?

けっこうこういった例ってあるような気がするんですが、そういうものなんでしょうか?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-05-28 00:20
match の優先順位を使うとか、mode を使うとかが考えられます
記述量はどれも似たようなものだと思います。
困るほどでなければ自分の理解できる方法でどうぞ。

次の段階としては、import や include で部品組み立てとか
何らかの設定から、stylesheet の発生が考えられます。

多段の処理ができるなら、事前の XMLFilter で処理対象のみ
のデータを「濃縮」しておくとかもできるでしょう。
XMLパイプライン処理とか

他の方法では(頭部が管理情報で、後続の本体データが大きい時など)
SAX/XMLpullで頭部のみ処理して、読み込みを途中打ち切りするとか。

データのバインディングするタイプの APIは、読み取りのみの時
部分バインディングできるだろうか?

処理の形が色々なら、XML-DBに格納して問い合わせするのが
イージーでしょう。

======以上、元ネタは
http://www.artima.com/intv/xmlapis2.html
無料翻訳サイトの翻訳でわかる訳文が得られます
元の文章がひねっていないかららしい。

[ メッセージ編集済み 編集者: MMX 編集日時 2003-05-28 13:36 ]
BBSハンドル名
会議室デビュー日: 2003/04/09
投稿数: 8
投稿日時: 2003-05-28 17:22
<xsl:template match="/*/*[not(self::main)]">
</xsl:template>

でどうでしょう。
BBSハンドル名
会議室デビュー日: 2003/04/09
投稿数: 8
投稿日時: 2003-05-28 18:24
というか、

<xsl:template match="/*">
<xsl:apply-templates select='main'/>
</xsl:template>

とするのが普通かな?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-05-29 12:39
ども、ほむらです。
人によって考え方は違うかと思います。
あくままで僕の考え方ですのであしからず
------------------
kouさんへ(引用改行位置を変えさせていただきましたm(__)m)
引用:

1つのXML文書を処理するスタイルシートが
たくさんあったとして、
もしXML文書の構造が変わった場合、全てのスタイルシートを
修正しなければいけなくなりますよね?


XML文書が変わったときのことを考えるのではなく、
追加された場合という形で悩んだほうがいいと思います。
そもそも、XML文書の構造(たぶんエレメント?)が変わるという事実自体がさけるべきかと
それとXML文書がかわったのに同じスタイルシートの適用も考えるのは危ない気がします。

という、前提が僕の中ではあるので、
明示的に表示する方法をとらせていただきました^^;;;;;;
でも、現実はなんども作り直していたりします(笑)
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2003-05-29 13:35
井上です。

個人的見解ですが、要素を後から追加できる柔軟性も XML の長所だと思うので、あまりリジッドにしてしまうのはどうかなー、と思っています。ですから、要素が増えるたびにスタイルシートを作り直すというのも、いかがなものかと。
今回の例でいうと、<main> 要素だけ対象にしたいのであれば、最初から <main> 要素に対応するテンプレートを作成して、それだけをマッチさせれば、<main> 以下にない他の要素は素通りしてくれますから、それがもっとも無難ではないかと思います。
_________________
www.kojii.net

スキルアップ/キャリアアップ(JOB@IT)