- PR -

XSLTで開始Elementから終了Elementまでを抜き出す方法

1
投稿者投稿内容
aiaru
会議室デビュー日: 2009/02/10
投稿数: 7
投稿日時: 2009-02-10 18:31
お世話になっております。


XSLTにて、開始Elementから終了Elementまでを抜き出す良い方法はありませんでしょうか?

*[XML]************************
<ROOT>
<A>0001<A>
<B>0002<B>
<C>0003<C>
<D>0004<D>
<B>0005<B>
<A>0006<A>
</ROOT>
***************************

<B>から<D>までの値を抜き出したい

*[ほしい結果]************************
<B>0002<B>
<C>0003<C>
<D>0004<D>

なにかよい方法がありましたらご教授ください。
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2009-02-10 19:29
2番目から4番目までということであれば、
position()を使っていけると思います。
aiaru
会議室デビュー日: 2009/02/10
投稿数: 7
投稿日時: 2009-02-11 00:25
回答ありがとうございます。

上記の例の場合、はpositionでも取得可能なのですが、とりたいのは
<B>から<D>までの値を取得というロジックでとりたいとおもっております。

xsl:for-eachでまわしてという処理になるかと思うのですが、シンプルにかけないものかと。。。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2009-02-11 13:30
状態を持つような動作をさせたいなら、再帰処理を書かないとダメではないですか。
aiaru
会議室デビュー日: 2009/02/10
投稿数: 7
投稿日時: 2009-02-12 18:36
回答ありがとうございます。

やはり再帰処理ですかね。。。

preceding-sibling::Bの結果のNodeListから
following-sibling::Dをした結果がとれる方法があれば行けそうなんですが、
なかなかうまくいかないものです。

***************************************************************** 
<xsl:template match="ROOT">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="*[(preceding-sibling::B | self::B) and (following-sibling::D | self::D)]">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
***************************************************************** 
※上記だとpreceding-sibling::Bの結果のNodeListを対象にfollowingしていないので以下のようなケースがNG

<ROOT>
<D>0000</D>
<A>0001</A>
<B>0002</B>
<C>0003</C>
<D>0004</D>
<B>0005</B>
<D>0004</D>
<B>0005</B>
<A>0006</A>
</ROOT>
1

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