Come posso convalidare i documenti rispetto agli schemi Schematron in Java?
-
05-09-2019 - |
Domanda
Per quanto posso dire, JAXP supporta per impostazione predefinita lo schema XML W3C e RelaxNG da Java 6.
Posso vedere alcune API, per lo più sperimentali o incomplete, sul file Pagina dei collegamenti su schematron.com.
Esiste un approccio alla convalida dello schematron in Java che sia completo, efficiente e possa essere utilizzato con l'API JAXP?
Soluzione
Jing supporti pre-ISO Schematron convalida (si noti che l'attuazione di Jing si basa anche su XSLT).
Ci sono anche implementazioni XSLT che possono essere facilmente richiamate da Java. È necessario decidere quale versione di Schematron che ti interessa e quindi ottenere il relativo foglio di stile - tutti dovrebbero essere disponibili da schematron.com. Il processo è molto semplice semplice, coinvolgendo fondamentalmente 2 passi:
- applicare il XSLT scheletro su schema Schematron per ottenere un nuovo foglio di stile XSLT che rappresenta lo schema Schematron in XSLT
- applicare il XSLT ottenuto sul documento istanza o documenti per convalidare loro
JAXP è solo un'API e non richiede il supporto per Relax NG da un'implementazione. È necessario controllare l'attuazione specifica che si utilizza per vedere se questo supporta Relax NG o meno.
Altri suggerimenti
Un'implementazione Java puro Schematron si trova a https://github.com/phax/ph-schematron / Essa porta supporto sia per l'approccio XSLT e l'approccio puro Java.
Puoi controllare SchematronAssert (divulgazione:il mio codice).È pensato principalmente per i test unitari, ma puoi usarlo anche per il codice normale.È implementato utilizzando XSLT.
Esempio di test unitario:
ValidationOutput result = in(booksDocument)
.forEvery("book")
.check("author")
.validate();
assertThat(result).hasNoErrors();
Esempio di convalida autonoma:
StreamSource schemaSource = new StreamSource(... your schematron schema ...);
StreamSource xmlSource = new StreamSource(... your xml document ... );
StreamResult output = ... here your SVRL will be saved ...
// validation
validator.validate(xmlSource, schemaSource, output);
Lavora con una rappresentazione di oggetto di SVRL:
ValidationOutput output = validator.validate(xmlSource, schemaSource);
// look at the output
output.getFailures() ...
output.getReports() ...