新しくなっているのに気付いた。 ruby extconf.rb --enable-error-handler (off by default)
とか書いてあるのでちょっと期待しつつ。
とりあえず cygwin で make できんので Makefile 修正。OBJS に /lib/libxml2.dll.a /lib/libxslt.dll.a
を追加して強制リンキング。exslt ははずす。
いろいろやってみたんだけど、よくわからん。USE_ERROR_HANDLER
で XML::XSLT.errors
が定義されるんだけどエラー起こしても特に何も入ってない。/* this is really quite inelegant */
とか書いてあって苦労してんなぁとかなんとか。
とりあえずさらに really quite inelegant
なコードで解決を図る。Ruby 側で…
require '../xslt'
xslt = XML::XSLT.new
xslt.xmlfile = "fuzface.xml"
xslt.xslfile = "fuzface.xsl"
begin
err = STDERR.dup
pipe = IO.pipe
STDERR.reopen(pipe[1])
out = xslt.serve # raise RuntimeError
rescue RuntimeError => e
p XML::XSLT.errors #=> []
if e.message =~ /^(XSL|XML|Stylesheet) /
p e
p pipe[0].readpartial(4096) #=> エラーメッセージ
else
raise
end
ensure
STDERR.reopen(err)
end
__END__
起こりうるエラーたち (grep)
parser.c:53: rb_raise( rb_eRuntimeError, "XSL parsing error" );
parser.c:59: rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" );
parser.c:65: rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" );
parser.c:84: rb_raise( rb_eRuntimeError, "XML parsing error" );
parser.c:90: rb_raise( rb_eRuntimeError, "XML parsing error" );
parser.c:97: rb_raise( rb_eRuntimeError, "Stylesheet transformation error" );
tests/fuzface.rb の改造。xmlfile=
は使うなという警告がでるけどとりあえず放置。$stderr
じゃなくて STDERR
にメッセージを吐くらしくめんどっちいことをやってる。readpartial
は cygwin の ruby が 1.8.3 になったから使ってみた。便利よねコレ
ごちゃごちゃやってみたけど使わない。XREA に入れるのめんどいし……
これでドウダ
class XML::XSLT
class XSLTError < StandardError; end
class XSLParsingError < XSLTError; end
class XSLStylesheetParsingError < XSLTError; end
class XMLParsingError < XSLTError; end
class StylesheetTransformationError < XSLTError; end
alias __org__serve serve
def serve
ret = nil
err = STDERR.dup
pipe = IO.pipe
Thread.critical = true
STDERR.reopen(pipe[1])
begin
ret = __org__serve
rescue RuntimeError => e
STDERR.reopen(err)
Thread.critical = false
message = pipe[0].sysread(4096)
error_class = XSLTError
case e.message
when "XSL parsing error"
error_class = XSLParsingError
when "XSL Stylesheet parsing error"
error_class = XSLStylesheetParsingError
when "XML parsing error"
error_class = XMLParsingError
when "Stylesheet transformation error"
error_class = StylesheetTransformationError
end
raise error_class.new(message)
ensure
STDERR.reopen(err)
Thread.critical = false
end
ret
end
end
xslt = XML::XSLT.new
xslt.xmlfile = "fuzface.xml"
xslt.xslfile = "fuzface.xsl"
begin
xslt.serve
rescue XML::XSLT::XSLTError => e
p e
end
将来完璧な実装になっても消すだけ! これなら使えそう? ごめん嘘。エラークラス云々があるのでそのままじゃ無理。
- トップ
- web
- ruby-xslt 0.8.2
- トップ
- ruby
- ruby-xslt 0.8.2
- トップ
- xslt
- ruby-xslt 0.8.2