SSブログ

XSLで集計、できました。 [XMLマスター]


できました。
色々前述のXSLTを元にいじってましたがどうにもノードの選択がうまくいきませんでした。
XSLTで集計・・・もうちょっとだと思うんだけど。


それで、いかの「ほむらさん」のコードをベースで修正しました。
この場を借りてお礼申し上げます。ありがとうございました。(*)
「XSLTで集計 - XML & SOA」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5638&forum=9&13

ポイントは、軸の選択ですね。
データ:
<?xml version="1.0" encoding="utf-8"?>
<root>
<node att1="A" att2="a" att3="1" att4="50" att5="0001" />
<node att1="A" att2="a" att3="1" att4="50" att5="0002" />
<node att1="A" att2="a" att3="1" att4="50" att5="0003" />
<node att1="A" att2="a" att3="1" att4="50" att5="0004" />
<node att1="A" att2="a" att3="1" att4="50" att5="0005" />
<node att1="B" att2="b" att3="2" att4="51" att5="0006" />
<node att1="B" att2="b" att3="2" att4="51" att5="0007" />
<node att1="B" att2="b" att3="2" att4="51" att5="0008" />
<node att1="A" att2="b" att3="1" att4="50" att5="0009" />
</root>


ファイル:http://www009.upp.so-net.ne.jp/Mishika/xml/data_multiatt.xml

<?xml version="1.0" encoding="shift-jis"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xml:lang="ja">
<xsl:template match="/root">
全ノード数は <xsl:value-of select="count(child::node)" /> です
<table border="1">
<tr>
<th><xsl:value-of select="name(child::node/@att1)"/></th>
<th><xsl:value-of select="name(child::node/@att2)"/></th>
<th><xsl:value-of select="name(child::node/@att3)"/></th>
<th><xsl:value-of select="name(child::node/@att4)"/></th>
<th>sum</th>
</tr>
<xsl:for-each select="node">
<xsl:sort select="@att1 and @att2 and @att3 and @att4"/>
<xsl:apply-templates select="."/>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="node">
<xsl:variable name="v1" select="@att1" />
<xsl:variable name="v2" select="@att2" />
<xsl:variable name="v3" select="@att3" />
<xsl:variable name="v4" select="@att4" />
<!-- 自分よりも前に同じノードがあった場合は集計済みなので無視 -->
<xsl:if test="count(preceding-sibling::node[@att1=$v1][@att2=$v2][@att3=$v3][@att4=$v4]) = '0'">
<!-- 自分よりも後ろにあるノードの集計 -->
<tr><td><xsl:value-of select="@att1"/></td>
<td><xsl:value-of select="@att2"/></td>
<td><xsl:value-of select="@att3"/></td>
<td><xsl:value-of select="@att4"/></td>
<td><xsl:value-of select="count(following-sibling::node[@att1=$v1][@att2=$v2][@att3=$v3][@att4=$v4])+1"/></td></tr>

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

ファイル:http://www009.upp.so-net.ne.jp/Mishika/xml/count_multiatt.xsl


結果:
全ノード数は 9 です
att1att2att3att4sum
Aa1505
Bb2513
Ab1501




*# 本来ならかの掲示板でお礼するべきなのでしょうが、私は掲示板に書き込んだことがない部外者で、かつ掲示板のやりとりから外れた内容なので掲示板への書き込みは控えています。
タグ:XSLT
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0