();
+ headers.put(Constants.VALIDATION_STATUS, status);
+ headers.put(Constants.VALIDATION_REPORT, report);
+ exchange.getOut().setHeader(Constants.VALIDATION_REPORT, report);
+ if (exchange.getPattern().isOutCapable()) {
+ exchange.getOut().setHeaders(exchange.getIn().getHeaders());
+ exchange.getOut().getHeaders().putAll(headers);
+ } else {
+ exchange.getIn().getHeaders().putAll(headers);
+ }
+ }
+
+ /**
+ * Get validation status, SUCCESS or FAILURE
+ *
+ * @param report
+ * @return
+ */
+ private String getValidationStatus(final String report) {
+
+ String status = report.contains(Constants.FAILED_ASSERT) ? Constants.FAILED : Constants.SUCCESS;
+ if (this.endpoint.isAbort() && Constants.FAILED.equals(status)) {
+ throw new SchematronValidationException("Schematron validation failure \n" + report);
+ }
+ return status;
+ }
+
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/constant/Constants.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/constant/Constants.java
new file mode 100644
index 0000000000000..bd3f07ae1c20c
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/constant/Constants.java
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.constant;
+
+/**
+ * Utility class defining all constants needed for the schematron component.
+ *
+ */
+public final class Constants {
+
+ public static final String VALIDATION_STATUS = "CamelSchematronValidationStatus";
+ public static final String VALIDATION_REPORT = "CamelSchematronValidationReport";
+ public static final String HTTP_PURL_OCLC_ORG_DSDL_SVRL = "http://purl.oclc.org/dsdl/svrl";
+ public static final String FAILED_ASSERT = "failed-assert";
+ public static final String FAILED = "FAILED";
+ public static final String SUCCESS = "SUCCESS";
+ public static final String SCHEMATRON_TEMPLATES_ROOT_DIR = "iso-schematron-xslt2";
+
+ private Constants() {
+ throw new IllegalStateException("Utility class should not be instantiated");
+ }
+
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronConfigException.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronConfigException.java
new file mode 100644
index 0000000000000..f94621be3b33e
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronConfigException.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.exception;
+
+import org.apache.camel.RuntimeCamelException;
+
+/**
+ * Schematron configuration Exception.
+ */
+public class SchematronConfigException extends RuntimeCamelException {
+ public SchematronConfigException(Throwable e) {
+ super(e);
+ }
+
+ public SchematronConfigException(String message) {
+ super(message);
+ }
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronValidationException.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronValidationException.java
new file mode 100644
index 0000000000000..d8554d79c5066
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/exception/SchematronValidationException.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.exception;
+
+import org.apache.camel.RuntimeCamelException;
+
+/**
+ * SchematronValidationException is thrown if option is set to true.
+ */
+public class SchematronValidationException extends RuntimeCamelException {
+
+
+ public SchematronValidationException(final String message, Throwable e) {
+ super(message, e);
+ }
+
+ public SchematronValidationException(String message) {
+ super(message);
+ }
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/ClassPathURIResolver.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/ClassPathURIResolver.java
new file mode 100644
index 0000000000000..db506f7bbcb20
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/ClassPathURIResolver.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+import java.io.File;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamSource;
+
+
+/**
+ * Class path resolver for schematron templates
+ *
+ */
+public class ClassPathURIResolver implements URIResolver {
+
+ private String rulesDir;
+
+ /**
+ * Constructor setter for rules directory path.
+ * @param rulesDir
+ */
+ public ClassPathURIResolver(final String rulesDir) {
+ this.rulesDir = rulesDir;
+ }
+
+ @Override
+ public Source resolve(String href, String base) throws TransformerException {
+ return new StreamSource(ClassLoader.getSystemResourceAsStream(rulesDir.concat(File.separator).concat(href)));
+ }
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java
new file mode 100644
index 0000000000000..8ba23ea122d44
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+import java.io.StringWriter;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.camel.component.schematron.exception.SchematronValidationException;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+
+
+
+/**
+ * The schematoron Engine. Validates an XML for given scheamtron rules using an XSLT implementation of the Schematron
+ * Engine.
+ *
+ */
+public class SchematronProcessor {
+
+ private Logger logger = LoggerFactory.getLogger(SchematronProcessor.class);
+ private XMLReader reader;
+ private Templates templates;
+
+ /**
+ * Constructor setting the XSLT schematron templates.
+ *
+ * @param reader
+ * @param templates
+ */
+ public SchematronProcessor(XMLReader reader, Templates templates) {
+
+ this.reader = reader;
+ this.templates = templates;
+ }
+
+ /**
+ * Validates the given XML for given Rules.
+ *
+ * @param xml
+ * @return
+ */
+ public String validate(final String xml) {
+
+ try {
+ final Source source = new SAXSource(reader, new InputSource(IOUtils.toInputStream(xml)));
+ final StringWriter writer = new StringWriter();
+ templates.newTransformer().transform(source, new StreamResult(writer));
+ return writer.toString();
+ } catch (TransformerException e) {
+ logger.error(e.getMessage());
+ throw new SchematronValidationException("Failed to apply Schematron validation transform", e);
+ }
+ }
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessorFactory.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessorFactory.java
new file mode 100644
index 0000000000000..9e69b1b1ee8f3
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessorFactory.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+
+
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Templates;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.apache.camel.component.schematron.exception.SchematronConfigException;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Schematron Engine Factory
+ *
+ */
+public final class SchematronProcessorFactory {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SchematronProcessorFactory.class);
+
+ /**
+ * Private constructor.
+ */
+ private SchematronProcessorFactory() {
+ throw new IllegalStateException();
+ }
+
+ /**
+ * Creates an instance of SchematronEngine
+ *
+ * @param rules the given schematron rules
+ * @return an instance of SchematronEngine
+ */
+ public static SchematronProcessor newScehamtronEngine(final Templates rules) {
+ try {
+ return new SchematronProcessor(getXMLReader(), rules);
+ } catch (Exception e) {
+ LOG.error("Failed to parse the configuration file");
+ throw new SchematronConfigException(e);
+ }
+ }
+
+ /**
+ * Gets XMLReader.
+ *
+ * @return instance of XMLReader
+ * @throws ParserConfigurationException
+ * @throws SAXException
+ */
+ private static XMLReader getXMLReader() throws ParserConfigurationException, SAXException {
+ final SAXParserFactory fac = SAXParserFactory.newInstance();
+ fac.setValidating(false);
+ final SAXParser parser = fac.newSAXParser();
+ XMLReader reader = parser.getXMLReader();
+ return reader;
+ }
+
+
+}
diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/TemplatesFactory.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/TemplatesFactory.java
new file mode 100644
index 0000000000000..b461c3b74b644
--- /dev/null
+++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/TemplatesFactory.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+import org.apache.camel.component.schematron.constant.Constants;
+import org.apache.camel.component.schematron.exception.SchematronConfigException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamSource;
+import java.io.File;
+import java.io.InputStream;
+
+/**
+ * Class generating Templates for a given schematron rules
+ */
+public final class TemplatesFactory {
+
+ private static final String LINE_NUMBERING = "http://saxon.sf.net/feature/linenumbering";
+ private static final TemplatesFactory INSTANCE = new TemplatesFactory();
+ private static final String[] PIPELINE = new String[]{"iso_dsdl_include.xsl", "iso_abstract_expand.xsl", "iso_svrl_for_xslt2.xsl"};
+ private Logger logger = LoggerFactory.getLogger(TemplatesFactory.class);
+
+ /**
+ * Singleton constructor;
+ *
+ * @return
+ */
+ public static TemplatesFactory newInstance() {
+
+ return INSTANCE;
+ }
+
+ /**
+ * Returns an instance of compiled schematron templates.
+ *
+ * @return
+ */
+ public Templates newTemplates(final InputStream rules) {
+
+ TransformerFactory fac = TransformerFactory.newInstance();
+ fac.setURIResolver(new ClassPathURIResolver(Constants.SCHEMATRON_TEMPLATES_ROOT_DIR));
+ fac.setAttribute(LINE_NUMBERING, true);
+ return getTemplates(rules, fac);
+ }
+
+ /**
+ * Generate the schematron template for given rule.
+ *
+ * @param rules the schematron rules
+ * @param fac the transformer factory.
+ * @return schematron template.
+ */
+ private Templates getTemplates(InputStream rules, TransformerFactory fac) {
+
+ Node node = null;
+ Source source = new StreamSource(rules);
+ try {
+ for (String template : PIPELINE) {
+ Source xsl = new StreamSource(ClassLoader.getSystemResourceAsStream(Constants.SCHEMATRON_TEMPLATES_ROOT_DIR
+ .concat(File.separator).concat(template)));
+ Transformer t = fac.newTransformer(xsl);
+ DOMResult result = new DOMResult();
+ t.transform(source, result);
+ source = new DOMSource(node = result.getNode());
+ }
+ return fac.newTemplates(new DOMSource(node));
+ } catch (Exception e) {
+ logger.error(e.getMessage(), e);
+ throw new SchematronConfigException(e);
+ }
+ }
+}
diff --git a/components/camel-schematron/src/main/resources/META-INF/services/org/apache/camel/component/schematron b/components/camel-schematron/src/main/resources/META-INF/services/org/apache/camel/component/schematron
new file mode 100644
index 0000000000000..5f2af4c85c5af
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/META-INF/services/org/apache/camel/component/schematron
@@ -0,0 +1,18 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class=org.apache.camel.component.schematron.SchematronComponent
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromRNG-2.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromRNG-2.xsl
new file mode 100644
index 0000000000000..38d2d8e4e3784
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromRNG-2.xsl
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromXSD-2.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromXSD-2.xsl
new file mode 100644
index 0000000000000..7d1cbfbc7dc52
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/ExtractSchFromXSD-2.xsl
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_abstract_expand.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_abstract_expand.xsl
new file mode 100644
index 0000000000000..f2f1667120aa2
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_abstract_expand.xsl
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suppressed abstract pattern was here
+
+
+
+
+
+
+ Start pattern based on abstract
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_dsdl_include.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_dsdl_include.xsl
new file mode 100644
index 0000000000000..d58f191f4e21c
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_dsdl_include.xsl
@@ -0,0 +1,1508 @@
+
+
+
+
+
+
+
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in RELAX NG extRef
+ include
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in Schematron include
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+ Schema error: Use include to
+ include fragments, not a whole
+ schema
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+ Schema error: Use include to include
+ fragments, not a whole schema
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in Schematron include
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in Schematron include
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+ Schema error: Use include to include
+ fragments, not a whole schema
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+ Schema error: Use include to include
+ fragments, not a whole schema
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in DTLL include
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in CRDL include
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fatal error: Xinclude href contains fragment
+ identifier #
+
+
+
+
+
+
+ Fatal error: Sorry, this software only
+ supports simple ids in XInclude xpointers
+
+
+
+
+
+
+ Fatal Error: Impossible URL in XInclude
+ include
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file and fallback
+ file:
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Error: Impossible URL in XLink embedding
+ link
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unable to open referenced included file:
+
+
+
+
+
+
+ Unable to locate id attribute:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ XPath error. No XPath.
+ XPath error. Missing location step. Suggestion: remove '/' before '['.
+
+
+ XPath syntax error. Unclosed parenthesis. Suggestion: add ')'.
+
+ XPath syntax error. Extra close parenthesis. Suggestion: remove ')'.
+
+
+ XPath syntax error. Unclosed left square bracket. Suggestion: add ']'.
+
+ XPath syntax error. Extra right square bracket. Suggestion: remove ']'.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_message_xslt2.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_message_xslt2.xsl
new file mode 100644
index 0000000000000..36082cc4d1910
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_message_xslt2.xsl
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (
+ /
+ )
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_skeleton_for_saxon.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_skeleton_for_saxon.xsl
new file mode 100644
index 0000000000000..af0c843fdec09
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_schematron_skeleton_for_saxon.xsl
@@ -0,0 +1,2299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #ALL
+
+
+
+false
+
+true
+
+
+
+
+ true
+ false
+
+
+
+
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+ @*|
+
+ *
+ node()
+ *|comment()|processing-instruction()
+
+
+
+
+
+
+
+
+
+
+false
+
+
+default
+
+
+1
+
+false
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ This XSLT was automatically generated from a Schematron schema.
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+ 2.0
+
+
+
+
+
+
+
+
+
+ 3a
+
+ 3b
+
+
+
+
+ Implementers: please note that overriding process-prolog or process-root is
+ the preferred method for meta-stylesheets to use where possible.
+
+
+
+
+
+
+
+
+
+
+
+
PHASES
+
+
PROLOG
+
+
XSD TYPES FOR XSLT2
+
+
KEYS AND FUNCTIONS
+
+
DEFAULT RULES
+
+
SCHEMA SETUP
+
+
SCHEMATRON PATTERNS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4a
+
+ 4b
+
+
+
+
+
+
+ MODE: SCHEMATRON-SELECT-FULL-PATH
+ This mode can be used to generate an ugly though full XPath for locators
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MODE: SCHEMATRON-FULL-PATH
+ This mode can be used to generate an ugly though full XPath for locators
+
+
+
+
+
+ /
+
+
+
+ *:
+
+ [namespace-uri()='
+
+ ']
+
+
+
+ [
+
+ ]
+
+
+
+
+
+ /
+
+
+
+
+
+ []
+
+
+
+ *[local-name()='
+
+ ']
+
+
+ []
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+ @
+
+ @*[local-name()='
+
+ ' and namespace-uri()='
+
+ ']
+
+
+
+
+
+
+ /
+
+ @
+
+ @*[local-name()='
+
+ ' and namespace-uri()='
+
+ ']
+
+
+
+
+
+
+
+
+
+ MODE: SCHEMATRON-FULL-PATH-2
+
+ This mode can be used to generate prefixed XPath for humans
+
+
+
+
+
+ /
+
+
+ [
+
+ ]
+
+
+
+
+ /@
+
+
+
+
+ MODE: SCHEMATRON-FULL-PATH-3
+
+
+ This mode can be used to generate prefixed XPath for humans
+ (Top-level element has index)
+
+
+
+
+
+ /
+
+
+ [
+
+ ]
+
+
+
+
+ /@
+
+
+
+
+ MODE: GENERATE-ID-FROM-PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+ MODE: GENERATE-ID-2
+
+
+ U
+
+
+ U
+
+
+
+
+ U.
+
+ n
+
+
+
+
+ U.
+
+ _
+
+ _
+
+
+
+
+ Strip characters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+ 6a
+
+ 6b
+
+
+
+
+
+
+
+ 7
+
+
+ ASSERT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+ REPORT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+ 11a
+
+ 11b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+ 20a
+
+ 20b
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+ 20a
+
+ 20b
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+ 24
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 26
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ //(
+
+ (
+
+ )
+ |
+
+ )
+ [not(self::text())]
+
+
+
+
+
+
+
+
+ //(
+
+ (
+
+ )
+ |
+
+ )
+ [not(self::text())]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+ PATTERN
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+ No property found with that ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+ RULE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 31
+
+
+ 32
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 35a
+
+ 35b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36a
+
+ 36b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36a
+
+ 36b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 37a
+
+ 37b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 38a
+
+ 38b
+
+
+
+
+
+
+
+
+
+
+
+ 39a
+
+ 39b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TERMINATING
+
+
+ TERMINATING
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TERMINATING
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ title
+
+
+
+
+
+
+ schema-title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Schema error: Schematron elements in old and new namespaces found
+ Schema error: in the queryBinding attribute, use 'xslt'
+ Fail: This implementation of ISO Schematron does not work with schemas using the query language
+
+ Phase Error: no phase has been defined with name
+
+ Markup Error: no pattern attribute in <active>
+ Reference Error: the pattern "
+ " has been activated but is not declared
+ Markup Error: no test attribute in <assert
+ Markup Error: no test attribute in <report>
+ Markup Error: no id attribute in <diagnostic>
+ Markup Error: no rule attribute in <extends>
+ Reference Error: the abstract rule "
+ " has been referenced but is not declared
+ Markup Error: no name attribute in <key>
+ Markup Error: no path or use attribute in <key>
+ Markup Error: no path or use attribute in <key>
+ Schema error: The key element is not in the ISO Schematron namespace. Use the XSLT namespace.
+ Markup Error: no name attribute in <function>
+ Schema error: The function element is not in the ISO Schematron namespace. Use the XSLT namespace.
+ Schema error: Empty href= attribute for include directive.
+ Error: Impossible URL in Schematron include
+ Unable to open referenced included file:
+
+ Schema error: Use include to include fragments, not a whole schema
+ Schema error: XSD schemas may only be imported if you are using the 'xslt2' query language binding
+ Schema error: The import-schema element is not available in the ISO Schematron namespace. Use the XSLT namespace.
+ Warning: Variables should not be used with the "xpath" query language binding.
+ Warning: Variables should not be used with the "xpath2" query language binding.
+ Markup Error: no uri attribute in <ns>
+ Markup Error: no prefix attribute in <ns>
+ Schema implementation error: This schema has abstract patterns, yet they are supposed to be preprocessed out already
+ Markup Error: no id attribute in <phase>
+ Markup Error: no context attribute in <rule>
+ Markup Error: no id attribute on abstract <rule>
+ Markup Error: (2) context attribute on abstract <rule>
+ Markup Error: context attribute on abstract <rule>
+ Markup Error: no select attribute in <value-of>
+ Warning:
+ must not contain any child elements
+ Reference error: A diagnostic "
+ " has been referenced but is not declared
+ Using the XSLT namespace with a prefix other than "xsl" in Schematron rules is not supported in this processor:
+
+ Error: unrecognized element in ISO Schematron namespace: check spelling and capitalization
+
+ Warning: unrecognized element
+
+
+
+
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_svrl_for_xslt2.xsl b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_svrl_for_xslt2.xsl
new file mode 100644
index 0000000000000..2e8d8da68cf8b
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/iso_svrl_for_xslt2.xsl
@@ -0,0 +1,684 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+true
+true
+
+
+
+
+
+
+
+
+
+
+ #ALL
+
+
+false
+true
+true
+
+
+
+
+false
+
+
+default
+
+
+
+
+1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xslt1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TERMINATING
+
+
+ TERMINATING
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TERMINATING
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/readme.txt b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/readme.txt
new file mode 100644
index 0000000000000..5ce57c9eca254
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/readme.txt
@@ -0,0 +1,100 @@
+ISO SCHEMATRON 2010
+
+XSLT implementation by Rick Jelliffe with assistance from members of Schematron-love-in maillist.
+
+2010-04-14
+
+Two distributions are available. One is for XSLT1 engines.
+The other is for XSLT2 engines, such as SAXON 9.
+
+
+This version of Schematron splits the process into a pipeline of several different XSLT stages.
+
+1) First, preprocess your Schematron schema with iso_dsdl_include.xsl.
+This is a macro processor to assemble the schema from various parts.
+If your schema is not in separate parts, you can skip this stage.
+
+2) Second, preprocess the output from stage 1 with iso_abstract_expand.xsl.
+This is a macro processor to convert abstract patterns to real patterns.
+If your schema does not use abstract patterns, you can skip this
+stage.
+
+3) Third, compile the Schematron schema into an XSLT script.
+This will typically use iso_svrl_for_xslt1.xsl or iso_svrl_for_xslt2.xsl
+(which in turn invoke iso_schematron_skeleton_for_xslt1.xsl or iso_schematron_skeleton_for_saxon.xsl)
+However, other "meta-styleseets" are also in common use; the principle of operation is the same.
+If your schema uses Schematron phases, supply these as command line/invocation parameters
+to this process.
+
+4) Fourth, run the script generated by stage 3 against the document being validated.
+If you are using the SVRL script, then the output of validation will be an XML document.
+If your schema uses Schematron parameters, supply these as command line/invocation parameters
+to this process.
+
+
+The XSLT2 distribution also features several next generation features,
+such as validating multiple documents. See the source code for details.
+
+Schematron assertions can be written in any language, of course; the file
+sch-messages-en.xhtml contains the diagnostics messages from the XSLT2 skeleton
+in English, and this can be used as template to localize the skeleton's
+error messages. Note that typically programming errors in Schematron are XPath
+errors, which requires localized messages from the XSLT engine.
+
+ANT
+---
+To give an example of how to process a document, here is a sample ANT task.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+EXTRACTION SCHEMATRON FROM XSD OR RELAX NG
+
+The following files allow extracting of embedded schematron patterns
+in XML Schemas or RELAX NG schemas. For details, see the at
+ article http://www.topologi.com/resources/schtrn_xsd_paper.html
+
+The following files are provided:
+ ExtractSchFromRNG.xsl Generate a Schematron schema from patterns
+ embedded in a RELAX NG schema. The schema uses XSLT1.
+ ExtractSchFromXSD.xsl Generate a Schematron schema from patterns
+ embedded in a W3C XML Schemas schema. The schema uses XSLT1.
+
+ ExtractSchFromRNG-2.xsl Generate a Schematron schema from patterns
+ embedded in a RELAX NG schema. The schema uses XSLT2.
+ ExtractSchFromXSD-2.xsl Generate a Schematron schema from patterns
+ embedded in a W3C XML Schemas schema. The schema uses XSLT2.
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-cs.xhtml b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-cs.xhtml
new file mode 100644
index 0000000000000..93e181c8b9a59
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-cs.xhtml
@@ -0,0 +1,56 @@
+
+
+ Chyba ve schématu: nalezeny elementy Schematronu ve starém i novém jmenném prostoru
+ Chyba ve schématu: v atributu queryBinding použijte 'xslt'
+ Porucha: Tato implementace ISO Schematronu nefunguje se schématy, která používají dotazovací jazyk
+
+ Fázová chyba: fáze jménem
+ není definována.
+ Chybný markup: v elementu <active> chybí atribut pattern
+ Chybný odkaz: vzor "
+ " byl aktivován, ne však deklarován
+ Chybný markup: v elementu <assert> chybí atribut test
+ Chybný markup: v elementu <report> chybí atribut test
+ Chybný markup: v elementu <diagnostic> chybí atribut id
+ Chybný markup: v elementu <extends> chybí atribut rule
+ Chybný odkaz: abstraktní pravidlo "
+ " není definováno, ačkoli se na ně odkazuje
+ Chybný markup: v elementu <key> chybí atribut name
+ Chybný markup: v elementu <key> chybí atribut path nebo use
+ Chybný markup: v elementu <key> chybí atribut path nebo use
+ Chyba ve schématu: element <key> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.
+ Chybný markup: v elementu <function> chybí atribut name
+ Chyba ve schématu: element <function> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.
+ Chyba ve schématu: direktiva <include> má prázdný atribut href
+ Chyba: Nesprávné URL v direktivě <include>
+ Chyba: Nelze otevřít vkládaný soubor
+
+ Chyba ve schématu: <include> používejte ke vkládání fragmentů, ne celého schématu
+ Chyba ve schématu: Schémata XSD lze importovat pouze pokud používáte dotazovací jazyk "xslt2"
+ Chyba ve schématu: element <import-schema> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.
+ Varování: S dotazovacím jazykem "xpath" by se neměly používat proměnné
+ Varování: S dotazovacím jazykem "xpath2" by se neměly používat proměnné
+ Chybný markup: v elementu <ns> chybí atribut uri
+ Chybný markup: v elementu <ns> chybí atribut prefix
+ Chyba v implementaci schématu: toto schéma obsahuje abstraktní vzory, které však již měly být předchozím zpracováním odstraněny
+ Chybný markup: v elementu <phase> chybí atribut id
+ Chybný markup: v elementu <rule> chybí atribut context
+ Chybný markup: v abstraktním pravidlu chybí atribut id
+ Chybný markup: (2) Abstraktní pravidlo nesmí mít atribut context
+ Chybný markup: Abstraktní pravidlo nesmí mít atribut context
+ Chybný markup: v elementu <value-of> chybí atribut select
+ Varování:
+ nesmí obsahovat žádné podelementy
+ Chybný odkaz: Diagnostika "
+ " nebyla deklarována, ačkoli se na ni odkazuje
+ Chyba: procesor
+ nepodporuje použití jmenného prostoru XSLT s jiným prefixem než "xsl"
+ Chyba: neznámý element
+ ve jmenném prostoru ISO Schematronu: zkontrolujte, je-li správně zapsán
+ Varování: neznámý element
+
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-de.xhtml b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-de.xhtml
new file mode 100644
index 0000000000000..51caeb107f3b0
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-de.xhtml
@@ -0,0 +1,57 @@
+
+
+
+ Fehler im Schema: Schematron Elemente sowohl im alten als auch neuen Namensraum gefunden
+ Fehler im Schema: Nutzen Sie 'xslt' im queryBinding-Attribut
+ Fehler: Diese Implementierung von ISO Schematron arbeitet nicht mit Schemas zusammen, die die Query Language
+ nutzen
+ Phasenfehler: Es gibt keine Phase mit Namen
+
+ Fehler in der Annotation: Kein Attribut pattern in <active>
+ Referenzierungsfehler: Der Ausdruck "
+ " wurde aktiviert, ist aber nicht deklariert
+ Fehler in der Annotation: Kein Attribut test in <assert
+ Fehler in der Annotation: Kein Attribut test <report>
+ Fehler in der Annotation: Kein Attribut id in <diagnostic>
+ Fehler in der Annotation: Kein Attribut rule in <extends>
+ Referenzierungsfehler: Die abstrakte Regel "
+ " wurde referenziert, ist aber nicht deklariert
+ Fehler in der Annotation: Kein Attribut name in <key>
+ Fehler in der Annotation: Kein Attribut path oder use in <key>
+ Fehler in der Annotation: Kein Attribut path oder use in <key>
+ Fehler im Schema: Das Element key ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.
+ Fehler in der Annotation: Kein Attribut name in <function>
+ Fehler im Schema: Das Element function ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.
+ Fehler im Schema: Leeres Attribut href= für include Anweisung.
+ Fehler: Ungültige URL in Schematron include
+ Kann die referenzierte Datei nicht öffnen:
+
+ Fehler im Schema: include darf nur zur Einbettung von Schemafragmenten genutzt werden, nicht für ganze Schemata
+ Fehler im Schema: XSD Schemata dürfen nur importiert werden, wenn das 'xslt2' Query Language Binding genutzt wird
+ Fehler im Schema: Das Element import-schema ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.
+ Warnung: Variablen sollten nicht zusammen mit dem "xpath" Query Language Binding genutzt werden.
+ Warnung: Variablen sollten nicht zusammen mit dem "xpath2" Query Language Binding genutzt werden.
+ Fehler in der Annotation: Fehlendes Attiribut uri in <ns>
+ Fehler in der Annotation: Fehlendes Attribut prefix in <ns>
+ Fehler bei der Schemaimplementierung: Dieses Schema enthält abstrakte Mustervergleiche, die bereits vorverarbeitet sein sollten.
+ Fehler in der Annotation: Fehlendes Attiribut id in <phase>
+ Fehler in der Annotation: Fehlendes Attiribut context in <rule>
+ Fehler in der Annotation: Fehlendes Attiribut id on abstract <rule>
+ Fehler in der Annotation: (2) context attribute on abstract <rule>
+ Fehler in der Annotation: Attribut context bei abstrakter <rule>
+ Fehler in der Annotation: Fehlendes Attiribut select in <value-of>
+ Warnung:
+ darf keine Kindelemente beinhalten
+ Referenzierungsfehler: Ein diagnostic-Element "
+ " wurde referenziert, ist aber nicht deklariert
+ Der Gebrauch des XSLT-Namensraums mit einem anderen Präfix als "xsl" in Schematron-Regeln wird von diesem Prozessor nicht unterstützt:
+
+ Fehler: Unbekanntes Element im ISO Schematron-Namensraum: Überprüfen Sie die Schreibweise (inkl. Groß- und Kleinschreibung)
+
+ Warnung: Unbekanntes Element
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-en.xhtml b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-en.xhtml
new file mode 100644
index 0000000000000..6f777ed2b5646
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-en.xhtml
@@ -0,0 +1,57 @@
+
+
+
+ Schema error: Schematron elements in old and new namespaces found
+ Schema error: in the queryBinding attribute, use 'xslt'
+ Fail: This implementation of ISO Schematron does not work with schemas using the query language
+
+ Phase Error: no phase has been defined with name
+
+ Markup Error: no pattern attribute in <active>
+ Reference Error: the pattern "
+ " has been activated but is not declared
+ Markup Error: no test attribute in <assert>
+ Markup Error: no test attribute in <report>
+ Markup Error: no id attribute in <diagnostic>
+ Markup Error: no rule attribute in <extends>
+ Reference Error: the abstract rule "
+ " has been referenced but is not declared
+ Markup Error: no name attribute in <key>
+ Markup Error: no path or use attribute in <key>
+ Markup Error: no path or use attribute in <key>
+ Schema error: The <key> element is not in the ISO Schematron namespace. Use the XSLT namespace.
+ Markup Error: no name attribute in <function>
+ Schema error: The <function> element is not in the ISO Schematron namespace. Use the XSLT namespace.
+ Schema error: Empty href attribute for <include> directive.
+ Error: Impossible URL in Schematron <include>
+ Error: Unable to open referenced included file:
+
+ Schema error: Use <include> to include fragments, not a whole schema
+ Schema error: XSD schemas may only be imported if you are using the 'xslt2' query language binding
+ Schema error: The <import-schema> element is not available in the ISO Schematron namespace. Use the XSLT namespace.
+ Warning: Variables should not be used with the "xpath" query language binding.
+ Warning: Variables should not be used with the "xpath2" query language binding.
+ Markup Error: no uri attribute in <ns>
+ Markup Error: no prefix attribute in <ns>
+ Schema implementation error: This schema has abstract patterns, yet they are supposed to be preprocessed out already
+ Markup Error: no id attribute in <phase>
+ Markup Error: no context attribute in <rule>
+ Markup Error: no id attribute on abstract <rule>
+ Markup Error: (2) context attribute on abstract <rule>
+ Markup Error: context attribute on abstract <rule>
+ Markup Error: no select attribute in <value-of>
+ Warning:
+ must not contain any child elements
+ Reference error: A diagnostic "
+ " has been referenced but is not declared
+ Warning: Using the XSLT namespace with a prefix other than "xsl" in Schematron rules is not supported in this processor:
+
+ Error: unrecognized element in ISO Schematron namespace: check spelling and capitalization
+
+ Warning: unrecognized element
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-fr.xhtml b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-fr.xhtml
new file mode 100644
index 0000000000000..a797db7bf372c
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-fr.xhtml
@@ -0,0 +1,54 @@
+
+
+ Erreur de schema: éléments Schematron à la fois dans l'ancien et le nouveau namespace
+ Erreur de schema: utilisez 'xslt' dans l'attribut queryBinding
+ Échec: Cette implémentation de Schematron ISO ne fonctionne pas avec des schemas utilisant le langage de query
+
+ Erreur de phase: aucune phase n'a été définie avec le nom
+
+ Erreur de balisage: pas d'attribut pattern dans <active>
+ Erreur de référence: le pattern "
+ " a été activé mais n'a pas été décalaré
+ Erreur de balisage: pas d'attribut test dans <assert>
+ Erreur de balisage: pas d'attribut test dans <report>
+ Erreur de balisage: pas d'attribut id dans <diagnostic>
+ Erreur de balisage: pas d'attribut rule dans <extends>
+ Erreur de référence: la règle abstraite "
+ " a été référencée mais pas déclarée
+ Erreur de balisage: pas d'attribut name dans <key>
+ Erreur de balisage: pas d'attribut path ou use dans <key>
+ Erreur de schema: L'élément key n'est pas dans le namespace Schematron ISO. Utilisez le namespace XSLT.
+ Erreur de balisage: pas d'attribut name dans <function>
+ Erreur de schema: L'élément function n'est pas dans le namespace Schematron ISO. Utilisez le namespace XSLT.
+ Erreur de schema: Attribut href vide sur a directive include.
+ Erreur: URL impossible dans la directive include de Schematron
+ Impossible d'ouvrir le fichier référencé pour l'inclusion:
+
+ Erreur de schema: Utilisez include pour inclure des fragments et non un schema entier
+ Erreur de schema: Les schema XSD peuvent être importés seulement si vous utilisez the langage de query 'xslt2'
+ Erreur de schema: L'élément import-schema n'est pas disponible dans le namespace Schematron ISO. Utilisez le namespace XSLT.
+ Avertissement: Des variables ne devraient pas être utiliées avec le langage de query "xpath".
+ Avertissement: Des variables ne devraient pas être utiliées avec le langage de query "xpath2".
+ Erreur de balisage: pas d'attribut uri dans <ns>
+ Erreur de balisage: pas d'attribut prefix dans <ns>
+ Erreur d'implémentation de schema: Ce schema des patterns abstraits, bien qu'ils sont supposés avoir été préprocessés précédemment
+ Erreur de balisage: pas d'attribut id dans <phase>
+ Erreur de balisage: pas d'attribut context dans <rule>
+ Erreur de balisage: pas d'attribut id dans <rule>
+ Erreur de balisage: (2) attribut context dans une <rule> abstraite
+ Erreur de balisage: attribut context dans une <rule> abstraite
+ Erreur de balisage: pas d'attribut select dans <value-of>
+ Avertissement:
+ ne peut contenir aucun élément enfant
+ Erreur de référence: Un diagnostique "
+ " a été référencé mais n'est pas déclaré
+ Utiliser the namespace XSLT avec un autre préfixe que "xsl" dans les rules Schematron n'est pas supporté par ce processor:
+
+ Erreur: élément inconnu dans le namespace Schematron ISO: vérifiez l'orthographe et la casse
+
+ Avertissement: élément inconnu
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-nl.xhtml b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-nl.xhtml
new file mode 100644
index 0000000000000..5f055771c2941
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/sch-messages-nl.xhtml
@@ -0,0 +1,58 @@
+
+
+ Schema fout: er werden Schematron elementen uit de oude en nieuwe
+ namespace gevonden
+ Schema fout: gebruik 'xslt' in het queryBinding attribute
+ Faling: Deze implementatie van ISO Schematron werkt niet met
+ schemas die gebruik maken van de query language
+
+ Fase fout: er is geen 'phase' gedefinieerd met naam
+
+ Markup fout: er is geen 'pattern' attribuut in <active>
+ Referentie fout: het 'pattern' "
+ " is geactiveerd maar niet gedeclareerd
+ Markup fout: er is geen 'test' attribuut in <assert
+ Markup fout: er is geen 'test' attribuut in <report>
+ Markup fout: er is geen 'id' attribuut in <diagnostic>
+ Markup fout: er is geen 'rule' attribuut in <extends>
+ Referentie fout: de abstracte regel "
+ " werd gerefereerd maar niet gedeclareerd
+ Markup fout: er is geen 'name' attribuut in <key>
+ Markup fout: er is geen 'path' of 'use' attribuut in <key>
+ Markup fout: er is geen 'path' of 'use' attribuut in <key>
+ Schema fout: Het 'key' element zit niet in de ISO Schematron namespace. Gebruik de XSLT namespace.
+ Markup fout: er is geen 'name' attribuut in <function>
+ Schema fout: Het 'function' element zit niet in de ISO Schematron namespace. Gebruik de XSLT namespace.
+ Schema fout: Leeg 'href=' attribuut bij de include opdracht.
+ Fout: Onmogelijke URL gebruikt bij de Schematron include
+ Kan de gerefereerde 'include' file niet openen:
+
+ Schema fout: Gebruik include om fragmenten op te nemen, niet een volledig schema
+ Schema fout: XSD schemas kunnen enkel geïmporteerd worden indien de 'xslt2' query language binding gebruikt is
+ Schema fout: Het 'import-schema' element is niet beschikbaar in the ISO Schematron namespace. Gebruik de XSLT namespace.
+ Waarschuwing: Variabelen niet gebruiken met de "xpath" query language binding.
+ Waarschuwing: Variabelen niet gebruiken met de "xpath2" query language binding.
+ Markup fout: er is geen 'uri' attribute in <ns>
+ Markup fout: er is geen 'prefix' attribute in <ns>
+ Schema implementatie fout: Dit schema heeft abstracte patronen, die al gepreprocessed zouden moeten zijn
+ Markup fout: er is geen 'id' attribuut in <phase>
+ Markup fout: er is geen 'context' attribuut in <rule>
+ Markup fout: er is geen 'id' attribuut op abstracte <rule>
+ Markup fout: (2) context attributen op abstracte <rule>
+ Markup fout: context attribuut op abstracte <rule>
+ Markup fout: er is geen 'select' attribute in <value-of>
+ Waarschuwing:
+ mag geen kind elementen bevatten
+ Referentie fout: Een diagnostic "
+ " werd gerefereerd maar is niet gedeclareerd.
+ Het gebruik van de XSLT namespace met een prefix verschillend
+ van "xsl" in Schematron regels wordt niet ondersteund in deze processor:
+
+ Fout: een niet herkend element in de ISO Schematron namespace: check spelling en hoofdlettergebruik
+
+ Waarschuwing: een niet herkend element
+
+
diff --git a/components/camel-schematron/src/main/resources/iso-schematron-xslt2/schematron-skeleton-api.htm b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/schematron-skeleton-api.htm
new file mode 100644
index 0000000000000..af8137783f7e4
--- /dev/null
+++ b/components/camel-schematron/src/main/resources/iso-schematron-xslt2/schematron-skeleton-api.htm
@@ -0,0 +1,723 @@
+
+
+
+
+ The ISO Schematron Skeleton API
+
+
+
+
+
+API for ISO Schematron Skeleton
+
+
+Rick Jelliffe, 2010/04/14
+This document provides documentation on the XSLT API available in
+the implementation of Schematron called iso_schematron_skeleton.xsl.
+(available in an XSLT1 and XSLT2 version). The API makes available as
+much information from the schema, however there may be some edge
+cases where it is not exhaustive.
+
+The skeleton is an XSLT script which provides all the basic
+parsing and validating routines for compiling a Schematron schema
+into XSLT. Schematron was designed to allow many different uses, and
+the skeleton gives you a headstart in creating a customized
+implementation. You just need to write XSLT templates to override the
+default ones. (The program you write is sometimes called a
+meta-stylesheet.) It is the meta-stylesheet that is called
+as the XSLT script, not the skeleton. There are several
+pre-processing stages which the Schematron schema should be processed
+through first, to handle such things as include statements and
+abstract patterns.
+
+Phases and error reporting for problems in the schema itself are
+handled by the skeleton with no interaction with a “meta-stylesheet”.
+Note that there is no guarantee that the context node is always the
+element being handled: in most cases the only information available
+is the information in the parameters.
+
+For an introductory tutorial on using this API, see Bob DuCharme's
+Schematron 1.5:
+Looking Under the Hood
+
+Superset of API for Schematron 1.5 and 1.6
+(This is an updated version of the API for the Schematron 1.5
+implementation called skeleton1-5.xsl, which in turn comes
+from the new architecture contributed by Oliver Becker for
+Schematron 1.3.)
+The current API contains only additions. Well-written
+meta-stylesheets that use the new API will be be able to run on the
+existing 1.5 and 1.6 skeletons. Similarly, it should be possible to
+upgrade the skeleton from 1.5 or 1.6 to the iso-schematron-skeleton
+only by correcting the import statement at the beginning of the
+meta-stylsheet. Additions or re-groupings from the 1.5 schema are
+shown in red. Deletions have overstrike.
+Mooted addition: a parameter @action which for specifying
+processing instructions on assertions and reports.
+
+process-prolog
+The process-prolog template gets called at the start of
+the validation session. It has no parameters. The default
+implementation is no action.
+
+process-root
+The process-root template processes the root element of
+the schema (which is not the same thing as the root of the document /
+and need not be the document element /*) .
+
+ - node-list $contents
+
-
+ string $schemaVersion
+
-
+ The version of the schema, perhaps a datestamp.
+
-
+ "xslt" | "xpath" |
+ "xslt2" | ...
+ $queryBinding
+
-
+ The query language binding.
+
-
+ string $title
+
-
+ The title of this schema
+
-
+ "iso" | "1.5" |
+ "1.6" | ...
+ $version
+
-
+ The version of Schematron being used.
+
+
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for the
+ schema
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this schema.
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this schema, from
+ xml:lang
+
-
+ URL
+ $see
+
-
+ Link to documentation on WWW or file
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+To print the documentation paragraphs, use <xsl:apply-templates
+mode="do-schema-p" />
+To output the results, use <xsl:copy-of select="$contents"
+/>
+
+process-assert
+The process-assert template handles asserts whose test
+has failed.
+
+
+ - XPath $test
+
-
+ The test
+
-
+ XML IDREFS $diagnostics
+
-
+ A list of the idrefs diagnostic elements related to the current
+ assertion
+
-
+ XML NMTOKEN
+ $flag
+
-
+ The name of a flag that becomes true because
+ this assertion fails. The flag is true for the document if it is
+ flagged true on any assertion. For compatability, this parameter
+ should not be used with Schematron 1.5.
+
+
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for the
+ assert
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this
+ assertion.
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this assertion,
+ from xml:lang
+
-
+ URL
+ $see
+
-
+ Link to documentation on WWW or file
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+Linking properties:
+
+ - XML NMTOKEN
+ $role
+
-
+ A name for the generic role of this assertion.
+ The schema creator would have their own vocabulary.
+
-
+ XPath
+ $subject
+
-
+ A path relative to the current context to some
+ interesting node considered the subject.
+
+
+To print the text contents, use <xsl:apply-templates
+mode="text" />
+
+process-diagnostic
+The process-diagnostic template handles diagnostic
+messages for assert statements that have failed and report
+statements that have succeeded. The diagnostics are evaluated in the
+context of the rule.
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for the
+ assert
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this
+ assertion.
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this assertion,
+ from xml:lang
+
-
+ URL
+ $see
+
-
+ Link to documentation on WWW or file
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+process-dir
+The process-dir template handles bi-directionality
+markup, which is only needed by certain human scripts such as Arabic.
+
+ - "ltr" or "rtl" or ""
+ $value
+
-
+ Left-to-right or right-to-left or unspecified
+
+
+process-emph
+The process-emph template handles the markup of
+emphasized text in paragraphs, assertions and diagnostics. It has no
+parameters.
+
+process-message
+The process-message handles default outputing of text.
+
+ - string $pattern
+
-
+ Some text that may be some kind of pattern
+
-
+ string $role
+
-
+ Some text that may be some kind of role
+
+
+process-name
+The process-name templates handle name strings that can
+be used in assertions. asssert and report only
+provide name subelements rather than the more general
+value-of elements to encourage plain language and generic
+descriptions rather than specific diagnostics, for which purpose the
+diagnostics elements are used.
+
+ - string $name
+
-
+ The name of the current element, or of the node specified by a name
+ element
+
+
+process-ns
+The process-ns template reports on ns
+declarations, which are used to transmit on namespace information by
+the skeleton.
+
+ - Namespace NCName $prefix
+
-
+ The prefix of a namespace
+
-
+ XML SystemId $uri
+
-
+ The (internationalized) URI Reference of a namespace
+
+
+process-p
+The process-p template handles paragraphs.
+
+ - XML NMTOKEN $class
+
-
+ An attribute that can be used for stylesheet style
+
-
+ XML ID $id
+
-
+ The unique identifier with the schema for the p element.
+
-
+ XML SystemId $icon
+
-
+ The URI of an icon
+
-
+ IETF Language $lang
+
-
+ The human language used in this paragraph
+
+
+To print the text contents, use <xsl:apply-templates
+mode="text" />
+
+
+process-pattern
+The process-pattern reports on the start of evaluation of
+a pattern element.
+
+ - string $name
+
-
+ The title of the current pattern
+
-
+ XML NCNAMES $is-a
+
-
+ Empty or not provided if the pattern is not derived from an abstract
+ pattern. Otherwise the name of the abstract pattern. A list may be
+ used if there was a sequence of abstract patterns.
+
+
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for the
+ pattern
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this pattern.
+
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this pattern, from
+ xml:lang
+
-
+ URL
+ $see
+
-
+ A (internationalized) URI reference to some
+ supporting or defining documentation
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+To print the documentation contents, use <xsl:apply-templates
+mode="do-pattern-p"/>
+
+process-report
+The process-report template handles report whose
+test has succeeded.
+
+
+ - XPath $test
+
-
+ The test
+
-
+ XML IDREFS $diagnostics
+
-
+ A list of the diagnostic elements related to the current assertion
+
-
+ XML NMTOKEN
+ $flag
+
-
+ The name of a flag that becomes true because
+ this assertion fails. The flag is true for the document if it is
+ flagged true on any assertion. For compatability, this parameter
+ should not be used with Schematron 1.5.
+
+
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for the
+ report
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this report.
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this report, from
+ xml:lang
+
-
+ URL
+ $see
+
-
+ Link to documentation on WWW or file
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+Linking properties:
+
+ - XML NMTOKEN
+ $role
+
-
+ A name for the generic role of this assertion.
+ The schema creator would have their own vocabulary.
+
-
+ XPath
+ $subject
+
-
+ A path relative to the current context to some
+ interesting node considered the subject.
+
+
+To print the text contents, use <xsl:apply-templates
+mode="text" />
+
+process-rule
+The process-rule reports that a rule element has
+fired: its context attribute matched some nodes. .
+
+ - XSLT expression $context
+
-
+ The expression that gives the context of the current
+
+
+Rich properties:
+
+ - XML SystemId
+ $icon
+
-
+ The URI of an icon
+
-
+ XML ID
+ $id
+
-
+ The unique identifier with the schema for this
+ rule
+ element.
+
-
+ SGML FPI
+ $fpi
+
-
+ The Formal Public Identifier for this rule.
+
-
+ IETF language
+ $lang
+
-
+ The human language used in this rule, from
+ xml:lang
+
-
+ URL
+ $see
+
-
+ Link to documentation on WWW or file
+
-
+ "preserve" | "default"
+ $space
+
-
+ The value for xml:space
+
+
+Linking properties:
+
+ - XML NMTOKEN
+ $role
+
-
+ A name for the generic role of this assertion.
+ The schema creator would have their own vocabulary.
+
-
+ XPath
+ $subject
+
-
+ A path relative to the current context to some
+ interesting node considered the subject.
+
+
+process-span
+The process-span handles span elements, which are generic
+elements for styling, like HTML's .
+
+ - XML NMTOKEN $class
+
-
+ An attribute that can be used for stylesheet style
+
+
+process-title
+The process-title handles title elements, which are
+generic elements for styling, like HTML's .
+
+ - XML NMTOKEN $class
+
-
+ An attribute that can be used for stylesheet style
+
+
+By default, titles are handled by invocing process-p with
+the parameter class with a value "title".
+
+process-value-of
+The process-value-of template handles value-of
+elements, which are used in diagnostic messages to allow very
+specific hinting .
+
+ - XPath $select
+
-
+ The path of some node that will be evaluated and printed.
+
+Global Parameters
+There are several global parameters that may be available for use.
+However, it is not a requirement to follow these, and implementations
+may not supply them with any value. So a test of
+string-length(variable) <
+0 is appropriate in each case.
+
+
+
+
+
+
+
+ |
+ Parameter
+ |
+
+ Value
+ |
+
+ Description
+ |
+
+
+ |
+ allow-foreign
+ |
+
+ "true" | "false" (default)
+
+ |
+
+ Pass non-Schematron elements to the generated
+ stylesheet. Pass the Schematron elements span, emph and dir: to
+ the output SVRL.
+
+ |
+
+
+ |
+ fileNameParameter
+ |
+
+ string
+ |
+
+ A parameter passed to the Validator and
+ potentially available as a variable in Schematron schemas as
+ $fileNameParameter
+ |
+
+
+ |
+ fileDirParameter
+ |
+
+ string
+ |
+
+ A parameter passed to the Validator and
+ potentially available as a variable in Schematron schemas as
+ $fileDirParameter
+ |
+
+
+ |
+ archiveNamePaameter
+ |
+
+ string
+ |
+
+ A parameter passed to the Validator and
+ potentially available as a variable in Schematron schemas as
+ $archiveNameParameter
+ |
+
+
+ |
+ archiveDirParameter
+ |
+
+ string
+ |
+
+ A parameter passed to the Validator and
+ potentially available as a variable in Schematron schemas as
+ $archivePathParameter
+ |
+
+
+ |
+ debug
+
+ |
+
+ “true” | “false” (default)
+ |
+
+ Verbose error messages (Note this may be
+ superceded by “verbose” at some stage in the future.)
+ |
+
+
+ |
+ generate-paths
+ |
+
+ true|false
+
+ |
+
+ generate the SVRL @location attribute with XPaths
+ |
+
+
+ |
+ diagnose
+ |
+
+ yes | no
+
+ |
+
+ Add the diagnostics to the assertion results
+ |
+
+
+ |
+ terminate
+ |
+
+ yes | no | true | false | assert
+
+ |
+
+ Terminate on the first failed assertion or
+ successful report
+ |
+
+
+ |
+ message-newline
+
+ |
+
+ "true" (default) | "false"
+
+ |
+
+ Generate an extra newline at the end of messages
+ |
+
+
+ |
+ output-encoding
+ |
+
+ string
+ |
+
+ The encoding used for output, for example if the
+ output is XML
+ |
+
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronComponentTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronComponentTest.java
new file mode 100644
index 0000000000000..70f8ac2414a54
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronComponentTest.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.schematron.constant.Constants;
+import org.apache.camel.component.schematron.util.Utils;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.commons.io.IOUtils;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.DifferenceListener;
+import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * Schematron Component Test.
+ */
+public class SchematronComponentTest extends CamelTestSupport {
+
+
+ /**
+ * @throws Exception
+ */
+ @Test
+ public void testSendBodyAsString() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMinimumMessageCount(1);
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-1.xml"));
+ String expected = IOUtils.toString(ClassLoader.getSystemResourceAsStream("report/article-1-report.xml"));
+ template.sendBody("direct:start", payload);
+ assertMockEndpointsSatisfied();
+ String result = mock.getExchanges().get(0).getIn().getHeader(Constants.VALIDATION_REPORT, String.class);
+ assertEquals(0, Integer.valueOf(Utils.evaluate("count(//svrl:failed-assert)", result)).intValue());
+ assertEquals(0, Integer.valueOf(Utils.evaluate("count(//svrl:successful-report)", result)).intValue());
+ }
+
+ /**
+ * @throws Exception
+ */
+ @Test
+ public void testSendBodyAsInputStreamInvalidXML() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMinimumMessageCount(1);
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-2.xml"));
+ template.sendBody("direct:start", payload);
+ assertMockEndpointsSatisfied();
+ String result = mock.getExchanges().get(0).getIn().getHeader(Constants.VALIDATION_REPORT, String.class);
+
+
+ // should throw two assertions because of the missing chapters in the XML.
+ assertEquals("A chapter should have a title", Utils.evaluate("//svrl:failed-assert[1]/svrl:text", result));
+ assertEquals("A chapter should have a title", Utils.evaluate("//svrl:failed-assert[2]/svrl:text", result));
+
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() {
+ from("direct:start")
+ .to("schematron://sch/schematron-1.sch")
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronEndpointTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronEndpointTest.java
new file mode 100644
index 0000000000000..6ac1389274c4d
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronEndpointTest.java
@@ -0,0 +1,86 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron;
+
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Producer;
+import org.apache.camel.component.schematron.exception.SchematronValidationException;
+import org.apache.camel.component.schematron.constant.Constants;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+
+/**
+ * Unit test for SchematronEndpoint.
+ *
+ */
+public class SchematronEndpointTest extends CamelTestSupport {
+
+
+ @Test
+ public void testSchematronFileReadFromClassPath()throws Exception {
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-1.xml"));
+ Endpoint endpoint = context().getEndpoint("schematron://sch/schematron-1.sch");
+ Producer producer = endpoint.createProducer();
+ Exchange exchange = new DefaultExchange(context, ExchangePattern.InOut);
+
+ exchange.getIn().setBody(payload);
+
+ // invoke the component.
+ producer.process(exchange);
+
+ String report = exchange.getOut().getHeader(Constants.VALIDATION_REPORT, String.class);
+ assertNotNull(report);
+ }
+
+ @Test
+ public void testSchematronFileReadFromFileSystem()throws Exception {
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-2.xml"));
+ String path = ClassLoader.getSystemResource("sch/schematron-1.sch").getPath();
+ Endpoint endpoint = context().getEndpoint("schematron://" + path);
+ Producer producer = endpoint.createProducer();
+ Exchange exchange = new DefaultExchange(context, ExchangePattern.InOut);
+
+ exchange.getIn().setBody(payload);
+
+ // invoke the component.
+ producer.process(exchange);
+
+ String report = exchange.getOut().getHeader(Constants.VALIDATION_REPORT, String.class);
+ assertNotNull(report);
+ }
+
+ @Test(expected = SchematronValidationException.class)
+ public void testThrowSchematronValidationException() throws Exception {
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-2.xml"));
+ Endpoint endpoint = context().getEndpoint("schematron://sch/schematron-1.sch?abort=true");
+ Producer producer = endpoint.createProducer();
+ Exchange exchange = new DefaultExchange(context, ExchangePattern.OutIn);
+
+ exchange.getIn().setBody(payload);
+
+ // invoke the component.
+ producer.process(exchange);
+
+ }
+}
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java
new file mode 100644
index 0000000000000..5bdf9a7441400
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.component.schematron.constant.Constants;
+import org.apache.camel.component.schematron.processor.TemplatesFactory;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import javax.xml.transform.Templates;
+
+/**
+ * Schematron Producer Unit Test.
+ *
+ */
+public class SchematronProducerTest extends CamelTestSupport {
+
+ private static SchematronProducer producer;
+
+ @BeforeClass
+ public static void setUP() {
+ SchematronEndpoint endpoint = new SchematronEndpoint();
+ Templates templates = TemplatesFactory.newInstance().newTemplates(ClassLoader.
+ getSystemResourceAsStream("sch/schematron-1.sch"));
+ endpoint.setRules(templates);
+ producer = new SchematronProducer(endpoint);
+ }
+
+ @Test
+ public void testProcessValidXML() throws Exception {
+ Exchange exc = new DefaultExchange(context, ExchangePattern.InOut);
+ exc.getIn().setBody(ClassLoader.getSystemResourceAsStream("xml/article-1.xml"));
+
+ // process xml payload
+ producer.process(exc);
+
+ // assert
+ assertTrue(exc.getOut().getHeader(Constants.VALIDATION_STATUS).equals(Constants.SUCCESS));
+ }
+
+ @Test
+ public void testProcessInValidXML() throws Exception {
+ Exchange exc = new DefaultExchange(context, ExchangePattern.InOut);
+ exc.getIn().setBody(ClassLoader.getSystemResourceAsStream("xml/article-2.xml"));
+
+ // process xml payload
+ producer.process(exc);
+
+ // assert
+ assertTrue(exc.getOut().getHeader(Constants.VALIDATION_STATUS).equals(Constants.FAILED));
+
+ }
+
+}
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/SchematronProcessorTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/SchematronProcessorTest.java
new file mode 100644
index 0000000000000..198a176ff2799
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/SchematronProcessorTest.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+import org.apache.camel.component.schematron.util.Utils;
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.xml.transform.Templates;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * SchematronEngine Unit Test.
+ */
+public class SchematronProcessorTest {
+
+ private Logger logger = LoggerFactory.getLogger(SchematronProcessorTest.class);
+
+ @Test
+ public void testValidXML() throws Exception {
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-1.xml"));
+ logger.info("Validating payload: {}", payload);
+ String expected = IOUtils.toString(ClassLoader.getSystemResourceAsStream("report/article-1-report.xml"));
+
+ // validate
+ String result = getProcessor("sch/schematron-1.sch").validate(payload);
+ logger.info("Schematron Report: {}", result);
+ assertEquals(0, Integer.valueOf(Utils.evaluate("count(//svrl:failed-assert)", result)).intValue());
+ assertEquals(0, Integer.valueOf(Utils.evaluate("count(//svrl:successful-report)", result)).intValue());
+
+ }
+
+ @Test
+ public void testInValidXML() throws Exception {
+
+ String payload = IOUtils.toString(ClassLoader.getSystemResourceAsStream("xml/article-2.xml"));
+ logger.info("Validating payload: {}", payload);
+ // validate
+ String result = getProcessor("sch/schematron-2.sch").validate(payload);
+ logger.info("Schematron Report: {}", result);
+ // should throw two assertions because of the missing chapters in the XML.
+ assertEquals("A chapter should have a title", Utils.evaluate("//svrl:failed-assert/svrl:text", result));
+ assertEquals("'chapter' element has more than one title present", Utils.evaluate("//svrl:successful-report/svrl:text", result).trim());
+
+
+ }
+
+ /**
+ * Returns schematron processor
+ *
+ * @param schematron
+ * @return
+ */
+ private SchematronProcessor getProcessor(final String schematron) {
+ Templates rules = TemplatesFactory.newInstance().newTemplates(ClassLoader.getSystemResourceAsStream(schematron));
+ return SchematronProcessorFactory.newScehamtronEngine(rules);
+ }
+}
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/TemplatesFactoryTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/TemplatesFactoryTest.java
new file mode 100644
index 0000000000000..5c536ee3a8051
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/processor/TemplatesFactoryTest.java
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.processor;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.xml.transform.Templates;
+
+/**
+ * TemplateFactory Unit Test.
+ *
+ */
+public class TemplatesFactoryTest {
+
+ private String rules = "sch/schematron-1.sch";
+
+ @Test
+ public void testInstantiateAnInstanceOfTemplates() throws Exception {
+
+
+ TemplatesFactory fac = TemplatesFactory.newInstance();
+ Templates templates = fac.newTemplates(ClassLoader.getSystemResourceAsStream(rules));
+ Assert.assertNotNull(templates);
+
+
+ }
+}
diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/util/Utils.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/util/Utils.java
new file mode 100644
index 0000000000000..1754e444aaf9c
--- /dev/null
+++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/util/Utils.java
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.schematron.util;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.schematron.constant.Constants;
+import org.custommonkey.xmlunit.SimpleNamespaceContext;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.XpathEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Utility Class.
+ *
+ */
+public final class Utils {
+
+ private static final Logger LOG = LoggerFactory.getLogger(Utils.class);
+
+ private Utils() {
+ throw new IllegalStateException("This is a utility class");
+ }
+
+ /**
+ * Evaluate an XPATH expression.
+ *
+ * @param xpath
+ * @param xml
+ * @return
+ */
+ public static String evaluate(final String xpath, final String xml) {
+ Map m = new HashMap();
+ m.put("svrl", Constants.HTTP_PURL_OCLC_ORG_DSDL_SVRL);
+ XpathEngine xpathEngine = XMLUnit.newXpathEngine();
+ xpathEngine.setNamespaceContext(new SimpleNamespaceContext(m));
+ try {
+ return xpathEngine.evaluate(xpath, XMLUnit.buildControlDocument(xml));
+
+ } catch (Exception e) {
+ LOG.error("Failed to apply xpath {} on xml {}", xpath, xml);
+ throw new RuntimeCamelException(e);
+ }
+ }
+
+
+}
diff --git a/components/camel-schematron/src/test/resources/log4j.properties b/components/camel-schematron/src/test/resources/log4j.properties
new file mode 100644
index 0000000000000..37c14479f5ce8
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/log4j.properties
@@ -0,0 +1,14 @@
+#
+# The logging properties used
+#
+log4j.rootLogger=TRACE, out
+
+# uncomment the following line to turn on Camel debugging
+#log4j.logger.org.apache.camel=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
+#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
diff --git a/components/camel-schematron/src/test/resources/report/article-1-report.xml b/components/camel-schematron/src/test/resources/report/article-1-report.xml
new file mode 100644
index 0000000000000..1f40fe8e4d6ed
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/report/article-1-report.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/report/article-2-report.xml b/components/camel-schematron/src/test/resources/report/article-2-report.xml
new file mode 100644
index 0000000000000..d3069cbe5c90c
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/report/article-2-report.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ A chapter should have a title
+
+
+
+ A chapter should have a title
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/sch/schematron-1.sch b/components/camel-schematron/src/test/resources/sch/schematron-1.sch
new file mode 100644
index 0000000000000..49b329c548c89
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/sch/schematron-1.sch
@@ -0,0 +1,17 @@
+
+
+
+ Sample Schematron using XPath 2.0
+
+
+
+
+
+
+
+ A chapter should have a title
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/sch/schematron-2.sch b/components/camel-schematron/src/test/resources/sch/schematron-2.sch
new file mode 100644
index 0000000000000..18f4bca82b66a
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/sch/schematron-2.sch
@@ -0,0 +1,21 @@
+
+
+
+ Sample Schematron using XPath 2.0
+
+
+
+
+
+
+
+
+ A chapter should have a title
+
+ 'chapter' element has more than one title present
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/schema/article.xsd b/components/camel-schematron/src/test/resources/schema/article.xsd
new file mode 100644
index 0000000000000..8eb79b3db3684
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/schema/article.xsd
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/xml/article-1.xml b/components/camel-schematron/src/test/resources/xml/article-1.xml
new file mode 100644
index 0000000000000..3c95d568d6b9f
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/xml/article-1.xml
@@ -0,0 +1,15 @@
+
+
+
+ chapter title
+ Chapter content
+
+
+ chapter 2 title
+ Content
+
+
+ Title
+ Chapter 3 content
+
+
\ No newline at end of file
diff --git a/components/camel-schematron/src/test/resources/xml/article-2.xml b/components/camel-schematron/src/test/resources/xml/article-2.xml
new file mode 100644
index 0000000000000..33698b532978d
--- /dev/null
+++ b/components/camel-schematron/src/test/resources/xml/article-2.xml
@@ -0,0 +1,14 @@
+
+
+
+ Chapter content
+
+
+ Content
+
+
+ Title
+ Title2
+ Chapter 3 content
+
+
\ No newline at end of file
diff --git a/components/pom.xml b/components/pom.xml
index 0d6c97184f564..f4ad63d8226f4 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -14,8 +14,7 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--->
-
+-->
4.0.0
@@ -161,6 +160,7 @@
camel-saxon
camel-salesforce
camel-script
+ camel-schematron
camel-servlet
camel-servletlistener
camel-shiro
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index 9b640324e59ab..36b9ac414b046 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -216,7 +216,7 @@
mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.castor/${castor-bundle-version}
mvn:org.apache.camel/camel-castor/${project.version}
-