Como posso validar documentos contra esquemas Schematron em Java?
-
05-09-2019 - |
Pergunta
Tanto quanto eu posso dizer, JAXP por padrão suporta W3C XML Schema e RelaxNG de Java 6 .
Eu posso ver algumas APIs, principalmente experimentais ou incompletos, na página de links schematron.com .
Existe uma abordagem na validação Schematron em Java que é completa, eficiente e pode ser usado com a API JAXP?
Solução
Jing pré-ISO Schematron validação (note que a implementação do Jing é baseado também em XSLT).
Há também implementações XSLT que pode muito facilmente ser invocadas de Java. Você precisa decidir qual a versão do Schematron você está interessado e, em seguida, começar a folha de estilo correspondente - todos eles devem estar disponíveis a partir schematron.com. O processo é muito simples simples, envolvendo basicamente 2 etapas:
- aplicar o XSLT esqueleto no seu esquema Schematron para obter um novo estilo XSLT que representa o esquema Schematron no XSLT
- aplicar o XSLT obtido no documento instância ou documentos para validá-los
JAXP é apenas uma API e não requerem suporte para Relax NG de uma implementação. Você precisa verificar a implementação específica que você usa para ver se que os suportes Relax NG ou não.
Outras dicas
Uma implementação Java puro Schematron está localizado na https://github.com/phax/ph-schematron / Traz suporte para a abordagem XSLT e a abordagem Java puro.
Você pode conferir SchematronAssert (divulgação: meu código). Ele é destinado principalmente para testes de unidade, mas você pode usá-lo para código normal também. Ele é implementado usando XSLT.
Unidade exemplo testes:
ValidationOutput result = in(booksDocument)
.forEvery("book")
.check("author")
.validate();
assertThat(result).hasNoErrors();
Standalone exemplo de validação:
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);
Trabalhar com uma representação de objeto de SVRL:
ValidationOutput output = validator.validate(xmlSource, schemaSource);
// look at the output
output.getFailures() ...
output.getReports() ...