001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.xml;
017
018 import org.opengion.fukurou.util.Closer ;
019 import org.opengion.fukurou.util.HybsEntry ;
020 import org.opengion.fukurou.util.FileUtil ;
021 import org.opengion.fukurou.util.StringUtil ;
022 import org.opengion.fukurou.util.LogWriter;
023 import org.opengion.fukurou.util.HybsDateUtil ;
024
025 import java.io.Reader;
026 import java.io.Writer;
027 import java.io.File;
028 import java.io.IOException;
029 import java.io.StringReader;
030 // import java.text.DateFormat;
031 // import java.text.SimpleDateFormat;
032 // import java.util.Date;
033 // import java.util.Locale;
034
035 import javax.xml.transform.TransformerException;
036 import javax.xml.transform.TransformerConfigurationException;
037 import javax.xml.transform.TransformerFactory;
038 import javax.xml.transform.Transformer;
039 import javax.xml.transform.stream.StreamSource;
040 import javax.xml.transform.stream.StreamResult;
041
042 /**
043 * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
044 * 結果は、XML 出力ファイルにセーブしますã?
045 * å�?ƒ•ァイルの代わりに、Writer,Reader を設定することも可能ですã?
046 *
047 * こã?パã?サーでは、å?部で実行中の入力ファイルæƒ??ã‚?パラメータとして設定できますã?
048 * useFileInfo( true ) とセãƒ?ƒˆすると、以下ã??”é?目がå?部çš?�«セãƒ?ƒˆされますã?
049 * ただしã?こã?設定が可能なのは、XML 入力ファイルに、Reader ではなくã?ファイル名を
050 * 渡した場合ã?みですã?ストリーãƒ??場合ã?、各種æƒ??は取れませんã€?
051 *
052 * 入力ファイル(inXMLのフルパス) : FILEPATH (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
053 * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS (ä¾? DOC10)
054 * 入力ファイル(inXMLのファイルå�? : FILENAME (ä¾? query.jsp)
055 * 入力ファイル(inXMLの更新日ä»? ) : MODIFIED (ä¾? yyyyMMddHHmmss形å¼?
056 *
057 * xsl ファイルでは、パラメータ は、xsl:param で宣è¨?�—、xsl:value-of で取り出しますã?
058 * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
059 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できますã?
060 *
061 * String inXSTL = "inXSLfile.xsl" ; // 入力X?³?¬ファイル
062 * String outFile = "outXMLfile.xml" ; // 出力X??¬ファイル
063 * String inXML = "inXMLfile.xml" ; // 入力X??¬ファイル
064 *
065 * XSLT xslt = new XSLT();
066 * xslt.setXslFile( inXSTL );
067 * xslt.setOutFile( outFile,false );
068 *
069 * xslt.transform( inXML );
070 *
071 * @version 4.0
072 * @author Kazuhiko Hasegawa
073 * @since JDK5.0,
074 */
075 public class XSLT {
076 private static final String CR = System.getProperty("line.separator") ;
077 /** 初期 ENCODE å�?{@value} */
078 public static final String ENCODE = "UTF-8" ;
079
080 private Transformer transformer = null;
081
082 private String encode = ENCODE;
083 private String xmlFile = null;
084 private String xslFile = null;
085 private String outFile = null;
086 private Reader xslReader = null;
087 private Writer outWriter = null;
088 private HybsEntry[] paramEntry = null;
089 private boolean isFileInfo = false;
090 private boolean isErrClose = true;
091 private boolean isErrXmlIn = false; // useErrXmlIn â‡?isErrXmlIn 変更
092 private boolean isInclude = true; // 4.2.3.0 (2008/05/26)
093 private StreamResult result = null;
094
095 // private DateFormat formatter = null; // HybsDateUtil を利用
096
097 // private String jspIncludeData = null; // 5.6.7.1 (2013/08/09) ローカル変数åŒ?
098 private String debugMsg = null; // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用
099
100 /**
101 * 入力XSLファイルをã?æŒ?®šしますã?
102 *
103 * @param file 入力XSLファイル
104 * @see #setXslFile( Reader )
105 */
106 public void setXslFile( final String file ) {
107 xslFile = file;
108 setXslFile( FileUtil.getBufferedReader( new File( xslFile ),encode ) );
109 }
110
111 /**
112 * 入力XSLリーãƒ??をã?æŒ?®šしますã?
113 *
114 * @param reader 入力XSLリーãƒ??
115 * @see #setXslFile( String )
116 */
117 public void setXslFile( final Reader reader ) {
118 transformer = null;
119 xslReader = reader;
120 }
121
122 /**
123 * 結果XML ファイル名と、そのオープン方法をæŒ?®šしますã?
124 * 結果XML ファイルをã?追記すã‚?append=true)か新規作æ?する(append=false)か指定しますã?
125 * なおã?結果XML ファイル(outFile) を指定しなã�?=null)かã?特別な名称 "System.out"
126 * æ–?—å?を渡すと、標準å?力に 結果をå?力しますã?
127 *
128 * @param file 出力ファイルå�?null またã?ã€?System.out" æ–?—å?時ã?、標準å?åŠ?
129 * @param append [true]追記すã‚?false:新規作æ?する]
130 */
131 public void setOutFile( final String file,final boolean append ) {
132 outFile = file ;
133 setOutFile( FileUtil.getPrintWriter( new File( outFile ),encode,append ) );
134 }
135
136 /**
137 * 結果XML ãƒ??タをå?力するã?Writer を指定しますã?
138 * ファイル、標準å?力ã?JSPWriter など、å¿?¦�に応じて Writer を作æ?してくださいã€?
139 * 標準å?åŠ?System.out)の場合ã?、NonClosePrintWriter クラスなどの非close()処ç�?³»をã?
140 * JSPWriterの場合ã?、NonFlushPrintWriter クラスなどの非flush()、close()処ç�?³»をã?
141 * 使用してくださいã€?
142 *
143 * @param writer 出力するWriter
144 */
145 public void setOutFile( final Writer writer ) {
146 Closer.ioClose( outWriter );
147 outWriter = writer ;
148 result = new StreamResult( outWriter );
149 }
150
151 /**
152 * 結果XML ライターに、指定ã?ãƒ??タを書きå?しますã?
153 *
154 * @param outData 書きå?すデータ
155 */
156 public void setOutData( final String outData ) {
157 if( outData != null && outData.length() > 0 ) {
158 try {
159 outWriter.write( outData );
160 outWriter.write( CR );
161 }
162 catch( IOException ex ) {
163 String errMsg = "ライターにãƒ??タ登録を失敗しましたã€? + CR
164 + ex.getMessage() ;
165 close();
166 throw new RuntimeException( errMsg,ex );
167 }
168 }
169 }
170
171 /**
172 * XML ファイルをXSLT変換しますã?
173 * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
174 * 結果は、XML ファイルにセーブしますã?
175 * 拡張子がã€?jsp』ã?場合ã?jsp:directive.include 処ç�?‚’行いますã?
176 *
177 * @og.rev 4.0.0.2 (2007/12/10) 拡張子がã€?jsp』ã?場合ã?jsp:directive.include 処ç�?‚’行いますã?
178 *
179 * @param file 入力XMLファイル
180 * @see #transform( Reader )
181 */
182 public void transform( final String file ) {
183 transform( file, isInclude );
184 }
185
186 /**
187 * XML ファイルをXSLT変換しますã?
188 * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
189 * 結果は、XML ファイルにセーブしますã?
190 * 引数の isJspInclude によって、jsp:directive.include 処ç�?‚’行うかどã�?�‹判断しますã?
191 *
192 * @og.rev 4.2.3.0 (2008/05/26) jsp:directive.include 処ç�??実施可否を引数æŒ?®šしますã?
193 * @og.rev 5.2.1.0 (2010/10/01) JspIncludeReader#getString の第?“引数をå»?¢
194 * @og.rev 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを取得しておきますã?
195 *
196 * @param file 入力XMLファイル
197 * @param isJspInclude jsp:directive.include 処ç�?‚’行うかどã�?�‹ã€?
198 * @see #transform( Reader )
199 */
200 public void transform( final String file, final boolean isJspInclude ) {
201 xmlFile = file;
202
203 if( xmlFile.endsWith( ".jsp" ) && isJspInclude ) {
204 // if( xmlFile.endsWith( ".jsp" ) ) {
205 // transform( new JspIncludeReader().getReader( new File( xmlFile ),encode ) );
206 // jspIncludeData = new JspIncludeReader().getString( new File( xmlFile ),encode,false );
207 // jspIncludeData = new JspIncludeReader().getString( new File( xmlFile ),encode ); // 5.2.1.0 (2010/10/01)
208
209 // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを取得しておきますã?
210 JspIncludeReader jspIncReader = new JspIncludeReader();
211 debugMsg = jspIncReader.getIncludeFiles();
212
213 String jspIncludeData = jspIncReader.getString( new File( xmlFile ),encode ); // 5.2.1.0 (2010/10/01)
214 transform( new StringReader( jspIncludeData ) );
215 }
216 else {
217 transform( FileUtil.getBufferedReader( new File( xmlFile ),encode ) );
218 }
219 }
220
221 /**
222 * XML ファイルをXSLT変換しますã?
223 * XML 入力リーãƒ??に、XSL 入力リーãƒ??を適用してã€?XSLT変換を行いますã?
224 * 結果は、XML ライターに書きå?しますã?
225 * こã?処ç�??終äº?¾Œに、å?力XML リーãƒ?? は、close() されますã?
226 *
227 * @og.rev 5.6.5.2 (2013/06/21) エラーメãƒ?‚»ージが判りにくいので、追記しますã?
228 * @og.rev 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを出力しますã?
229 *
230 * @param xmlReader 入力XML リーãƒ??
231 * @see #transform( String )
232 */
233 public void transform( final Reader xmlReader ) {
234 HybsEntry[] entry = null;
235
236 try {
237 if( transformer == null ) {
238 init();
239 }
240 else {
241 transformer.reset();
242 }
243
244 // 入力XMLファイルのファイルæƒ??を設定しますã?
245 if( isFileInfo && xmlFile != null ) {
246 entry = getXmlParameter( xmlFile );
247 parameterSet( transformer,entry );
248 }
249 xmlFile = null ;
250
251 // 入力XMLリーãƒ??からStreamSourceを作る
252 StreamSource data = new StreamSource( xmlReader );
253
254 transformer.transform( data,result );
255 }
256 catch( TransformerException ex ) {
257 String errMsg = "XML-XSLT 変換に失敗しましたã€? + CR
258 + ex.getMessage() ;
259
260 // 5.6.5.2 (2013/06/21) エラーメãƒ?‚»ージが判りにくいので、追記しますã?
261 if( errMsg.indexOf( "プロローグにはコンãƒ?ƒ³ãƒ?‚’æŒ?®šできません" ) >= 0 ) {
262 errMsg = errMsg + CR + "(UTF-8変換時に、BOMが付くとこã?エラーがå?ますã?BOMを外してみてくださいã€?" ;
263 }
264
265 // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを出力しますã?
266 if( errMsg.indexOf( "で終äº?�™るå¿?¦�がありまã�? ) >= 0 && debugMsg != null && debugMsg.length() > 0 ) {
267 errMsg = errMsg + CR + "不整合ã?、includeファイルの可能性がありますã?" + debugMsg;
268 }
269
270 if( isErrXmlIn ) { setOutData( toXmlRow( entry, ex ) ); }
271
272 if( isErrClose ) { close(); }
273 throw new RuntimeException( errMsg,ex );
274 }
275 finally {
276 Closer.ioClose( xmlReader );
277 }
278 }
279
280 /**
281 * Transformer オブジェクトに対して、Parameter を設定しますã?
282 *
283 * æŒ?®šされたパラメーターキーは、xsl ファイルでは、xsl:param で宣è¨?�—ã€?
284 * xsl:value-of で取り出しますã?
285 * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
286 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できますã?
287 *
288 * @param entry HybsEntry配å?
289 */
290 public void setParamEntry( final HybsEntry[] entry ) {
291 if( entry != null && entry.length > 0 ) {
292 paramEntry = new HybsEntry[entry.length];
293 System.arraycopy( entry,0,paramEntry,0,entry.length );
294 }
295 }
296
297 /**
298 * transform 処ç�?¸にエラーが発生したå?合に、å?力ファイルを閉じるかどã�?�‹を指定しますã?
299 *
300 * 処ç�??中でエラーが発生したå?合に、そこで処ç�?‚’中断するかã?それともã?
301 * 無視して、さらに処ç�?‚’進めるかをæŒ?®šすることが可能ですã?
302 * 継続して処ç�?‚’進めたã�??合ã?、å?力ファイルを閉じなã�?�Ÿめã?false ã‚?
303 * 設定しますã?ただしã?エラー時には、RuntimeException は throw されますã?
304 * 初期値は、true(閉じã‚?ですã?
305 *
306 * @param flag エラー時クローズ [true:閉じã‚?false:閉じない]
307 */
308 public void errClose( final boolean flag ) {
309 isErrClose = flag ;
310 }
311
312 /**
313 * transform 処ç�?¸エラーをã?出力ファイルに、XML形式でエラーを追記するかどã�?�‹を指定しますã?
314 *
315 * 処ç�??中でエラーが発生したå?合に、ログã�?�‘ではなくã?結果XMLファイルにã€?
316 * エラーå†?®¹ã‚??エラーファイルなどを埋め込ã‚?�¨、XMLファイルとしてDB登録ã‚??
317 * そã?他集計等に使えますã?
318 * 今ã?、GE70 スキーマ形式ã?ファイルしか作æ?できませんã€?
319 * これはã€?errClose( boolean ) メソãƒ?ƒ‰と共に使用すると効果的ですã?
320 * つまりã?errClose = false; にして、エラー時でもå?力ファイルを閉じずにã€?
321 * 処ç�?‚’続ける事で、エラーメãƒ?‚»ージもXMLファイルとしてè“?©�できますã?
322 * 初期値は、false(使用しなã�?ですã?
323 *
324 * @param flag エラー時XML形å¼?[false:使用しなã�?true:使用する]
325 */
326 public void useErrXmlIn( final boolean flag ) {
327 isErrXmlIn = flag ;
328 }
329
330 /**
331 * jsp:directive.include 発見時に、そのファイルã‚?INCLUDE するかをæŒ?®šするかどã�?�‹を指定しまã�?初期値:true:使用する)
332 *
333 * 引数の処ç�?¯¾象ファイル(transformの引数ファイル)がã?ã€?jsp』ã?場合ã?
334 * jsp:directive.include 発見時に、そのファイルã‚?INCLUDE するかをæŒ?®šするか
335 * どã�?�‹を指定しますã?
336 * インクルードされたファイルとあわせて、正規ã?XML にならなã�?�¨、パーサー
337 * エラーが発生しますã?
338 * JSPソース解析を行うには、INCLUDE ファイルもè?慮しなã�?�¨正確な結果ã‚?
339 * 得られませんがã?INCLUDE 先ã?ファイルまで合わせるå¿?¦�があるためã€?
340 * 場合によっては、INCLUDEファイルを無視しなければならなã�?‚±ースがありますã?
341 * 初期値は、true(使用する)ですã?
342 *
343 * @param flag エラー時XML形å¼?[false:使用しなã�?true:使用する]
344 */
345 public void jspInclude( final boolean flag ) {
346 isInclude = flag ;
347 }
348
349 /**
350 * 入力XSLファイルのストリーãƒ?‚’閉じますã?
351 *
352 * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリアしますã?
353 */
354 public void close() {
355 Closer.ioClose( outWriter );
356
357 // 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリア
358 JspIncludeReader.cacheClear();
359 }
360
361 /**
362 * XML ファイルをXSLT変換しますã?
363 * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
364 * 結果は、XML ファイルにセーブしますã?
365 * なおã?結果XML ファイル(outFile) に、特別な名称 "System.out" æ–?—å?を渡すとã€?
366 * 標準å?力に 結果をå?力しますã?
367 *
368 * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリアしますã?
369 */
370 private void init() {
371 try {
372 // xsl属æ?からStreamSourceを作る
373 StreamSource style = new StreamSource( xslReader );
374
375 // Transformerを作り、XMLを変換する
376 TransformerFactory tFactory = TransformerFactory.newInstance();
377 transformer = tFactory.newTransformer( style );
378
379 parameterSet( transformer,paramEntry );
380
381 // 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリア
382 JspIncludeReader.cacheClear();
383 }
384 catch( TransformerConfigurationException ex ) {
385 String errMsg = xslFile + "ファイルの XSLT 解析に失敗しましたã€? + CR
386 + ex.getMessage() ;
387 throw new RuntimeException( errMsg,ex );
388 }
389 finally {
390 Closer.ioClose( xslReader );
391 xslReader = null;
392 }
393 }
394
395 /**
396 * 実行中の入力ファイル名などの属æ?æƒ??ã‚?パラメータとして設定するかどã�?�‹を指定しますã?
397 *
398 * こã?パã?サーでは、å?部で実行中の入力ファイルæƒ??ã‚?パラメータとして設定できますã?
399 * useFileInfo( true ) とセãƒ?ƒˆすると、以下ã??”é?目がå?部çš?�«セãƒ?ƒˆされますã?
400 *
401 * 入力ファイル(inXMLのフルパス) : FILEPATH (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
402 * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS (ä¾? DOC10)
403 * 入力ファイル(inXMLのファイルå�? : FILENAME (ä¾? query.jsp)
404 * 入力ファイル(inXMLの更新日ä»? ) : MODIFIED (ä¾? yyyyMMddHHmmss形å¼?
405 *
406 * @og.rev 4.0.0.0 (2007/09/25) ParameterMetaData を使用したパラメータ設定追åŠ??
407 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
408 *
409 * xsl ファイルでは、xsl:param で宣è¨?�—、xsl:value-of で取り出しますã?
410 * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
411 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できますã?
412 *
413 * 初期値は、false(セãƒ?ƒˆしなã�? ですã?
414 *
415 * @param flag セãƒ?ƒˆする:true/セãƒ?ƒˆしなã�?false
416 */
417 public void useFileInfo( final boolean flag ) {
418 isFileInfo = flag;
419 // if( isFileInfo ) {
420 // formatter = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN );
421 // }
422 }
423
424 /**
425 * ファイル名指定で XML,XSL,OUTファイルを指定するå?合ã?エンコードをæŒ?®šしますã?
426 *
427 * 初期値は、UTF-8 ですã?
428 *
429 * @param encode エンコーãƒ?
430 */
431 public void useEncode( final String encode ) {
432 this.encode = encode;
433 }
434
435 /**
436 * 実行中の入力ファイル名などの属æ?æƒ??ã‚?パラメータとして取得しますã?
437 *
438 * 入力ファイル(inXMLのフルパス) : FILEPATH (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
439 * 入力ファイル(inXMLのファイルå�? : FILENAME (ä¾? query.jsp)
440 * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS (ä¾? DOC10)
441 * 入力ファイル(inXMLの更新日ä»? ) : MODIFIED (ä¾? yyyyMMddHHmmss形å¼?
442 *
443 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
444 *
445 * @param xmlIn XML入力ファイル
446 *
447 * @return HybsEntry配å?
448 */
449 private HybsEntry[] getXmlParameter( final String xmlIn ) {
450 HybsEntry[] entry = new HybsEntry[4] ;
451
452 entry[0] = new HybsEntry( "FILEPATH" , xmlIn) ;
453
454 File xmlFile = new File( xmlIn );
455 entry[1] = new HybsEntry( "FILENAME" , xmlFile.getName()) ;
456
457 File parentFile = xmlFile.getParentFile() ;
458 if( parentFile != null ) {
459 entry[2] = new HybsEntry( "ADDRESS" , parentFile.getName()) ;
460 }
461 else {
462 entry[2] = new HybsEntry( "ADDRESS" , "" ) ;
463 }
464
465 // String lastDate = formatter.format( new Date( xmlFile.lastModified() ) ) ;
466 String lastDate = HybsDateUtil.getDate( xmlFile.lastModified() , "yyyyMMddHHmmss" ) ; // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
467 entry[3] = new HybsEntry( "MODIFIED" , lastDate ) ;
468
469 return entry ;
470 }
471
472 /**
473 * Transformer オブジェクãƒ?に、パラメータを設定しますã?
474 *
475 * æŒ?®šされたパラメーターキーは、xsl ファイルでは、xsl:param で宣è¨?�—ã€?
476 * xsl:value-of で取り出しますã?
477 * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
478 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できますã?
479 *
480 * @param former Transformerオブジェクãƒ?
481 * @param entry パラメータ配å?
482 */
483 private void parameterSet( final Transformer former,final HybsEntry[] entry ) {
484 if( entry != null ) {
485 int size = entry.length;
486 for( int i=0; i<size; i++ ) {
487 String key = entry[i].getKey() ;
488 String val = entry[i].getValue();
489 former.setParameter( key , val );
490 }
491 }
492 }
493
494 /**
495 * こã?オブジェクトã?å†?ƒ¨æ–?—å?表現を返しますã?
496 *
497 * 接続URL + "," + 接続ユーザー + " (" + 作æ?日ä»?+ ")" ですã?
498 *
499 * @return å†?ƒ¨æ–?—å?表現
500 */
501 @Override
502 public String toString() {
503 StringBuilder buf = new StringBuilder();
504
505 buf.append( "XSL File:" ).append( xslFile ).append( CR );
506 buf.append( "XML File:" ).append( xmlFile ).append( CR );
507 buf.append( "OUT File:" ).append( outFile ).append( CR );
508
509 return buf.toString() ;
510 }
511
512 /**
513 * エラーæƒ??のå†?ƒ¨XMLæ–?—å?表現を返しますã?
514 *
515 * エラー時ã?æƒ??もã?XML化して保存する為の簡易å?ç�??
516 * ここでは、XMLスキーマã?、固定で、GF70 の形式になりますã?
517 *
518 * @og.rev 4.2.3.0 (2008/05/26) エラー発生時のXMLファイルを追åŠ?�—ますã?
519 * @og.rev 5.2.1.0 (2010/10/01) XML形式を変更しますã?(TEXT⇒TEXT_DATA)
520 *
521 * @param entry HybsEntry配å?
522 * @param ex エラーæƒ??
523 *
524 * @return XMLの部åˆ?–‡字å?
525 */
526 private String toXmlRow( final HybsEntry[] entry,final TransformerException ex ) {
527 StringBuilder buf = new StringBuilder();
528
529 buf.append( "<ROW>" ).append( CR );
530 if( paramEntry != null ) {
531 for( int i=0; i<paramEntry.length; i++ ) {
532 String key = paramEntry[i].getKey() ;
533 String val = paramEntry[i].getValue();
534 buf.append( " <" ).append( key ).append( ">" );
535 buf.append( val );
536 buf.append( "</" ).append( key ).append( ">" );
537 buf.append( CR );
538 }
539 }
540
541 if( entry != null ) {
542 for( int i=0; i<entry.length; i++ ) {
543 String key = entry[i].getKey() ;
544 String val = entry[i].getValue();
545 buf.append( " <" ).append( key ).append( ">" );
546 buf.append( val );
547 buf.append( "</" ).append( key ).append( ">" );
548 buf.append( CR );
549 }
550 }
551
552 buf.append( " <TAGNAME />" ).append( CR );
553 buf.append( " <MSGCD>XML_ERROR</MSGCD>" ).append( CR );
554 buf.append( " <MSGTXT>XML-XSLT 変換に失敗しましたã€?/MSGTXT>" ).append( CR );
555
556 String errMsg = StringUtil.htmlFilter( ex.getMessage() );
557 int indx = errMsg.lastIndexOf( "Exception:" );
558 if( indx >= 0 ) {
559 errMsg = errMsg.substring( indx + "Exception:".length() );
560 }
561 buf.append( " <TEXT_DATA>" ).append( errMsg ).append( CR ); // 5.2.1.0 (2010/10/01)
562 buf.append( " Location:" ).append( ex.getLocationAsString() ).append( CR );
563
564 // 4.2.3.0 (2008/05/26)
565 // if( jspIncludeData != null ) {
566 // buf.append( StringUtil.htmlFilter( jspIncludeData ) );
567 // }
568
569 buf.append( "</TEXT_DATA>" ).append( CR ); // 5.2.1.0 (2010/10/01)
570 buf.append( "</ROW>" ).append( CR );
571
572 return buf.toString() ;
573
574 /*
575 <ROW>
576 <SYSTEM_ID> </SYSTEM_ID>
577 <ADDRESS > </ADDRESS>
578 <FILENAME > </FILENAME>
579 <FILEPATH > </FILEPATH>
580 <MODIFIED > </MODIFIED>
581 <TAGNAME > </TAGNAME>
582 <MSGCD > </MSGCD>
583 <MSGTXT > </MSGTXT>
584 <TEXT_DATA> </TEXT_DATA>
585 </ROW>
586 */
587 }
588
589 /**
590 * ãƒ?‚¹ト用のメインメソãƒ?ƒ‰
591 *
592 * java XSLT in_xml in_xsl out_xml
593 *
594 * @param args コマンド引数配å?
595 */
596 public static void main( final String[] args ) throws IOException {
597 if( args.length != 3 ) {
598 LogWriter.log( "Usage: java XSLT in_xml in_xsl out_xml" );
599 LogWriter.log( " XML 入力ファイルに、XSL 入力ファイルを適用してã€? );
600 LogWriter.log( " XSLT変換を行いますã?" );
601 LogWriter.log( " 結果は、XML ファイルにセーブしますã?" );
602 LogWriter.log( " out_xml に System.out を指定すると標準å?力に出力しますã?" );
603 return ;
604 }
605
606 XSLT xslt = new XSLT();
607 xslt.setXslFile( args[1] );
608 xslt.setOutFile( args[2],false );
609 xslt.transform( args[0] );
610 xslt.close();
611 }
612 }