Hi all,

I am trying to build a Maven plugin for validating XML. Currently I have this code:

<!-- assume ${schema.type.uri} is http://www.w3.org/2001/XMLSchema -->
<core:set
  var="verifierFactory"
  value=
"${org.iso_relax.verifier.VerifierFactory.newInstance(schema.type.uri)}" />

<!-- assume everything in ${file.set} is an XML file -->
<ant:fileScanner var="fileSet">
  <ant:fileset dir="${file.set}" />
</ant:fileScanner>

<validate:verifier
  var="verifier"
  factory="${verifierFactory}"
  uri="schema.uri" />

<!-- THIS DOES NOT WORK -- RETURNS AN EMPTY STRING -->
<echo>Validating using ${verifierFactory.getClass().toString()}</echo>

<core:forEach items="${fileSet.iterator()}" var="file">
  <echo>Validating ${file}</echo>

  <validate:validate var="validationResult" verifier="${verifier}">
    <core:include uri="file:///${file}" />
  </validate:validate>

  <echo>Validation result: ${validationResult}</echo>
</core:forEach>

There are several problems with this code:

1. If the schema file pointed by ${schema.uri} references other schema file by using a relative URL, then that URL is resolved relatively to the location from where the validation process was started (the path from where Maven was launched), instead of being resolved relatively to the first schema file location (this is what XML schema validators do -- checked with MSXML3.0 and with Xerces).

2. If the schema instance (i.e. the validated file) contains an "xsi:schemaLocation" attribute in its root element then this error is thrown: <error column="-1" line="-1">unexpected attribute "xsi:schemaLocation"</error>
and the ${validationResult} is set to 'false'.

3. If the validation failed once (like in #3), then errors are not thrown anymore, only the ${validationResult} is set to 'false'.

4. If <core:include uri="..." /> references a local file path then that file path must be prepended with "file:///", otherwise it is prepended at run-time with the process launch path. For example:
- local file path: E:\myxmldir\foo.xml
- process launch path: E:\myworkdir
then Jelly will seek for something impossible: E:\myworkdir\E:\myxmldir\foo.xml

Thanks a lot for your time,
Adrian.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to