Schematron 中使用 schxslt 和 saxonCS 编译的 base-uri 函数

问题描述 投票:0回答:1

我有一个 xml 文件和 .sch 文件来验证此 xml 文件。但有一些规则叫

<xsl:param name="dosyaAdi" select="base-uri()"/>
。 base-uri() 函数返回 null,并且根据该函数的所有控件都失败。

我已经用schxslt的compile-for-svrl.xsl编译了我的sch文件然后我将我的xml和xslt传递给Saxon进行转换。它变形得很好。但我猜想 sch 中的 base-uri() 函数如何返回 null 和依赖于它的 2 个规则失败。这是我的代码示例。

    string schxsltSvrlXsltResource = @"SchematronSchxsltSaxonCSValidator/schxslt195/compile-for-svrl.xsl";
    var schxsltResourceUri = UriUtils.GetLocationUri(schxsltSvrlXsltResource, Assembly.GetExecutingAssembly());

    var resolver = new Resolver();

    var settings = new XmlReaderSettings() { XmlResolver = resolver };

    var processor = new Processor(true);
    var xsltCompiler = processor.NewXsltCompiler();

    using var schxsltReader = XmlReader.Create(schxsltResourceUri.AbsoluteUri, settings);


    var transformer = xsltCompiler.Compile(schxsltReader).Load30();
    //var compiledSchxslt = xsltCompiler.Compile(schxsltReader).Load30();

    var compiledSchematron = new XdmDestination();
    compiledSchematron.BaseUri = new Uri(new FileInfo(inputSch).FullName);

    using var schemaStream = File.OpenRead(inputSch);

    transformer.Transform(schemaStream, compiledSchematron);

    var xsltCompiler2 = processor.NewXsltCompiler();

    var schematronValidator = xsltCompiler2.Compile(compiledSchematron.XdmNode).Load30();

    var svrlResult = new XdmDestination(); 
    using var instanceStream = File.OpenRead(inputXml);
    //schematronValidator.Run(svrlResult);
    schematronValidator.Transform(instanceStream, svrlResult);

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(svrlResult.XdmNode.OuterXml);

    var failedNodes = doc.GetElementsByTagName("svrl:failed-assert");
    foreach (System.Xml.XmlNode node in failedNodes)
    {

    }
c# xml xslt saxon xml-validation
1个回答
0
投票

Transform
方法有重载https://www.saxonica.com/html/documentation12/dotnetdoc/Saxon/Api/Xslt30Transformer.html#Transform(Stream,Uri,IDestination)允许您设置基本 Uri 所以而不是

schematronValidator.Transform(instanceStream, svrlResult);

尝试

schematronValidator.Transform(instanceStream, new Uri(new FileInfo(inputXml).FullName),  svrlResult);

如果这不起作用,请考虑显示堆栈跟踪以及出现错误的确切行。

© www.soinside.com 2019 - 2024. All rights reserved.