Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSLT转换期间XSD上的XML验证_C#_Xml_Xslt - Fatal编程技术网

C# XSLT转换期间XSD上的XML验证

C# XSLT转换期间XSD上的XML验证,c#,xml,xslt,C#,Xml,Xslt,我有一个简单的代码,可以用xslt转换xml文件 XslCompiledTransform transform = new XslCompiledTransform(true); transform.Load("XSLTFile1.xslt", new XsltSettings(true, true), null); XmlReader input = XmlReader.Create("XMLFile1.xml"); XmlWriter output = XmlWriter.Create("R

我有一个简单的代码,可以用xslt转换xml文件

XslCompiledTransform transform = new XslCompiledTransform(true);
transform.Load("XSLTFile1.xslt", new XsltSettings(true, true), null);
XmlReader input = XmlReader.Create("XMLFile1.xml");
XmlWriter output = XmlWriter.Create("Result.xml", transform.OutputSettings);
transform.Transform(input, null, output);
在xslt转换期间,如何在XSD上验证输出xml文件?例如:如果xslt尝试创建另一个明确的标记(使用相同的名称),而XSD不允许这样做-xslt transformator不会这样做(或生成异常)

有一个支持模式的处理器,但我认为您必须为许可证付费


或者,您可以只验证XSLT的输出。

您可以根据需要执行XSLT转换,然后使用XSLT 1.0不支持模式验证输出文档。没有一个兼容的XSLT1.0处理器能够为所需的输出指定模式并验证输出。因此,XSLT程序员只能在转换后的第二步执行验证

XSLT2.0指定了模式感知(SA)XSLT2.0处理器的特性,该处理器正好支持这一点。SA还可以验证使用
document()
函数获得的参数、变量、中间(临时)树和文档的类型


一些著名的XSLT2.0SA处理器是Saxon9.x、XQSharp和AltovaXML。至少还有另外两种——IBM(WebSphere的一部分)和Intel。

还有另外两种XSLT 2.0模式感知处理器,即XQSharp和AltovaXML。否则Paul是对的,如果您想直接在XSLT中执行验证,则需要使用支持模式的XSLT2.0处理器。或者,您需要验证XSLT 1.0处理器的输出,使用.NET和XslCompiledTransform您可以选择转换为System.Xml.XmlDocument或System.Xml.Linq.XDocument,然后使用其验证方法,或者像当前一样写入文件并使用XmlReader进行验证。将输出验证与XSLT转换集成的好处是,您可以获得更好的错误消息:而不仅仅是知道输出文档中哪一行是错误的,一个好的处理器会告诉你样式表中哪一行导致它出错,所以调试周期要快得多。事实上,在某些情况下(特别是如果您仔细地用“as”属性记录函数和模板的输入和输出),XSLT处理器将能够在样式表编译时告诉您,您的代码将始终生成无效的输出。