ものがたり(旧)

atsushieno.hatenablog.com に続く

n v d l

何となくNVDLの実装よりRELAX NG実装のbugfixに終始してしまった気がしなくもない。現在もむしろそっちではまっている。けど、とりあえず何も動かせるコードが無かった先週よりはずっとイイ感じだ。ADO.NETは新しいインド人ハッカーの人がたくさん直してくれてだいぶ安定してきたし、そっちは1日8時間程度にしておいて、NVDL実装を先にやっつけてしまおうかなあ。

とりあえず明らかにまだ出来ていないこと:

  • context pathのチェック。これはdispatcherのrule探索の関数を1つ直すだけ(といってもパスのスタックがいるけど…)
  • 属性セクションのフィルタリング。これは検証系に食わせるXmlReader(今のところこれはPlaceHoldableXmlReaderという謎の名前になっているが、変える予定)のMoveTo*Attribute()とGetAttribute()にフィルタをかけるだけ。
  • createPlaceHolder()。検証系にダミーの要素を食わせる。ただしDepthなどの調整が必要。
  • mime typeとスキーマを解決するprovider interface(設計間違ってたので全部やり直し)

出来て無さそうなこと:

  • resultActionの正しい処理

それって言い換えれば何も出来てないんじゃ…?

…よし、とりあえずxhtml+rdfの奴は通るようになった。これは実際にはdispatch1回(2回?)しかないから何もしてないようなもんなんだよね…。次はxformsInXhtmlだけど、コレを直すにはRELAX NGまわりのバグを直さなければ。ていうかもう7時だし…

サンプルコードはこんな感じ。実際にはもうちょっと調整が必要だとおもうけど…


using System;
using System.IO;
using System.Xml;
using Commons.Xml.Relaxng;
using Commons.Xml.Relaxng.Rnc;
using Commons.Xml.Nvdl;

public class Test
{
public static void Main (string [] args)
{
string target = args [0];

// prepare NvdlRules for NVDL
XmlTextReader nvdlReader = new XmlTextReader (target + ".nvdl");
RelaxngPattern p = RncParser.ParseRnc (new StreamReader ("nvdl.rnc"));

RelaxngValidatingReader rvr = new RelaxngValidatingReader (
nvdlReader, p);
NvdlRules rules = NvdlReader.Read (rvr);

// validate instance against NVDL script.
XmlReader xr = new XmlTextReader (target + ".xml");
NvdlValidatingReader vr = new NvdlValidatingReader (xr, rules);
XmlDocument doc = new XmlDocument ();
doc.Load (vr);
doc.Save (Console.Out);
}
}

やーん。xformsInXhtml.rngで参照されているxforms.rngって実は存在しないじゃーん。どうすんべ。