※ ChatGPTを利用し、要約された質問です(原文:<xsl:key>とtopreceding-siblingを使ったグループ化)
<xsl:key>とtopreceding-siblingを使ったグループ化
このQ&Aのポイント
<xsl:key>とtopreceding-siblingを使ったグループ化について解説します。
指定したXMLデータをCOUNTRYごとにグループ化し、CSV形式で出力するためのXSLTスタイルシートを作成します。
しかし、現在のXSLTスタイルシートではうまく動作しないため、他の方法を試す必要があります。
<xsl:key>とtopreceding-siblingを使ったグループ化
下記の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
お礼
前回教えて頂いた方法で要素ごとにグループ化することが出来ました。 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>の解説までして頂いて 僕にとってはアドバイスではなくとてもいい回答になっていました。 本当にありがとうございます。