Pregunta

Estoy ejecutando este código:

        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);

Obtengo lo que parece ser un archivo XSLT al examinar XSLTSCHEMATRONSTYLESHEET.Sin embargo, la corriente en el extremo ST2 tiene 0 longitud.Además, MyMessAmelistener.Message no recibe llamadas (usé un punto de interrupción).

No estoy seguro de si tengo un código malo, archivos de muestra malos, etc. Creo que mis archivos de muestra son correctos, pero tal vez tengo los malos o me estoy perdiendo algunos.

¿Alguien sabe por qué no se devuelven datos a la STEME ST2?Si no, ¿puedes dirigirme a una buena muestra simple que tiene todos los archivos y funciona?

¿Fue útil?

Solución

Mi verdadero problema subyacente fue encontrar un código de ejemplo completo simple para hacer Schematron en .NET.Así que para el siguiente tipo aquí está la muestra que estaba buscando.He tratado de hacer esto lo más completo posible.Si me perdí algo, deja un comentario.

  1. Crear un proyecto de prueba de unidad
  2. Ejecute el comando de nuget
  3. descargar los archivos Schematron
  4. Usa las clases incluidas y SCH, archivos XML.
  5. Ejecute el programa de prueba
  6. NUGET SAXON SAXON LINEAL:

    Install-Package Saxon-HE 
    

    descargar Archivos de Schematron actualizados http://www.schematron.com/tmp/iso-schematron-xslt2.zip

    unittest :

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System.IO;
    
    namespace SOAPonFHIR.Test
    {
        [TestClass]
        public class Schematron
        {
            [TestMethod]
            public void XSLT_SAXON_Simple_Schematron2()
            {
    
                ///////////////////////////////
                // Transform original Schemtron  
                ///////////////////////////////
                string path = AppDomain.CurrentDomain.BaseDirectory;
    
                Uri schematron = new Uri(@"file:\\" + path + @"\simple\input.sch");
                Uri schematronxsl = new Uri(@"file:\\" + path + @"\xsl_2.0\iso_svrl_for_xslt2.xsl");
    
                Stream schematrontransform = new Test.XSLTransform().Transform(schematron, schematronxsl);
    
                ///////////////////////////////
                // Apply Schemtron xslt 
                ///////////////////////////////
                FileStream xmlstream = new FileStream(path + @"\simple\input.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
                Stream results = new Test.XSLTransform().Transform(xmlstream, schematrontransform);
    
                System.Diagnostics.Debug.WriteLine("RESULTS");
                results.Position = 0;
                System.IO.StreamReader rd2 = new System.IO.StreamReader(results);
                string xsltSchematronResult = rd2.ReadToEnd();
                System.Diagnostics.Debug.WriteLine(xsltSchematronResult);
    
            }
        }
    }
    

    clase de transformación:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System.Xml;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    using Saxon.Api;
    using System.IO;
    using System.Xml.Schema;
    using System.Collections.Generic;
    
    namespace SOAPonFHIR.Test
    {
        public class XSLTransform
        {
            public Stream Transform(Uri xmluri, Uri xsluri)
            {
    
    
                // Create a Processor instance.
                Processor processor = new Processor();
    
                // Load the source document
                XdmNode input = processor.NewDocumentBuilder().Build(xmluri);
    
                // Create a transformer for the stylesheet.
                var compiler = processor.NewXsltCompiler();
                compiler.ErrorList = new System.Collections.Generic.List<Exception>();
    
                XsltTransformer transformer = compiler.Compile(xsluri).Load();
    
                if (compiler.ErrorList.Count != 0)
                    throw new Exception("Exception loading xsl!");
    
                // 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 results = new MemoryStream();
                serializer.SetOutputStream(results);
    
                // Transform the source XML to System.out.
                transformer.Run(serializer);
    
                //get the string
                results.Position = 0;
                return results;
    
    
            }
    
            public System.IO.Stream Transform(System.IO.Stream xmlstream, System.IO.Stream xslstream)
            {
    
                // Create a Processor instance.
                Processor processor = new Processor();
    
                // Load the source document
                var documentbuilder = processor.NewDocumentBuilder();
                documentbuilder.BaseUri = new Uri("file://c:/" );
                XdmNode input = documentbuilder.Build(xmlstream);
    
                // Create a transformer for the stylesheet.
                var compiler = processor.NewXsltCompiler();
                compiler.ErrorList = new System.Collections.Generic.List<Exception>();
                compiler.XmlResolver = new XmlUrlResolver();
                XsltTransformer transformer = compiler.Compile(xslstream).Load();
    
                if (compiler.ErrorList.Count != 0)
                    throw new Exception("Exception loading xsl!");
    
                // 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 results = new MemoryStream();
                serializer.SetOutputStream(results);
    
                // Transform the source XML to System.out.
                transformer.Run(serializer);
    
                //get the string
                results.Position = 0;
                return results;
    
    
            }
    
        }
    }
    

    <?xml version="1.0" encoding="utf-8"?>
    <iso:schema
      xmlns="http://purl.oclc.org/dsdl/schematron" 
      xmlns:iso="http://purl.oclc.org/dsdl/schematron"
      xmlns:dp="http://www.dpawson.co.uk/ns#"
      queryBinding='xslt2'
      schemaVersion='ISO19757-3'>
    
      <iso:title>Test ISO schematron file. Introduction mode</iso:title>
      <iso:ns prefix='dp' uri='http://www.dpawson.co.uk/ns#'/> 
    
      <iso:pattern>
        <iso:rule context="chapter">
    
          <iso:assert
             test="title">A chapter should have a title</iso:assert>  
        </iso:rule>
      </iso:pattern>
    
    
    </iso:schema>
    

    archivo xml

    <?xml version="1.0" encoding="utf-8" ?>
    <doc>
      <chapter id="c1">
        <title>chapter title</title>  
        <para>Chapter content</para>
      </chapter>
    
      <chapter id="c2">
        <title>chapter 2 title</title>
        <para>Content</para>           
      </chapter>
    
      <chapter id="c3">
        <title>Title</title>
        <para>Chapter 3 content</para>
      </chapter>
    </doc>
    

    resultados:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <svrl:schematron-output xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
                            xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                            xmlns:saxon="http://saxon.sf.net/"
                            xmlns:schold="http://www.ascc.net/xml/schematron"
                            xmlns:iso="http://purl.oclc.org/dsdl/schematron"
                            xmlns:xhtml="http://www.w3.org/1999/xhtml"
                            xmlns:dp="http://www.dpawson.co.uk/ns#"
                            title="Test ISO schematron file. Introduction mode"
                            schemaVersion="ISO19757-3"><!--   
               
               
             -->
       <svrl:ns-prefix-in-attribute-values uri="http://www.dpawson.co.uk/ns#" prefix="dp"/>
       <svrl:active-pattern document="file:///c:/"/>
       <svrl:fired-rule context="chapter"/>
       <svrl:fired-rule context="chapter"/>
       <svrl:fired-rule context="chapter"/>
    </svrl:schematron-output>
    

Otros consejos

Resolución:

serializer.SetOutputStream(st2);

debe ser

serializer2.SetOutputStream(st2);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top