次のような Web DTD を使用したサードパーティの XML があります。
<?xml version="1.0"?>
<!DOCTYPE orders
SYSTEM "http://www.mijnwinkel.nl/DTD/orders_export_v2.dtd">
<orders>
<mail version="2.0" >
<set id="session" sequence="1" version="1.1" >
<property id="calc_vat"
label=""
sequence="0"
resource_label=""
show_type=""
name="" >1</property>
<property id="emailvendor"
label=""
sequence=""
resource_label=""
show_type=""
name=""> ... </property>
等...
これを .Net アプリケーションで処理される新しい XML に変換する XSLT スクリプトを開発しました。
問題は、このアプリケーションをオフラインで動作させたいということです。つまり、XSLT は外部 DTD を無視し、コード内でそのローカル コピーを使用する必要があります。
したがって、私のコードは次のようになります。
foreach (var file in fileslist)
{
Message.SendMessage( "Transformeer: "+ file + "....start" );
CurrentFile = Path.GetFileName(file);
//Transforming XML using XSL
var resolver = new XmlUrlResolver
{
Credentials = System.Net.CredentialCache.DefaultCredentials
};
// xml content reader
var settings = new XmlReaderSettings
{
XmlResolver = resolver,
DtdProcessing = System.Xml.DtdProcessing.Parse
};
var xslCompiledTransform = new XslCompiledTransform();
using (Stream strm = Assembly.GetExecutingAssembly().GetManifestResourceStream("EAOrderImportBL.Import.xsl"))
using (XmlReader xslreader = XmlReader.Create(strm))
{
xslCompiledTransform.Load(xslreader, XsltSettings.Default, resolver);
}
var xmlSettings = new XmlWriterSettings();
var reader = XmlReader.Create(file, settings);
using (var w = XmlWriter.Create(TempPath + @"\" + CurrentFile, xmlSettings))
{
xslCompiledTransform.Transform(reader, w);
}
reader.Close();
Message.SendMessage( "Transformatie: " + file + "....complete" );
}
}
これは正常に動作しますが、DTD への外部リンクによる長い処理の側面があります。
したがって、コード行をオフラインにする場合:
xslCompiledTransform.Transform(reader, w);
外部 DTD に接続できない/見つからないという例外をスローします。
xslCompiledTransform.Transform メソッド行が Web DTD のコピーをチェックするように、コードを変更する方法を誰か説明できますか?
事前に感謝します、Jahwik