- PR -

xsl:ifでの判断の仕方

投稿者投稿内容
さめちゃん
会議室デビュー日: 2004/05/11
投稿数: 7
投稿日時: 2004-05-11 21:04
お世話になります。
以下のとき、DATA1とDATA2の値を比較し
一致するときにOKと表示するにはどのように書けばいいのでしょうか?
DATA1の値の比較(<xsl:if test = "DATA/DATA1[. = 123456]">など)ならいろいろ載っているのですが、このような場合の比較の仕方がわかりませんでした。
以下サンプルです。
XML文書
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<DATA>
<DATA1>123456</DATA1>
<DATA2>123456</DATA2>
</DATA>

スタイルシートtest.xsl
<?xml version='1.0' encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<xsl:if test = "??????">
OK
</xsl:if>
</xsl:template>
</xsl:stylesheet>

環境はMSXML2.0で行いたいです。
以上 宜しくお願い致します。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-05-11 23:40
仕様を味わいましょう。

比較するオブジェクトが両方ともノード集合の場合は、
1番目のノード集合内のノードと
2番目のノード集合内のノードの
文字列値を比較して、
結果が真になるようなノードが両方のノード集合内にある場合のみ、
比較結果は真になる。

DATA/DATA1
DATA/DATA2
sugimoto
常連さん
会議室デビュー日: 2002/12/05
投稿数: 45
投稿日時: 2004-05-12 14:16
杉本と申します。

深く考えずに、
<xsl:if test="DATA/DATA1=DATA/DATA2">
では駄目でしたっけ?
さめちゃん
会議室デビュー日: 2004/05/11
投稿数: 7
投稿日時: 2004-05-12 14:54
MMXさん、sugiさん回答ありがとうございます。
<xsl:if test="DATA/DATA1=DATA/DATA2">
で実行すると以下のようなエラーとなってしまうもので。
=の指定をどう書けばいいのかわからないです。

XML ページを表示できません
XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。
必要なトークン 'eof' が '=' を検出しました。 DATA/DATA1-->=<--DATA/DATA2


sugimoto
常連さん
会議室デビュー日: 2002/12/05
投稿数: 45
投稿日時: 2004-05-12 15:17
杉本です。

駄目でしたか・・・
こちらのXSLTプロセッサ動作環境の xalan-2.4.1 では
うまくいったのですが。

今、IE6(WindowsXP)で試してみましたが、うまくいきました。
可能ならば、msxml4 あたりにすると、うまくいきそうです。

でも、何で msxml2 は駄目なんでしょう??
僕も正しい書き方に自身がありませんので、
正しい書き方があるのかも!?
前川
常連さん
会議室デビュー日: 2004/04/27
投稿数: 38
お住まい・勤務地: 1DK
投稿日時: 2004-05-12 16:02
MSXML 2.x 系にXSLのまともな動作を期待しない方がいいですよ。
名前空間(http://www.w3.org/TR/WD-xsl)が示すように、XSLのワーキングドラフト(+MS独自拡張)に準拠するように作られているのですが、これは現在勧告となっているXSLTとはかなりの相違が有ります。
http://www.vbxml.com/xsl/XSLTRef.asp を見ると、2.xではかなりの機能が未実装である事もわかります。

MSXML3.0以降(IE6.0以降)ならそれほど問題は無いと思いますが…

で、、本題のMSXML2.0での方法ですが、わかりません(^^; 申し訳ない。
ですが、上記のような事も有るので、できればMSXML又はIEのバージョンアップをしてもらいたい所ですね。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-05-12 16:29
<xsl:if test = "DATA/DATA1[. = 123456]">
が可能なら
= の前後に空白とか
<xsl:if test = "DATA/DATA1[. = DATA/DATA2]">
の形が考えられます。
(プログラムというより運だめし)
こんなので、根性を鍛えるより、.NET を勉強したほうが
身になるかも。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-05-12 16:32 ]
さめちゃん
会議室デビュー日: 2004/05/11
投稿数: 7
投稿日時: 2004-05-12 17:14
みなさんありがとうございます。

>今、IE6(WindowsXP)で試してみましたが、うまくいきました。
>可能ならば、msxml4 あたりにすると、うまくいきそうです。
>MSXML3.0以降(IE6.0以降)ならそれほど問題は無いと思いますが…
IE6以降なら大丈夫ですか〜。やはりMSXML2.0が悪いのかな。

<xsl:if test = "DATA/DATA1[. = DATA/DATA2]">
で試してみましたところエラーにはならないのですが、
「OK」が表示されませんでした。一致したと判断されなかったらしいです。
msxml2.0だとこういう判断はするなということなのでしょうか・・・
知識として知りたかったので、書き込みして下さった方ありがとうございます。

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