none
XslTransformからXslCompiledTransformに移行 RRS feed

  • 質問

  • 販売管理システムを.Net Framework 1.1 ⇒ 4.0 に移行しました。

    システムの中に、ファームバンキングデータとしてDataSetのデータをXslTransformにてテキスト(EBCDIC)に出力しているところがありました。

    このXslTransformをXslCompiledTransformに書き換えました。

    出力されたテキストファイルの各行の最後にもともとある改行(0D0A)がLine Feed(0A)しかなく、Carriage Return(0D)が消えてしまいました。

    結果、銀行へのデータ転送ができなくなってしまいます。

    Carriage Return(0D)が消えないようにする方法がご存じであれば、ご教授いただきたいと思っております。

    ※当然、出力されたテキストファイルの行に別途0Dを付け加える方法や、銀行へのデータ転送ソフトを買い替える方法もあるのですが、

    XslCompiledTransformの機能があれば、それを使いたいと思っております。

    どうぞよろしくお願いいたします。

     

    2012年5月11日 5:34

回答

  • XslTransform の不具合でしょうね。XSLT では入力ソースの改行コードが何であっても LF のみで処理することが仕様に定められているので、使用されている変換ソースに改行コードの変換が定義されていないのであれば、XslCompiledTransform の動作が正しいことになります。

    使用している変換ソースの定義に、改行前に &#13 を追加するという方法ではだめでしょうか?

    • 回答の候補に設定 山本春海 2012年5月30日 6:33
    • 回答としてマーク 山本春海 2012年6月1日 7:12
    2012年5月11日 6:05
  • XslTransformをどう使っていてXslCompiledTransformにどう書き換えたのでしょうか?

    0x0D 0x0Aが0x0Aだけになってしまったという点だけ読むと、XmlWriterSettings.NewLineCharsプロパティでも設定すればいいのかなとは思いました。

    # それよりも改行記号に依存する時点でそのシステムはXML形式ではなく、XMLに似た何かでしかないですね…。

    • 回答の候補に設定 山本春海 2012年5月30日 6:33
    • 回答としてマーク 山本春海 2012年6月1日 7:12
    2012年5月11日 6:46

