現在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')]">
</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を作成された方はいませんでしょうか。
No.1ベストアンサー
- 回答日時:
リプライがないようなので。
><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/>は変更して下さい。
end()を使用すればよかったのですね!
なるほど。
fatbak様、わざわざサンプルまで用意していただきありがとうございます。
返事が遅れた事をお詫び致します。
No.2
- 回答日時:
たびたびすみません、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>
---
次回からソースの公開は控えさせて頂きますので、御了承下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
xmlのテキストにリンクを張りた...
-
スタイルシートを使用したXM...
-
■XSLT■固定文字を使ったループ...
-
タグの有無の判定
-
XSLで、XMLの空タグを制御したい。
-
xslの書籍を探しています
-
XSLTの記述方法
-
XMLのHTMLへの変換 (初心者)
-
特殊記号が勝手にエスケープさ...
-
CPUの考え方を教えてください ...
-
eclipseへのxmlファイル追加
-
東芝のDynabookなのですがアン...
-
xmlファイルが上手にHTMLに変換...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
2分探索木の高さを求めるプロ...
-
XML、XSLTの適応エラー(IEから...
-
MSXMLを使ってノードを削除した...
-
同じタグ名の項目取得
-
UTF-8でエンコーディングとはど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLのHTMLへの変換 (初心者)
-
XSLで、XMLの空タグを制御したい。
-
タグの有無の判定
-
htmlに変換されない
-
スタイルシートを使用したXM...
-
xslでの最小値、最大値の取得
-
ノードの並び替え
-
VBAからxml・スタイルシートを...
-
XSL内でJavaScriptを記述し、Ja...
-
xmlのテキストにリンクを張りた...
-
重複するものを消したい
-
<xsl:key>とtopreceding-siblin...
-
XSL中の改行、タブを無効にした...
-
スタイルシートについて
-
XMLをXSLを使いHTMLに変換した...
-
XSLTで直下のテキストのみ取得...
-
XSLTにてタグ名を取得する方法
-
xsl:variable の使用方法
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
おすすめ情報