[oXygen-user] Help with XProc - Relax NG validation pipeline


Mon Jul 19 02:01:43 CDT 2010


John,

I find it strange that you cannot construct the value of p:exec/@args
dynamically. That should be possible, because "args" is just a normal
XProc step option (if you look at the description of p:exec in the spec,
you will see that the value is interpreted as a string, and not
untypedAtomic).

<p:declare-step>
  <p:option name="jing-path"/>
  <p:option name="src-path"/>
  <p:option name="schema-path"/>

  <p:input port="source">
    <p:empty/>
  </p:input>
  <p:output port="result">
    <p:pipe port="result" step="validate-with-rng"/>
  </p:output>
  <p:exec command="java" cwd="/working-path" name="validate-with-rng"
result-is-xml="false" wrap-result-lines="true">
    <p:with-option name="args" select="concat('-jar ', $jing-path, ' ',
$schema-path, ' ', $doc.xml)">
      <p:empty>
    </p:with-option>
  </p:exec>
</p:declare-step>

If Calabash is complaining about the type of the "args" option, then I
think that is a bug.

Regards,
Vojtech

--
Vojtech Toman
Consultant Software Engineer
EMC | Information Intelligence Group

http://developer.emc.com/xmltech

> -----Original Message-----
> From:  [mailto:oxygen-user-
> ] On Behalf Of John Madden
> Sent: Sunday, July 18, 2010 11:35 PM
> To: 
> Subject: [oXygen-user] Help with XProc - Relax NG validation pipeline
> 
> Hi guys,
> 
> (First of all, forgive this long missive...)
> 
> I'm trying to write and XProc step that:
> 
> 1. takes as input (a) an XML document and (b) a Relax NG schema (or--
in an
> alternative design--parameters that are the file system location of
(a) and (b))
> 2. runs the validation using Jing
> 3. outputs the Jing error messages (if any, wrapped appropriately in
an xml container
> element) to an output port
> 4. passes through the input XML document unchanged (or, possibly,
annotated in
> some way) to another output port
> 
> (note: step 3 is exactly what Jing itself does when invoked via the
command line,
> namely outputs error messages, if any, to system out)
> 
> Okay, so you say, "What's your problem? Just use
<p:validate-with-relax-ng>."
> 
> Aha, but, the output of <p:validate-with-relax-ng> is defined as "a
copy of the input,
> possibly augmented by application of the [RELAX NG DTD
Compatibility]." There is
> no output port defined for validation error messages. If the
validation fails (and
> @assert-valid is true), then validation failure will throw an XProc
(e.g. Calabash) error.
> But nowhere do I see any built-in capability in
<p:validate-with-relax-ng" to recover the
> specific validation error messages produced by the validation engine
(in this case
> Jing).
> 
> Okay, fine. So I decide I'll do my own declare-step and I'll use
<p:exec> to manually
> invoke Jing via its command line interface. Here's what I have so far:
> 
> <p:declare-step xmlns:c="http://www.w3.org/ns/xproc-step"
> xmlns:p="http://www.w3.org/ns/xproc">
>     <p:input port="source">
>         <p:empty/>
>     </p:input>
>     <p:output port="result">
>         <p:pipe port="result" step="validate-with-rng"/>
>     </p:output>
>     <p:exec args="-jar /path-to-jing/jing.jar schema.rng doc.xml"
command="java"
> cwd="/working-path" name="validate-with-rng" result-is-xml="false"
wrap-result-
> lines="true"/>
> </p:declare-step>
> 
> Fine, now when my document has validation error, I get nicely wrapped
Jing error
> messages on the output port, that e.g. look something like this:
> 
> <c:result>
>    <c:line>/working-path/example.xml:54:35: error: value of attribute
"foo" is invalid;
> must be equal to "x", "y" or "z"</c:line>
>    <c:line>/working-path/example.xml:207:16: error: element "bar"
incomplete;
> missing required element "something"</c:line>
> </c:result
> 
> But now I've got a problem. I want to make this whole validation step
generic, so
> instead of hard coding the value of //p:exec/@args, I'd like to pass
in the locations of
> (i) Jing, (ii) of the schema, and (iii) of the input document as
parameters (or maybe as
> little xml document rather than as p:parameters). Then I'd like to
compute the jing
> command line.
> 
> Uh-oh. I've tried all kinds of ways to get this to work, but there are
problems. For one
> thing the value of //p:exec/@args seems to be untypedAtomic. When I
try to
> construct a string and put it in as a value of //p:exec/@args,
Calabash complains
> about the type being inappropriate. What about giving Jing the schema
and document
> as inputs via a pipe? That doesn't seem to work -- Jing wants its
paramaters on the
> command line.
> 
> So, can somebody help me out of this thicket with some suggestions?
> 
> Thanks, John
> 
> P.S. The official specification of <p:validate-with-schematron>
strikes me as much
> better than that of <p:validate-with-relax-ng>.
> 
> The signature of <p:validate-with-schematron is:
> 
> <p:declare-step type="p:validate-with-schematron">
>      <p:input port="parameters" kind="parameter"/>
>      <p:input port="source" primary="true"/>
>      <p:input port="schema"/>
>      <p:output port="result" primary="true"/>
>      <p:output port="report" sequence="true"/>
>      <p:option name="phase" select="'#ALL'"/>
<!-- string -->
>      <p:option name="assert-valid" select="'true'"/>
<!-- boolean -->
> </p:declare-step>
> 
> So <p:validate-with-schematron> has a standard output port named
"report" that
> makes the error messages from the validation engine accessible.
> 
> By contrast, <p:validate-with-relax-ng> lacks any such port in its
signature:
> 
> <p:declare-step type="p:validate-with-relax-ng">
>      <p:input port="source" primary="true"/>
>      <p:input port="schema"/>
>      <p:output port="result"/>
>      <p:option name="dtd-attribute-values" select="'false'"/>
<!-- boolean -->
>      <p:option name="dtd-id-idref-warnings" select="'false'"/>
<!-- boolean -->
>      <p:option name="assert-valid" select="'true'"/>
<!-- boolean -->
> </p:declare-step>
> 
> I don't like that! Does anyone else but me dislike it too?




More information about the oXygen-user mailing list