我運行這段代碼:使用SAXON 9.5(的NuGet)使用Schematron
string path = AppDomain.CurrentDomain.BaseDirectory;
// Uri schemaUri = new Uri(@"file:\\" + path + @"\sch\patient.sch");
Uri totransformEE = new Uri(@"file:\\" + path + @"\po\po-schema.sch");
Uri transformER = new Uri(@"file:\\" + path + @"\xsl\conformance1-5.xsl");
///////////////////////////////
// Crate Schemtron xslt to be applied
///////////////////////////////
// Create a Processor instance.
Processor processor = new Processor();
// Load the source document
XdmNode input = processor.NewDocumentBuilder().Build(totransformEE);
// Create a transformer for the stylesheet.
XsltTransformer transformer = processor.NewXsltCompiler().Compile(transformER).Load();
// Set the root node of the source document to be the initial context node
transformer.InitialContextNode = input;
// Create a serializer
Serializer serializer = new Serializer();
MemoryStream st = new MemoryStream();
serializer.SetOutputStream(st);
// Transform the source XML to System.out.
transformer.Run(serializer);
st.Position = 0;
System.IO.StreamReader rd = new System.IO.StreamReader(st);
string xsltSchematronStylesheet = rd.ReadToEnd();
System.Diagnostics.Debug.WriteLine(xsltSchematronStylesheet);
// Load the source document
Uri transformEE2 = new Uri(@"file:\\" + path + @"\po\po-bad.xml");
var documentbuilder2 = processor.NewDocumentBuilder();
XdmNode input2 = documentbuilder2.Build(transformEE2);
////// Create a transformer for the stylesheet.
StringReader sr2 = new StringReader(xsltSchematronStylesheet);
XsltTransformer transformer2 = processor.NewXsltCompiler().Compile(sr2).Load();
// Set the root node of the source document to be the initial context node
transformer2.InitialContextNode = input2;
// Create a serializer
Serializer serializer2 = new Serializer();
MemoryStream st2 = new MemoryStream();
serializer.SetOutputStream(st2);
transformer2.MessageListener = new MyMessageListener();
// Transform the source XML to System.out.
transformer2.Run(serializer2);
st2.Position = 0;
System.IO.StreamReader rd2 = new System.IO.StreamReader(st2);
string xsltSchematronResult = rd2.ReadToEnd();
System.Diagnostics.Debug.WriteLine(xsltSchematronResult);
我得到什麼似乎檢查xsltSchematronStylesheet時是一個XSLT文件。然而,st2結尾的流長度爲0。另外,MyMessageListener.Message不接收任何調用(我使用了一個斷點)。
我不知道我是否有壞代碼,壞樣本文件等 我相信我的示例文件是正確的,但也許我有壞的或缺少一些。
有誰知道爲什麼沒有數據返回到流st2。如果不是,你能指導我做一個簡單的樣本,它有所有的文件和作品嗎?
嗯,首先,所有的反斜線看起來很可疑。 URI始終包含正斜槓,從不反斜槓。 –
嘗試調用MemoryStream上的Close()。也許設置Position = 0會刪除現有的內容。 (我在這裏沒有專家,MemoryStream類一直困惑着我。) –
我開始認爲我的xsl和/或sch和/或xml文件在某些方面有缺陷。我發現了「iso-schematron-xslt2」,它使用[link]中提到的「http://purl.oclc.org/dsdl/schematron」命名空間http://stackoverflow.com/questions/16942939/saxon-produces-空-XML的從-的Schematron?RQ = 1。但是,我使用這些文件獲得相同的行爲。不幸的是,iso-schematron-xslt2文件集不包含sch和xml的已知好樣本來測試。任何人都可以指給我一個這樣的例子嗎? –