アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のxmlを

<xml xmlns:s="uuid:#dummy#" xmlns:dt="#dummy#" xmlns:rs="#dummy#" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="COUNTRY" rs:number="1" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="4" rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType name="NAME" rs:number="2" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="9" rs:fixedlength="true" rs:maybenull="false"/>
</s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row COUNTRY="JAPAN" NAME="TARO" AGE="12"/>
<z:row COUNTRY="JAPAN" NAME="JIRO" AGE="23"/>
<z:row COUNTRY="CHINA" NAME="SABURO" AGE="34"/>
</rs:data>
</xml>

下記のxslを使用してCOUNTRY毎にグルーピングして
csv形式で出力したいですが以下のxslだとうまくいきません。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:key name="COUNTRY" match="//z:row" use="@COUNTRY" />

<xsl:template match="/">

<xsl:for-each select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]">
<xsl:value-of select="@COUNTRY" />,<xsl:value-of select="@NAME" />,<xsl:value-of select="@AGE" />
</xsl:for-each>

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

[欲しい結果]
JAPAN,TARO
JAPAN,JIRO
スペース
CHINA,SABURO

A 回答 (2件)

#1>"c:\windows\system32\msxml3.dll"にしなければいけないのではないか


あんまり詳しくはないのですが、私は、IE6で動作確認しています。
IE6は、msxml3.dllは使ってなかった(別途ダウンロードしてインストールしなければいけなかったような気がします)と思います。
質問文のXSLで欲しい結果にならない理由がDLLだという意味なら、
それは、違うと思います。
select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]">
でセレクトされるのは、それまでとCOUNTRYがことなるもの
つまり
JAPAN,TARO
CHINA,SABURO
の2つのデータをセレクトすることを意味していると思われるからです。
#1>XMLのデバッグにはどのような方法があるのでしょうか?
この時のこの値という意味なら、開発環境でインスペクトすればいいと思いますが、
構文エラーが表示されるので、まずは、IEで動作させてみるのがいいと思います。
例えば、質問文のXSLであれば、
xmlns:xsl="http://www.w3.org/TR/WD-xsl"に「xsl:keyがない」
ネームスペース「z:」が定義されていないとか表示されます。
あとついでに言えば、<xsl:key>宣言は、xsl:templateの中で使われていないので必要ないと思います。
    • good
    • 0
この回答へのお礼

前回教えて頂いた方法で要素ごとにグループ化することが出来ました。

xmlns:xsl="http://www.w3.org/TR/WD-xsl"にxsl:keyがないことが原因でした。
バージョンが違うのですね、これで動作が変わるとは思いもいませんでした、ただのコメントくらいに思っていましたので。

http://support.microsoft.com/kb/278674/JA/
上記のサイトでダウンロードしたscriptによると
どうやら私の環境ではmsxml3.dllが標準で使われているようでしたので、"c:\windows\system32\msxml3.dll"
に変更しました。

デバッグの仕方、<xsl:key>の解説までして頂いて
僕にとってはアドバイスではなくとてもいい回答になっていました。
本当にありがとうございます。

お礼日時:2005/09/06 17:58

ちょっと違うかもしれませんが・・


---------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:rs="#dummy#" xmlns:z="#RowsetSchema">

<xsl:template match="/">

<xsl:for-each select="//z:row">
<xsl:if test="not(@COUNTRY=preceding-sibling::z:row/@COUNTRY)">
スペース
</xsl:if>
<xsl:value-of select="@COUNTRY" />,<xsl:value-of select="@NAME" />,<xsl:value-of select="@AGE" />
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>
    • good
    • 0
この回答へのお礼

BLUEPIXY様 ありがとうございます。
こういう指定の仕方もあるんですね 勉強になります。

実はVC++の
MSXMLのXSLTを使用しているのですが、#importしているDLLが"c:\windows\system32\msxml.dll"としており"c:\windows\system32\msxml3.dll"にしなければいけないのではないかと疑っております。

XMLのデバッグにはどのような方法があるのでしょうか?

お礼日時:2005/09/06 08:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!