すべての返信

  • XslTransform の不具合でしょうね。XSLT では入力ソースの改行コードが何であっても LF のみで処理することが仕様に定められているので、使用されている変換ソースに改行コードの変換が定義されていないのであれば、XslCompiledTransform の動作が正しいことになります。

    使用している変換ソースの定義に、改行前に &#13 を追加するという方法ではだめでしょうか?

    • 回答の候補に設定 山本春海 2012年5月30日 6:33
    • 回答としてマーク 山本春海 2012年6月1日 7:12
    2012年5月11日 6:05
  • XslTransformをどう使っていてXslCompiledTransformにどう書き換えたのでしょうか?

    0x0D 0x0Aが0x0Aだけになってしまったという点だけ読むと、XmlWriterSettings.NewLineCharsプロパティでも設定すればいいのかなとは思いました。

    # それよりも改行記号に依存する時点でそのシステムはXML形式ではなく、XMLに似た何かでしかないですね…。

    • 回答の候補に設定 山本春海 2012年5月30日 6:33
    • 回答としてマーク 山本春海 2012年6月1日 7:12
    2012年5月11日 6:46
  • K. Takaokaさん、

    K. Takaoka のアバター

    K. Takaoka

    MCC

    6,120 ポイント930
    最近のアチーブメント
    参考になった投稿の初投票回答候補提供者 Iフォーラム回答者 III

    佐祐理さん

    ご回答、ありがとうございました。

    ご提供の情報が不足しており、申し訳ございません。

    今回のソースの書き換えたのは下記のとおり、"//"が付いて行をコメントして、上の行を追加しただけです。

    XslCompiledTransform xslTran = new XslCompiledTransform();
    //XslTransform xslTran = new XslTransform();
    xslTran.Load("c:\temp\a.xslt");

    DataSetNavigator navi = new DataSetNavigator(dataSet);

    XmlTextWriter writer = new XmlTextWriter("c:\temp\out.txt", System.Text.Encoding.GetEncoding("Shift_Jis"));
    xslTran.Transform(navi, null, writer, null);
     
    writer.Close();
    xslTran = null;
    navi = null;

    なお、使用しているxsltファイルは以下のとおりです。

    <?xml version="1.0" encoding="SHIFT-JIS"  standalone="yes"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

    <!-- ヘッダレコード -->
    <xsl:for-each select="DS_FIRM_BANK/DT_HEADER">
    <!-- データ区分 -->
    <xsl:text>1</xsl:text>
    <!-- 種別コード -->
    <xsl:text>21</xsl:text>
    <!-- コード区分 -->
    <xsl:text>0</xsl:text>
    <xsl:value-of select="concat(substring('0000000000',1,10 - string-length(IRAI_NO)), IRAI_NO)"/>
    <xsl:value-of select="concat(IRAI_KOZA_KANA, substring('                                        ',1,40 - string-length(IRAI_KOZA_KANA)))"/>
    <xsl:value-of select="concat(substring('0000',1,4 - string-length(HEAD_TRANSFER_DATE)), HEAD_TRANSFER_DATE)"/>
    <xsl:value-of select="concat(substring('0000',1,4 - string-length(IRAI_GINKO)), IRAI_GINKO)"/>
    <xsl:value-of select="concat(IRAI_GINKO_KANA, substring('               ',1,15 - string-length(IRAI_GINKO_KANA)))"/>
    <xsl:value-of select="concat(substring('000',1,3 - string-length(IRAI_SITEN)), IRAI_SITEN)"/>
    <xsl:value-of select="concat(IRAI_SITEN_KANA, substring('               ',1,15 - string-length(IRAI_SITEN_KANA)))"/>
    <xsl:value-of select="concat(YOKIN_SYU, substring(' ',1,1 - string-length(YOKIN_SYU)))"/>
    <xsl:value-of select="concat(substring('0000000',1,7 - string-length(IRAI_KOZA)), IRAI_KOZA)"/>
    <!-- ダミー(17文字) -->
    <xsl:text>                 </xsl:text>
    <!-- 改行 -->
    <xsl:text>
    </xsl:text>
    </xsl:for-each>

    <!-- ファームバンキングデータ(その他) -->
    <xsl:for-each select="DS_FIRM_BANK/DT_FRIM_BANK">
    <!-- データ区分 -->
    <xsl:text>2</xsl:text>
    <xsl:value-of select="concat(substring('0000',1,4 - string-length(FURI_GINKO)), FURI_GINKO)"/>
    <xsl:value-of select="concat(FURI_GINKO_KANA, substring('               ',1,15 - string-length(FURI_GINKO_KANA)))"/>
    <xsl:value-of select="concat(substring('000',1,3 - string-length(FURI_SITEN)), FURI_SITEN)"/>
    <xsl:value-of select="concat(FURI_SITEN_KANA, substring('               ',1,15 - string-length(FURI_SITEN_KANA)))"/>
    <!-- 手形交換所番号 -->
    <xsl:text>0000</xsl:text>
    <xsl:value-of select="concat(FURI_YOKIN, substring(' ',1,1 - string-length(FURI_YOKIN)))"/>
    <xsl:value-of select="concat(substring('0000000',1,7 - string-length(FURI_KOZA)), FURI_KOZA)"/>
    <xsl:value-of select="substring(concat(FURI_KOZA_KANA, substring('                              ',1,30 - string-length(FURI_KOZA_KANA))),1,30)"/>
    <xsl:value-of select="concat(substring('0000000000',1,10 - string-length(FURI_KIN)), FURI_KIN)"/>
    <xsl:value-of select="concat(SYO_FURI_KBN, substring(' ',1,1 - string-length(SYO_FURI_KBN)))"/>
    <xsl:value-of select="concat(substring('0000000000',1,10 - string-length(SIHARAI)), SIHARAI)"/>
    <!-- 顧客コード2 -->
    <xsl:text>0000000000</xsl:text>
    <xsl:value-of select="concat(FURI_KBN, substring(' ',1,1 - string-length(FURI_KBN)))"/>
    <!-- ダミー(8文字) -->
    <xsl:text>        </xsl:text>
    <!-- 改行 -->
    <xsl:text>
    </xsl:text>
    </xsl:for-each>

    <!-- トレーラレコード -->
    <xsl:for-each select="DS_FIRM_BANK/DT_TRAILER">
    <!-- データ区分 -->
    <xsl:text>8</xsl:text>
    <xsl:value-of select="concat(substring('000000',1,6 - string-length(BANK_RECORD_COUNT)), BANK_RECORD_COUNT)"/>
    <xsl:value-of select="concat(substring('000000000000',1,12 - string-length(BANK_FURI_KIN_SUM)), BANK_FURI_KIN_SUM)"/>
    <!-- ダミー(101文字) -->
    <xsl:text>                                                                                                     </xsl:text>
    <!-- 改行 -->
    <xsl:text>
    </xsl:text>
    </xsl:for-each>

    <!-- エンドレコード -->
    <!-- データ区分 -->
    <xsl:text>9</xsl:text>
    <!-- ダミー(119文字) -->
    <xsl:text>                                                                                                                      
    </xsl:text>
    </xsl:template>
    </xsl:stylesheet>

    どうぞよろしくお願いいたします。

    2012年5月11日 8:17
  • こんにちは、林山 さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    参考になるアドバイスをいただいているように思われましたので、勝手ながら私の方で回答としてマークさせていただきました。
    情報くださったみなさん、ありがとうございます。

    キーワードで検索してみただけですが、以下のような情報もありました。
    #参考になってなかったらごめんなさい。。。

    Issue with XSLCompiledTransform with Carriage Return (\n) character
    http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/35730d3f-fa91-4d0e-881b-7ab3f7f541cc

    How
    to get Line Feed without Carriage return in XSL Transform Output?
    http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/052ca494-7ca5-4a9f-96c8-759bc5f0538e

    今後とも、MSDN フォーラムをよろしくお願いいたします。
    __________________________________                                                              
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年6月1日 7:12