【问题标题】:XML validation on XSD during XSLT transformationXSLT 转换期间 XSD 上的 XML 验证
【发布时间】:2011-09-06 10:34:35
【问题描述】:

我有这个简单的代码来用 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);

如何在 XSD xslt 转换期间验证我在 XSD 上的输出 xml 文件?例如:如果 xslt 尝试创建另一个明确的标记(具有相同的名称)并且 XSD 不允许它 - xslt 转换器将不会这样做(或生成异常)

【问题讨论】:

    标签: c# xml xslt


    【解决方案1】:

    XSLT 1.0 不支持模式。没有兼容的 XSLT 1.0 处理器有任何工具来指定所需输出的模式和验证输出。因此,XSLT 程序员只能在转换之后执行验证作为第二步。

    XSLT 2.0 指定了模式感知 (SA) XSLT 2.0 处理器的特性,正是它允许这样做。 SA 还可以验证使用document() 函数获得的参数、变量、中间(临时)树和文档的类型。

    一些著名的 XSLT 2.0 SA 处理器是 Saxon 9.x、XQSharp 和 AltovaXML。至少还有另外两家——IBM(WebSphere 的一部分)和英特尔。

    【讨论】:

      【解决方案2】:

      您可以根据需要执行 XSLT 转换,然后使用 Validation Event Handling 验证输出文档。

      【讨论】:

        【解决方案3】:

        Saxon 有一个 Schema Aware 处理器,但我认为您必须为许可证付费。

        您也可以只验证 XSLT 的输出。

        【讨论】:

        • 还有另外两个 XSLT 2.0 模式感知处理器,即 XQSharp xqsharp.com 和 AltovaXML altova.com/altovaxml.html。否则 Paul 是对的,如果您想直接在 XSLT 中执行验证,您需要使用模式感知 XSLT 2.0 处理器。或者您需要验证 XSLT 1.0 处理器的输出,使用 .NET 和 XslCompiledTransform 您有一些选项可以执行此操作,您可以转换为 System.Xml.XmlDocument 或 System.Xml.Linq.XDocument,然后使用它们的 Validate 方法,或者您像当前一样写入文件并使用 XmlReader 进行验证。
        • 将输出验证与 XSLT 转换集成的好处是您可以获得更好的错误消息:不仅仅是知道输出文档中的哪一行是错误的,一个体面的处理器会告诉您哪一行在样式表中导致它出错,因此调试周期要快得多。事实上,在某些情况下(特别是如果您仔细记录函数和模板的输入和输出以及“as”属性),XSLT 处理器将能够在样式表编译时告诉您您的代码将始终生成无效输出。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 2010-12-17
        • 2021-09-04
        • 2012-10-16
        • 2012-03-19
        • 2019-11-26
        • 2018-05-24
        相关资源
        最近更新 更多