- PR -

データのグループ処理について

1
投稿者投稿内容
もこ
会議室デビュー日: 2002/02/12
投稿数: 2
投稿日時: 2002-02-12 13:05
みなさん、はじめまして。
現在初めてのXSLTを学習中ですが、XPathが今ひとつ理解できずに悩んでいます。

下記のようなXMLがあります。
<Data>
<Table1>
<name>AAA</name>
<name>BBB</name>
<name>CCC</name>
</Table1>
<Table2>
<Quote name="AAA">1234</Quote>
<Quote name="AAA">1456</Quote>
<Quote name="AAA">7894</Quote>
<Quote name="BBB">8709</Quote>
<Quote name="BBB">2398</Quote>
<Quote name="CCC">4949</Quote>
<Quote name="CCC">8484</Quote>
<Quote name="CCC">9494</Quote>
<Quote name="CCC">4848</Quote>
</Table2>
</Data>
Table1のnameの値のいずれかが、常にQuote@nameの値になります。
Table1のnameの数や値は未知であり、Table2のデータ数も変動します。

このXMLにおいて、Quote@name の値によるグループ処理をしたいのですが、
どのようにしてグループとしてノードセットを取り込めばよいのかがわかりません。
(グループ処理の内容は、nameごとのデータにおける、最大値、最小値、平均値の
取得です。)

XPathをうまく使えばできるはずだと思って試行錯誤しているのですが、XSLTの
処理の流れ方もよく理解できず、長い間停滞しています。
何らかのヒントをいただければ大変助かります。よろしくご指導ください。
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2002-02-12 13:40
井上です。
分類のキーになるデータと、実際の計算対象になるデータを別々のファイルに分けた方が、処理がしやすいですね。つまり、Table1 と Table2 を別の XML 文書に分けます。
以下に、私が作ったリストを載せます。これで、とりあえず合計が計算できます。

・table1.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<Table1>
<name>AAA</name>
<name>BBB</name>
<name>CCC</name>
</Table1>


・table2.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="table2.xsl"?>
<Table2>
<Quote name="AAA">1234</Quote>
<Quote name="AAA">1456</Quote>
<Quote name="AAA">7894</Quote>
<Quote name="BBB">8709</Quote>
<Quote name="BBB">2398</Quote>
<Quote name="CCC">4949</Quote>
<Quote name="CCC">8484</Quote>
<Quote name="CCC">9494</Quote>
<Quote name="CCC">4848</Quote>
</Table2>


・table2.xsl
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">

<HTML><BODY>

<xsl:for-each select="document('table1.xml')/Table1/name">
<xsl:variable name="category" select="."/>
<P>
<xsl:value-of select="$category" /> :
<xsl:value-of select="sum(document('table2.xml')/Table2/Quote[@name = $category])" />
</P>
</xsl:for-each>

</BODY></HTML>

</xsl:template>
</xsl:stylesheet>


ファイルを分割した上で、document() 関数を使って参照しているところがミソです。
試してみてください。

_________________
<author>
<name>井上 孝司</name> <web>www.kojii.net</web>
</author>

[ メッセージ編集済み 編集者: 井上孝司 編集日時 2002-02-12 13:41 ]

[ メッセージ編集済み 編集者: 井上孝司 編集日時 2002-02-12 16:43 ]
もこ
会議室デビュー日: 2002/02/12
投稿数: 2
投稿日時: 2002-02-13 10:40
井上さん、ありがとうございました。
document()関数というのが使えるとは知りませんでした。大変便利そうですね。
勉強してみます。

ところが、ここでまた問題が生じました。
このケースの場合、分類のキーとなるデータと、計算対象のデータの値が必ずしも
一致しない場合もあるということがわかりました。
対象データの値の方に、追加されたものがあるそうです。
この場合、せっかくのキーが使用できず、井上さんが分割してくださった
table2.xmlの方だけを使って、グループ処理しなくてはいけないと思います。
そのようなことはできるのでしょうか?

つねに同じグループのデータが連続して出現すると仮定した場合、
変数にQuote@name の値をとっておいて次の値と比較し、違っていればそこで
グループの切れ目とする、という処理になるのでしょうか。

XLSTですと、このような処理を構築するのが難しいように感じるのですが、
もし何かアイディアをいただけましたら大変助かります。

何度も申し訳ありませんが、どうぞよろしくお願いいたします。
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2002-02-13 13:20
井上です。
私も以前に似たようなクロス集計処理を試みて挫折したことがあります。というのは、XSLT では所謂「A=A+1」的な代入処理ができないためなのですが、その後、計算処理部分をテンプレートとして独立させておいて、そのテンプレートが自分自身を呼び出す、つまりテンプレートの再帰呼び出しをすれば解決できるのではないか、という話を聞きました。(確か、「XML World Vol.2」に書いてあったような気がします)

実際に試すヒマがないままになっているのですが、トライしてみる価値はありそうです。ただ、いうまでもないことですが、再帰呼び出しを止める条件分岐を設定しておかないと、テンプレートの呼び出しが無限ループしてしまいますね
_________________
www.kojii.net
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-02-13 14:26
・ XLSTですと、このような処理を構築するのが難しいように感じるのですが
おっしゃる通りです、手続き型の発想を、転換しないと道は開けません。
バターン・マッチとかイベント駆動とか、関数型とか呼び方はいろいろ
XSLT2.0 ではグループの扱いが強化予定ですが、今のところ裏口を使わないと
合計中間変数は実現しません。

(あるいは、template match の無いXSLTと言えるXi(http://www.baykit.org)
を使うとできるかも)

普通の方法は、要素の集約(1)http://qa.xml.gr.jp/data/xsl/files/0026.xml
参考にして、第一ループのTable1 に相当するものをxsltの変数に取得します。
その変数を以下同様にfor-eachで刻んで逐次合計を得ます。

XSLTで水平の順序構造を扱うには、末尾再帰の階層呼び出しの形で処理します。
水平の形がとれないので垂直に変換しています。呼び出しの引数に、
直前値や中間合計値を当てます。

長大なXPath式を書いて再帰を書かずにできる場合もあるが、読みやすさと処理効率は?
長大な正規表現と扱いの感覚は似ている
(正規表現が演歌なら、XPathはHipHop(ヨゥ)です)

XSLTやDOM/SAX でもがくより、XMLデータをプログラム言語の変数・オブジェクト
にマッピング(バインド)して、その言語の機能で扱う、を開発している
のもあります。 http://www-6.ibm.com/jp/developerworks/xml/020208/j_x-matters14.html
CommonLISP,Prolog,Smalltalk,Java(Relaxer*),・・・
追加、「盆栽的プログラミング」http://www.ba.wakwak.com/~fuchi/
スレッドのテーマとズレますが、別に何でもXML-DOMのAPIで操作できるマッピングを
開発する方向も出ました。Inside Sablotron: Virtual XML Documents
http://www.xml.com/lpt/a/2002/03/13/sablotron.html
その人がやりやすい操作系を選ぶと良いでしょう。

[ メッセージ編集済み 編集者: MMX 編集日時 2002-03-17 15:26 ]
1

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