- PR -

XSLで"(ダブルクォート)を""(ダブルクォート2つ)に変換したい

1
投稿者投稿内容
ちば
大ベテラン
会議室デビュー日: 2003/02/14
投稿数: 114
お住まい・勤務地: 都内勤務
投稿日時: 2004-05-31 17:44
こちらに投稿するのは初めてになります。宜しくお願いします。

現在XMLファイルからCSVへ出力する物を開発しています。

件名のとおり、XML文書内にダブルクォートがあったらそれを2つにするXSLを作成して
いますが行き詰まりました。

試したこと

@translateを使う
過去ログで拝見しましたが、1つの文字を2つの文字への変換(置換)はできないようです。

Aconcat、substring-after、substring-beforeを使う
こんな感じで書いてみました

・XML文書
<?xml version="1.0" encoding="UTF-8"?>
<log>
<message>aaa bbb ccc "ddd"</message>
</log>

・XSL
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select="concat(substring-before(/log/message, '&quot;'), '&quot;&quot;', substring-after(/log/message, '&quot;'), '&quot;')"/>

これだと一応うまくいったように見えるのですが、XMLの文書が
<message>aaa "bbb" "ccc" ddd</message>
のようにダブルクォートで囲まれた文字列が複数になるとこちらの期待する結果が
得られません。

どなたか解決がお分かりの方はご教授願いますm(__)m
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-05-31 19:14
call-templateを再帰関数のように使うとできます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3077&forum=9

処理の対応関係は

string-length($value) < $width → 'contains(....,")'

&#10; → ""

辺りで,substringの組み立ては非再帰と同様。
--------------
XSLT が適する処理分野ではないです、スピードを考えても(全然、速そうじゃない)
XML2CSV 物は多数ありますし。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-05-31 19:21 ]
1

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