Sha256: 66e2e39926501dd2836e04cb39f36ceaac4afe973bc5b0f47e4a32c3310b92ef
Contents?: true
Size: 1.92 KB
Versions: 4
Compression:
Stored size: 1.92 KB
Contents
require 'libxml' require 'libxslt' module Schematron include LibXML include LibXSLT # The location of the ISO schematron implemtation lives ISO_IMPL_DIR = File.join File.dirname(__FILE__), "..", 'iso_impl' # The file names of the compilation stages ISO_FILES = [ 'iso_dsdl_include.xsl', 'iso_abstract_expand.xsl', 'iso_svrl.xsl' ] # Namespace prefix declarations for use in XPaths NS_PREFIXES = { 'svrl' => 'http://purl.oclc.org/dsdl/svrl' } class Schema def initialize(doc) schema_doc = doc xforms = ISO_FILES.map do |file| Dir.chdir(ISO_IMPL_DIR) do doc = XML::Document.file file LibXSLT::XSLT::Stylesheet.new doc end end # Compile schematron into xsl that maps to svrl validator_doc = xforms.inject(schema_doc) { |xml, xsl| xsl.apply xml } @validator_xsl = LibXSLT::XSLT::Stylesheet.new validator_doc end def validate(instance_doc) # Validate the xml results_doc = @validator_xsl.apply instance_doc # compile the errors and log any messages rule_hits(results_doc, instance_doc, 'assert', '//svrl:failed-assert') + rule_hits(results_doc, instance_doc, 'report', '//svrl:successful-report') end # Look for reported or failed rules of a particular type in the instance doc def rule_hits(results_doc, instance_doc, rule_type, xpath) results = [] results_doc.root.find(xpath, NS_PREFIXES).each do |hit| context = instance_doc.root.find_first hit['location'] hit.find('svrl:text/text()', NS_PREFIXES).each do |message| results << { :rule_type => rule_type, :type => context.node_type_name, :name => context.name, :line => context.line_num, :message => message.content.strip } end end results end end end
Version data entries
4 entries across 4 versions & 2 rubygems
Version | Path |
---|---|
flazz-schematron-0.1.0 | lib/schematron.rb |
schematron-0.1.2 | lib/schematron.rb |
schematron-0.1.1 | lib/schematron.rb |
schematron-0.1.0 | lib/schematron.rb |