diff --git a/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java b/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java index 7b291090c1eec..3e53460630e8a 100644 --- a/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java +++ b/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java @@ -76,7 +76,7 @@ protected void doStart() throws Exception { if (fopFactory == null) { fopFactory = FopFactory.newInstance(); - } + } if (userConfigURL != null) { InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(getCamelContext().getClassResolver(), userConfigURL); diff --git a/components/camel-schematron/README.md b/components/camel-schematron/README.md new file mode 100644 index 0000000000000..d5dfc0ec8ad20 --- /dev/null +++ b/components/camel-schematron/README.md @@ -0,0 +1,29 @@ +Schematron Component +==================== + +Schematron is an XML-based language for validating XML instance documents. Schematron is used to make assertions about data in an XML document. Schematron is used to express operational and business rules. +Schematron is an ISO standard. +Use Schematron to verify data interdependencies (co-constraints), check data cardinality, and perform algorithmic checks. A co-constraint is a dependency between data within an XML document or across XML documents. Cardinality refers to the presence or absence of data. An algorithmic check determines data validity by performing an algorithm on the data. + +Schematron engine +====================== + +Schemaron engine is an XSLT based implementation. XLST source code can be found here: https://code.google.com/p/schematron/ + + +Schematron Tutorials +====================== + +http://www.schematron.com/spec.html + +http://www.xml.com/pub/a/2003/11/12/schematron.html + +http://www.data2type.de/en/xml-xslt-xslfo/schematron/ + +http://www.mulberrytech.com/papers/schematron-Philly.pdf + +http://www.ldodds.com/papers/schematron_xsltuk.html#c35e2592b6b7 + +To build this project use + + mvn clean install diff --git a/components/camel-schematron/pom.xml b/components/camel-schematron/pom.xml new file mode 100644 index 0000000000000..88440dc9174ee --- /dev/null +++ b/components/camel-schematron/pom.xml @@ -0,0 +1,64 @@ + + + + + + org.apache.camel + components + 2.14-SNAPSHOT + + 4.0.0 + org.apache.camel + camel-schematron + bundle + Camel :: SCHEMATRON + + org.apache.camel.component.schematron.* + org.apache.camel.spi.ComponentResolver;component=schematron + + + + org.apache.camel + camel-core + + + net.sf.saxon + Saxon-HE + ${saxon-version} + + + commons-io + commons-io + ${commons-io-version} + + + + + org.apache.camel + camel-test + test + + + xmlunit + xmlunit + ${xmlunit-version} + test + + + diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronComponent.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronComponent.java new file mode 100644 index 0000000000000..c1327d458500e --- /dev/null +++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronComponent.java @@ -0,0 +1,43 @@ +/** + * 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 java.util.Map; +import org.apache.camel.Endpoint; +import org.apache.camel.impl.DefaultComponent; + +/** + * Represents the component that manages {@link SchematronEndpoint}. + */ +public class SchematronComponent extends DefaultComponent { + + + /** + * Creates the Schematron Endpoint. + * + * @param uri + * @param remaining + * @param parameters + * @return + * @throws Exception + */ + protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { + Endpoint endpoint = new SchematronEndpoint(uri, remaining, this); + setProperties(endpoint, parameters); + return endpoint; + } +} diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronEndpoint.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronEndpoint.java new file mode 100644 index 0000000000000..458f3e81413f8 --- /dev/null +++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronEndpoint.java @@ -0,0 +1,113 @@ +/** + * 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 java.io.File; +import java.io.InputStream; + +import javax.xml.transform.Templates; +import org.apache.camel.Consumer; +import org.apache.camel.Processor; +import org.apache.camel.Producer; +import org.apache.camel.component.schematron.processor.TemplatesFactory; +import org.apache.camel.component.schematron.exception.SchematronConfigException; +import org.apache.camel.impl.DefaultEndpoint; +import org.apache.camel.util.ResourceHelper; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + + +/** + * Schematron Endpoint. + */ +public class SchematronEndpoint extends DefaultEndpoint { + + private Logger logger = LoggerFactory.getLogger(SchematronEndpoint.class); + private String remaining; + private boolean abort; + private Templates rules; + + + public SchematronEndpoint() { + } + + public SchematronEndpoint(String uri, String remaining, SchematronComponent component) { + super(uri, component); + this.remaining = remaining; + } + + public SchematronEndpoint(String endpointUri) { + super(endpointUri); + } + + public Producer createProducer() throws Exception { + return new SchematronProducer(this); + } + + public Consumer createConsumer(Processor processor) throws Exception { + throw new UnsupportedOperationException("Consumer is not implemented for this component"); + } + + public boolean isSingleton() { + return true; + } + + public void setAbort(boolean abort) { + this.abort = abort; + } + + public boolean isAbort() { + return abort; + } + + public Templates getRules() { + return rules; + } + + public void setRules(Templates rules) { + this.rules = rules; + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + if (rules == null) { + try { + // Attempt to read the schematron rules from the class path first. + logger.info("Reading schematron rules from class path {}", remaining); + InputStream schRules = ResourceHelper.resolveMandatoryResourceAsInputStream(getCamelContext().getClassResolver(), remaining); + rules = TemplatesFactory.newInstance().newTemplates(schRules); + } catch (Exception e) { + // Attempts from the file system. + logger.info("Schamatron rules not found in class path, attempting file system {}", remaining); + InputStream schRules = FileUtils.openInputStream(new File(remaining)); + rules = TemplatesFactory.newInstance().newTemplates(schRules); + } + + // rules not found in class path nor in file system. + if (rules == null) { + logger.error("Schematron rules not found {}", remaining); + throw new SchematronConfigException("Failed to load rules: " + remaining); + } + } + + } +} diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java new file mode 100644 index 0000000000000..e5d000b534ee3 --- /dev/null +++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java @@ -0,0 +1,99 @@ +/** + * 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 java.util.HashMap; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.component.schematron.constant.Constants; +import org.apache.camel.component.schematron.exception.SchematronValidationException; +import org.apache.camel.component.schematron.processor.SchematronProcessorFactory; +import org.apache.camel.impl.DefaultProducer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Schematron producer. + */ +public class SchematronProducer extends DefaultProducer { + private Logger logger = LoggerFactory.getLogger(SchematronProducer.class); + private SchematronEndpoint endpoint; + + + /** + * @param endpoint the schematron endpoint. + */ + public SchematronProducer(final SchematronEndpoint endpoint) { + super(endpoint); + this.endpoint = endpoint; + } + + /** + * Processes the payload. Validates the XML using the SchematronEngine + * + * @param exchange + * @throws Exception + */ + public void process(Exchange exchange) throws Exception { + + String payload = exchange.getIn().getBody(String.class); + logger.debug("Applying schematron validation on payload: {}", payload); + String report = SchematronProcessorFactory.newScehamtronEngine(endpoint.getRules()).validate(payload); + logger.debug("Schematron validation report \n {}", report); + String status = getValidationStatus(report); + logger.info("Schematron validation status : {}", status); + setValidationReport(exchange, report, status); + } + + /** + * Sets validation report and status + * + * @param exchange + * @param report + * @param status + */ + private void setValidationReport(Exchange exchange, String report, String status) { + // if exchange pattern is In and Out set details on the Out message. + Map headers = new HashMap(); + 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} -