プロが教えるわが家の防犯対策術!

現在IEにくっついているmsxmlでxmlファイルをcsvに変換させるxslを作成しています。
msxmlでもmsxml3でも動くようなxslファイルを作成したいので
ワーキングドラフト仕様のxslの記述を使用しようと思い下記のようなXMLとxslを作成しました

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="CSV.XSL"?>
<root>
<data>
<record>
<aaaa>1234</aaaa>
<bbbb>5678</bbbb>
<cccc>9abc</cccc>
<dummy name="ENDRECORD"></dummy>
</record>
<record>
<aaaa>1122</aaaa>
<bbbb>3344</bbbb>
<cccc>5566</cccc>
<dummy name="ENDRECORD"></dummy>
</record>
</data>
</root>

xslのposition()が使えないので
xmlに
<dummy name="ENDRECORD"></dummy>
を追加して
xslで一件分のデータの終わりを認識させています

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

<xsl:template match="/">
<xsl:apply-templates select="root/data/record"/>
</xsl:template>

<xsl:template match="root/data/record">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="./@name[(.='ENDRECORD')]">&#xA;</xsl:when>
<xsl:otherwise><xsl:value-of select="."/>,</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

しかし、csvのカンマ編集が以下のようになってしまいます。

1234,5678,9abc, ←最後にカンマが残ってしまう
1122,3344,5566,

どなたかワーキングドラフト仕様でも勧告後の仕様でも動くような、csvに変換するxslを作成された方はいませんでしょうか。

A 回答 (2件)

リプライがないようなので。



><dummy name="ENDRECORD"></dummy>を追加して xslで一件分のデータの終わりを認識させています
の意味がよくわかりませんでしたので、データから削除してしまいました。不都合ならば加えて下さい。
必要ないと(私は)思うのですが。

position()がわかるということは、ワーキングドラフト(MSXML)仕様だけでいいですよね。
>どなたかワーキングドラフト仕様でも勧告後の仕様でも動くような
私には無理です(笑)。最近は勧告仕様オンリーですね。

■XMLファイル #変更あり
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="CSV.XSL"?>
<root>
<data>
<record>
<aaaa>1234</aaaa>
<bbbb>5678</bbbb>
<cccc>9abc</cccc>
</record>
<record>
<aaaa>1122</aaaa>
<bbbb>3344</bbbb>
<cccc>5566</cccc>
</record>
</data>
</root>

■XSL #ワーキングドラフト仕様
-csv.xsl-
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" version="1.0">

<xsl:template match="/">
<xsl:apply-templates select="root/data/record" />
</xsl:template>

<xsl:template match="root/data/record">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="record/*">
<xsl:value-of select="."/>,</xsl:template>

<xsl:template match="record/*[end()]">
<xsl:value-of select="."/><br/>
</xsl:template>

</xsl:stylesheet>
---------------------
<br/>は変更して下さい。

この回答への補足


補足日時:2001/07/13 14:19
    • good
    • 0
この回答へのお礼

end()を使用すればよかったのですね!
なるほど。

fatbak様、わざわざサンプルまで用意していただきありがとうございます。
返事が遅れた事をお詫び致します。

お礼日時:2001/07/17 17:01

たびたびすみません、fatbackです。


わかりにくい書き方をしてしまいましたので反省/補足(蛇足)します。
私の記述したXSLだと<dummy> をrecordの子要素の最後だと認識しますので、XMLファイルから<dummy>を削除しないと最後にカンマが残ってしまうはずです。あえて書かなかったのですが、わかりにくい表現だったと反省しています。<dummy>を削除すれば<ccc>を最後の要素として認識しますのでカンマが消えます。ようするに<dummy>の存在意義が理解できなかったのです。
以下のXSLで<dummy>要素を削除/追加してみれば、どこに各テンプレートが適用されているかがわかるはずです。<xsl:for-each> を使わない理由も(笑)。

■XSL #ワーキングドラフト仕様(HTML)
-csv.xsl-
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html lang="ja">
<head>
<title>XML-CSV-HTMLサンプル</title>
<style>
.yes { color: blue; }
.no { color: red; }
</style>
</head>
<body>
<xsl:apply-templates select="root/data/record" />
</body>
</html>
</xsl:template>

<xsl:template match="root/data/record">
<div>
<strong>■レコード</strong><xsl:apply-templates /></div>
<hr/>
</xsl:template>

<xsl:template match="record/*">
<div>「<xsl:value-of select="."/>」はカンマ<strong class="yes">有り</strong></div>
</xsl:template>

<xsl:template match="record/*[end()]">
<div>「<xsl:value-of select="."/>」はカンマ<strong class="no">無し</strong></div>
</xsl:template>

</xsl:stylesheet>
---
次回からソースの公開は控えさせて頂きますので、御了承下さい。
    • good
    • 0
この回答へのお礼

サンプルソースで納得しました。
補足までしていただきありがとうございます!

お礼日時:2001/07/17 17:04

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