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 // 5.7.3.0 (2014/02/07) エラー??をも?し詳細に取得します? 258 StringBuilder errBuf = new StringBuilder(); 259 // String errMsg = "XML-XSLT 変換に失敗しました? + CR 260 // + ex.getMessage() ; 261 String errMsg = ex.getMessageAndLocation() ; 262 263 errBuf.append( "XML-XSLT 変換に失敗しました? ).append( CR ).append( errMsg ); 264 265 // 5.6.5.2 (2013/06/21) エラーメ?ージが判りにくいので、追記します? 266 if( errMsg.indexOf( "プロローグにはコン???できません" ) >= 0 ) { 267 // errMsg = errMsg + CR + "(UTF-8変換時に、BOMが付くとこ?エラーが?ます?BOMを外してみてください?" ; 268 errBuf.append( CR ).append( "(UTF-8変換時に、BOMが付くとこ?エラーが?ます?BOMを外してみてください?" ); 269 } 270 271 // 5.6.7.1 (2013/08/09) ??用に、ファイルリストを出力します? 272 if( errMsg.indexOf( "で終?る?がありま? ) >= 0 && debugMsg != null && debugMsg.length() > 0 ) { 273 // errMsg = errMsg + CR + "不整合?、includeファイルの可能性があります?" + debugMsg; 274 errBuf.append( CR ).append( "不整合?、includeファイルの可能性があります?" ).append( debugMsg ); 275 } 276 errBuf.append( CR ); 277 278 if( isErrXmlIn ) { setOutData( toXmlRow( entry, ex ) ); } 279 280 if( isErrClose ) { close(); } 281 // throw new RuntimeException( errMsg,ex ); 282 throw new RuntimeException( errBuf.toString(),ex ); 283 } 284 finally { 285 Closer.ioClose( xmlReader ); 286 } 287 } 288 289 /** 290 * Transformer オブジェクトに対して、Parameter を設定します? 291 * 292 * ?されたパラメーターキーは、xsl ファイルでは、xsl:param で宣?? 293 * xsl:value-of で取り出します? 294 * <xsl:param name="ADDRESS" select="" /> と宣?ておき、?な?で 295 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できます? 296 * 297 * @param entry HybsEntry配? 298 */ 299 public void setParamEntry( final HybsEntry[] entry ) { 300 if( entry != null && entry.length > 0 ) { 301 paramEntry = new HybsEntry[entry.length]; 302 System.arraycopy( entry,0,paramEntry,0,entry.length ); 303 } 304 } 305 306 /** 307 * transform 処?にエラーが発生した?合に、?力ファイルを閉じるかど?を指定します? 308 * 309 * 処??中でエラーが発生した?合に、そこで処?中断するか?それとも? 310 * 無視して、さらに処?進めるかを?することが可能です? 311 * 継続して処?進めた??合?、?力ファイルを閉じな?め?false ? 312 * 設定します?ただし?エラー時には、RuntimeException は throw されます? 313 * 初期値は、true(閉じ?です? 314 * 315 * @param flag エラー時クローズ [true:閉じ?false:閉じない] 316 */ 317 public void errClose( final boolean flag ) { 318 isErrClose = flag ; 319 } 320 321 /** 322 * transform 処?エラーを?出力ファイルに、XML形式でエラーを追記するかど?を指定します? 323 * 324 * 処??中でエラーが発生した?合に、ログ?ではなく?結果XMLファイルに? 325 * エラー???エラーファイルなどを埋め込?、XMLファイルとしてDB登録?? 326 * そ?他集計等に使えます? 327 * 今?、GE70 スキーマ形式?ファイルしか作?できません? 328 * これは?errClose( boolean ) メソ?と共に使用すると効果的です? 329 * つまり?errClose = false; にして、エラー時でも?力ファイルを閉じずに? 330 * 処?続ける事で、エラーメ?ージもXMLファイルとして?できます? 331 * 初期値は、false(使用しな?です? 332 * 333 * @param flag エラー時XML形?[false:使用しな?true:使用する] 334 */ 335 public void useErrXmlIn( final boolean flag ) { 336 isErrXmlIn = flag ; 337 } 338 339 /** 340 * jsp:directive.include 発見時に、そのファイル?INCLUDE するかを?するかど?を指定しま?初期値:true:使用する) 341 * 342 * 引数の処?象ファイル(transformの引数ファイル)が??jsp』?場合? 343 * jsp:directive.include 発見時に、そのファイル?INCLUDE するかを?するか 344 * ど?を指定します? 345 * インクルードされたファイルとあわせて、正規?XML にならな?、パーサー 346 * エラーが発生します? 347 * JSPソース解析を行うには、INCLUDE ファイルも?慮しな?正確な結果? 348 * 得られませんが?INCLUDE 先?ファイルまで合わせる?があるため? 349 * 場合によっては、INCLUDEファイルを無視しなければならな?ースがあります? 350 * 初期値は、true(使用する)です? 351 * 352 * @param flag エラー時XML形?[false:使用しな?true:使用する] 353 */ 354 public void jspInclude( final boolean flag ) { 355 isInclude = flag ; 356 } 357 358 /** 359 * 入力XSLファイルのストリー?閉じます? 360 * 361 * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャ?ュをクリアします? 362 */ 363 public void close() { 364 Closer.ioClose( outWriter ); 365 366 // 5.6.7.1 (2013/08/09) includeしたファイルのキャ?ュをクリア 367 JspIncludeReader.cacheClear(); 368 } 369 370 /** 371 * XML ファイルをXSLT変換します? 372 * XML 入力ファイルに、XSL 入力ファイルを適用して?XSLT変換を行います? 373 * 結果は、XML ファイルにセーブします? 374 * なお?結果XML ファイル(outFile) に、特別な名称 "System.out" ??を渡すと? 375 * 標準?力に 結果を?力します? 376 * 377 * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャ?ュをクリアします? 378 */ 379 private void init() { 380 try { 381 // xsl属?からStreamSourceを作る 382 StreamSource style = new StreamSource( xslReader ); 383 384 // Transformerを作り、XMLを変換する 385 TransformerFactory tFactory = TransformerFactory.newInstance(); 386 transformer = tFactory.newTransformer( style ); 387 388 parameterSet( transformer,paramEntry ); 389 390 // 5.6.7.1 (2013/08/09) includeしたファイルのキャ?ュをクリア 391 JspIncludeReader.cacheClear(); 392 } 393 catch( TransformerConfigurationException ex ) { 394 String errMsg = xslFile + "ファイルの XSLT 解析に失敗しました? + CR 395 + ex.getMessage() ; 396 throw new RuntimeException( errMsg,ex ); 397 } 398 finally { 399 Closer.ioClose( xslReader ); 400 xslReader = null; 401 } 402 } 403 404 /** 405 * 実行中の入力ファイル名などの属????パラメータとして設定するかど?を指定します? 406 * 407 * こ?パ?サーでは、?部で実行中の入力ファイル???パラメータとして設定できます? 408 * useFileInfo( true ) とセ?すると、以下???目が?部?セ?されます? 409 * 410 * 入力ファイル(inXMLのフルパス) : FILEPATH (? G:\webapps\gf\jsp\DOC10\query.jsp) 411 * 入力親フォル?inXMLの親フォル? : ADDRESS (? DOC10) 412 * 入力ファイル(inXMLのファイル? : FILENAME (? query.jsp) 413 * 入力ファイル(inXMLの更新日? ) : MODIFIED (? yyyyMMddHHmmss形? 414 * 415 * @og.rev 4.0.0.0 (2007/09/25) ParameterMetaData を使用したパラメータ設定追?? 416 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します? 417 * 418 * xsl ファイルでは、xsl:param で宣?、xsl:value-of で取り出します? 419 * <xsl:param name="ADDRESS" select="" /> と宣?ておき、?な?で 420 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できます? 421 * 422 * 初期値は、false(セ?しな? です? 423 * 424 * @param flag セ?する:true/セ?しな?false 425 */ 426 public void useFileInfo( final boolean flag ) { 427 isFileInfo = flag; 428 // if( isFileInfo ) { 429 // formatter = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN ); 430 // } 431 } 432 433 /** 434 * ファイル名指定で XML,XSL,OUTファイルを指定する?合?エンコードを?します? 435 * 436 * 初期値は、UTF-8 です? 437 * 438 * @param encode エンコー? 439 */ 440 public void useEncode( final String encode ) { 441 this.encode = encode; 442 } 443 444 /** 445 * 実行中の入力ファイル名などの属????パラメータとして取得します? 446 * 447 * 入力ファイル(inXMLのフルパス) : FILEPATH (? G:\webapps\gf\jsp\DOC10\query.jsp) 448 * 入力ファイル(inXMLのファイル? : FILENAME (? query.jsp) 449 * 入力親フォル?inXMLの親フォル? : ADDRESS (? DOC10) 450 * 入力ファイル(inXMLの更新日? ) : MODIFIED (? yyyyMMddHHmmss形? 451 * 452 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します? 453 * 454 * @param xmlIn XML入力ファイル 455 * 456 * @return HybsEntry配? 457 */ 458 private HybsEntry[] getXmlParameter( final String xmlIn ) { 459 HybsEntry[] entry = new HybsEntry[4] ; 460 461 entry[0] = new HybsEntry( "FILEPATH" , xmlIn) ; 462 463 File xmlFile = new File( xmlIn ); 464 entry[1] = new HybsEntry( "FILENAME" , xmlFile.getName()) ; 465 466 File parentFile = xmlFile.getParentFile() ; 467 if( parentFile != null ) { 468 entry[2] = new HybsEntry( "ADDRESS" , parentFile.getName()) ; 469 } 470 else { 471 entry[2] = new HybsEntry( "ADDRESS" , "" ) ; 472 } 473 474 // String lastDate = formatter.format( new Date( xmlFile.lastModified() ) ) ; 475 String lastDate = HybsDateUtil.getDate( xmlFile.lastModified() , "yyyyMMddHHmmss" ) ; // 5.5.7.2 (2012/10/09) HybsDateUtil を利用 476 entry[3] = new HybsEntry( "MODIFIED" , lastDate ) ; 477 478 return entry ; 479 } 480 481 /** 482 * Transformer オブジェク?に、パラメータを設定します? 483 * 484 * ?されたパラメーターキーは、xsl ファイルでは、xsl:param で宣?? 485 * xsl:value-of で取り出します? 486 * <xsl:param name="ADDRESS" select="" /> と宣?ておき、?な?で 487 * <xsl:value-of select="$ADDRESS" /> とすれば、取得できます? 488 * 489 * @param former Transformerオブジェク? 490 * @param entry パラメータ配? 491 */ 492 private void parameterSet( final Transformer former,final HybsEntry[] entry ) { 493 if( entry != null ) { 494 int size = entry.length; 495 for( int i=0; i<size; i++ ) { 496 String key = entry[i].getKey() ; 497 String val = entry[i].getValue(); 498 former.setParameter( key , val ); 499 } 500 } 501 } 502 503 /** 504 * こ?オブジェクト????表現を返します? 505 * 506 * 接続URL + "," + 接続ユーザー + " (" + 作?日?+ ")" です? 507 * 508 * @return ???表現 509 */ 510 @Override 511 public String toString() { 512 StringBuilder buf = new StringBuilder(); 513 514 buf.append( "XSL File:" ).append( xslFile ).append( CR ); 515 buf.append( "XML File:" ).append( xmlFile ).append( CR ); 516 buf.append( "OUT File:" ).append( outFile ).append( CR ); 517 518 return buf.toString() ; 519 } 520 521 /** 522 * エラー??の?XML??表現を返します? 523 * 524 * エラー時???も?XML化して保存する為の簡易??? 525 * ここでは、XMLスキーマ?、固定で、GF70 の形式になります? 526 * 527 * @og.rev 4.2.3.0 (2008/05/26) エラー発生時のXMLファイルを追?ます? 528 * @og.rev 5.2.1.0 (2010/10/01) XML形式を変更します?(TEXT⇒TEXT_DATA) 529 * 530 * @param entry HybsEntry配? 531 * @param ex エラー?? 532 * 533 * @return XMLの部?字? 534 */ 535 private String toXmlRow( final HybsEntry[] entry,final TransformerException ex ) { 536 StringBuilder buf = new StringBuilder(); 537 538 buf.append( "<ROW>" ).append( CR ); 539 if( paramEntry != null ) { 540 for( int i=0; i<paramEntry.length; i++ ) { 541 String key = paramEntry[i].getKey() ; 542 String val = paramEntry[i].getValue(); 543 buf.append( " <" ).append( key ).append( ">" ); 544 buf.append( val ); 545 buf.append( "</" ).append( key ).append( ">" ); 546 buf.append( CR ); 547 } 548 } 549 550 if( entry != null ) { 551 for( int i=0; i<entry.length; i++ ) { 552 String key = entry[i].getKey() ; 553 String val = entry[i].getValue(); 554 buf.append( " <" ).append( key ).append( ">" ); 555 buf.append( val ); 556 buf.append( "</" ).append( key ).append( ">" ); 557 buf.append( CR ); 558 } 559 } 560 561 buf.append( " <TAGNAME />" ).append( CR ); 562 buf.append( " <MSGCD>XML_ERROR</MSGCD>" ).append( CR ); 563 buf.append( " <MSGTXT>XML-XSLT 変換に失敗しました?/MSGTXT>" ).append( CR ); 564 565 String errMsg = StringUtil.htmlFilter( ex.getMessage() ); 566 int indx = errMsg.lastIndexOf( "Exception:" ); 567 if( indx >= 0 ) { 568 errMsg = errMsg.substring( indx + "Exception:".length() ); 569 } 570 buf.append( " <TEXT_DATA>" ).append( errMsg ).append( CR ); // 5.2.1.0 (2010/10/01) 571 buf.append( " Location:" ).append( ex.getLocationAsString() ).append( CR ); 572 573 // 4.2.3.0 (2008/05/26) 574 // if( jspIncludeData != null ) { 575 // buf.append( StringUtil.htmlFilter( jspIncludeData ) ); 576 // } 577 578 buf.append( "</TEXT_DATA>" ).append( CR ); // 5.2.1.0 (2010/10/01) 579 buf.append( "</ROW>" ).append( CR ); 580 581 return buf.toString() ; 582 583 /* 584 <ROW> 585 <SYSTEM_ID> </SYSTEM_ID> 586 <ADDRESS > </ADDRESS> 587 <FILENAME > </FILENAME> 588 <FILEPATH > </FILEPATH> 589 <MODIFIED > </MODIFIED> 590 <TAGNAME > </TAGNAME> 591 <MSGCD > </MSGCD> 592 <MSGTXT > </MSGTXT> 593 <TEXT_DATA> </TEXT_DATA> 594 </ROW> 595 */ 596 } 597 598 /** 599 * ?ト用のメインメソ? 600 * 601 * java XSLT in_xml in_xsl out_xml 602 * 603 * @param args コマンド引数配? 604 * @throws IOException 入出力エラーが発生した?? 605 */ 606 public static void main( final String[] args ) throws IOException { 607 if( args.length != 3 ) { 608 LogWriter.log( "Usage: java XSLT in_xml in_xsl out_xml" ); 609 LogWriter.log( " XML 入力ファイルに、XSL 入力ファイルを適用して? ); 610 LogWriter.log( " XSLT変換を行います?" ); 611 LogWriter.log( " 結果は、XML ファイルにセーブします?" ); 612 LogWriter.log( " out_xml に System.out を指定すると標準?力に出力します?" ); 613 return ; 614 } 615 616 XSLT xslt = new XSLT(); 617 xslt.setXslFile( args[1] ); 618 xslt.setOutFile( args[2],false ); 619 xslt.transform( args[0] ); 620 xslt.close(); 621 } 622 }