- PR -

XSLT:ソート後の内容比較は可能でしょうか?

1
投稿者投稿内容
きくらげ
会議室デビュー日: 2005/01/06
投稿数: 7
投稿日時: 2005-01-06 16:21
はじめまして

いきなりで申し訳ないのですが、質問をさせてください。

<DATA>
<ITEM>
<X>123</X>
<Y>987</Y>
</ITEM>
<ITEM>
<X>123</X>
<Y>654</Y>
</ITEM>
</DATA>
ITEMをX,Yの内容でソートし、(123 654, 123 987)
ソート後の順序で1つ後ろにあるITEMのX,Yそれぞれの内容を比較し
重複する部分は表示しない、(654, 123 987)
という処理をしたいので、X,Yそれぞれで
ancestor::DATA/ITEM[paramで渡した親ITEMのposition()+1]/X = node()
で比較させたところ、
ソート後のITEMのposition()と、XPath上のITEMのposition()の値が
違うようでうまくいきません。

うまく処理する方法があれば、または「XSLでは無理」であればご教示ください。


[ メッセージ編集済み 編集者: きくらげ 編集日時 2005-01-06 17:51 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-01-06 18:02
XPath式で使っている 値をデバッグ出力して確認
-区切り文字-<xsl:copy-of select="ancestor::DATA/ITEM"/>=区切り文字=
などなど

[ メッセージ編集済み 編集者: MMX 編集日時 2005-01-06 18:42 ]
きくらげ
会議室デビュー日: 2005/01/06
投稿数: 7
投稿日時: 2005-01-06 20:50
ご回答ありがとうございます。
比較先の内容を表示してチェックしてみたのですが、以下のようになりました。
XML----
123 987
123 654
321 741
123 456
-------

(1) 123 [123] 456 [654]
(2) 123 [321] 654 [741]
(3) 123 [123] 987 [456]
(4) 321 [] 741 []

ITEMでposition()を表示した場合は、ソート順の位置を持っているようですが、
X,Yからancestor::DATA/ITEMで指定するposition()は元の文書上の位置のようです。

今回作成したxml,xslを置いておきます。
興味をお持ちになられた方は一度ご検証いただければと思います。
http://page.freett.com/NNCC/test.xml
http://page.freett.com/NNCC/test.xsl
BLACK
会議室デビュー日: 2005/01/13
投稿数: 2
投稿日時: 2005-01-13 09:21
ソート後の順序で1つ後ろにあるITEMとの比較、という事は出来ません。
が、以下の様なテンプレートで希望する処理が出来るかと思います。

<xsl:template match="DATA">
<xsl:for-each select="ITEM[preceding-sibling::ITEM/X != X]">
<xsl:sort select="X" data-type="number"/>

<xsl:for-each select="../ITEM[X = current()/X]">
<xsl:sort select="Y" data-type="number"/>

<p>
<xsl:if test="position() = last()">
<xsl:value-of select="concat(X,' ')"/>
</xsl:if>
<xsl:value-of select="Y"/>
</p>

</xsl:for-each>

</xsl:for-each>
</xsl:template>

いかがでしょうか?
きくらげ
会議室デビュー日: 2005/01/06
投稿数: 7
投稿日時: 2005-01-31 23:37
BLACK様
ご回答ありがとうございます<(_ _)>

>ソート後の順序で1つ後ろにあるITEMとの比較、という事は出来ません。
ということがはっきりした上、サンプルまで頂けて、感謝の言葉もございません。

皆様、本当にありがとうございました。
1

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