- From: Murray Maloney <murray@muzmo.com>
- Date: Fri, 15 Apr 2016 13:09:08 -0400
- To: Alex Milowski <alex@milowski.com>
- Cc: Murray Maloney <murray@muzmo.com>, XProc WG <public-xml-processing-model-wg@w3.org>
What about mapping by type?
If you are able to map the inputs to the needed media types, ...
> On Apr 15, 2016, at 12:25 PM, Alex Miłowski <alex@milowski.com> wrote:
>
> I think we want the rules to be:
>
> 1. First you map by name.
> 2. Then by "order" (semantics TBD)
>
> That way we can make this work":
>
> xslt() -> store(href="output.xml")
>
> After the chain operator, the current readable ports are:
>
> [result: (...), secondary: (...)]
>
> and the store operator has a single input port named "source". There
> is no source output port and so it uses the first port (i.e.,
> "result").
>
> [stylesheet="style.xsl", "doc.xml"] -> xslt()
>
> The current readable ports are as specified so by these rules, XSLT
> transforms the stylesheet and "doc.xml" is ignored - no error.
>
> I'm not sure we want to automatically surface readable port names as
> variables. I think there would be a lot of room for collision with
> user-defined variables. If you want to refer to $secondary, then we
> need a specialize syntax (e.g., Murray's suggestion of @secondary).
>
>
> On Fri, Apr 15, 2016 at 8:29 AM, Norman Walsh <ndw@nwalsh.com> wrote:
>> It's been a long time since we talked about the signatures for steps.
>> Suppose we used square brackets there too:
>>
>> declare step xslt($mode as xs:QName, $params as map())
>> [$source, $stylesheet; $result, $secondary]
>> {
>> ...
>> }
>>
>> Aside: we seem to have some inconsistency about whether port names
>> have $-prefixes or not.
>>
>> I'm not sure it's syntactically the best thing ever, but ...
>>
>> Now we can say that a port set expression provides a mapping of
>> readable ports for the step that follows:
>>
>> [source="doc.xml", "style.xsl"] -> xslt()
>>
>> (I kind of like the arrow for readability but I think Henry's right,
>> it has no purpose except readability.)
>>
>> I imagine that the semantics of that mapping are something like this:
>>
>> Given a set of readable ports and a set of input ports, you match up
>> the named ones first then you match up the remaining ones in order.
>>
>> So each of the following binds source and stylesheet for the following
>> xslt() step just as you'd expect:
>>
>> [source="doc.xml", "style.xsl"] -> xslt()
>> [source="doc.xml", stylesheet="style.xsl"] -> xslt()
>> [stylesheet="style.xsl", source="doc.xml"] -> xslt()
>> ["doc.xml", "style.xsl"] -> xslt()
>>
>> For a case where the named and ordinal ones are "out of order":
>>
>> [stylesheet="style.xsl", "doc.xml"] -> xslt()
>>
>> I think there are two alternatives. We can say that this binding works
>> by matching up the stylesheet port by name and the source port from
>> the remaining possibilities ordinally or we can make it an error
>> because you have to "go backward" to make it work. (I can't think of a
>> concise way to express the error condition, but I think I can see it
>> pretty clearly.)
>>
>> I'm naturally inclined to prefer to make it an error, but I'm not sure
>> that's the right thing because I don’t think we want to make extra
>> ports an error. I think both:
>>
>> [source="doc.xml", "style.xsl", "alt.xml"] -> xslt()
>> [source="doc.xml", alt="alt.xml", stylesheet="style.xsl"] -> xslt()
>>
>> bind source to "doc.xml" and stylesheet to "style.xsl" in the XSLT
>> step. The extra binding is just ignored; there's no way for the XSLT
>> step to read it.
>>
>> Another interesting case is when the names don't match up at all:
>>
>> [result="doc.xml", "style.xsl"]
>>
>> I think the right answer here is to say that names which don't match
>> are ignored. So the preceding port set expression is exactly
>> equivalent to ["doc.xml", "style.xsl"] for a following xslt() step;
>> if the following step has a 'result' input port then it gets doc.xml.
>>
>> Absent ports are just treated as empty:
>>
>> [stylesheet="style.xsl"] -> xslt()
>>
>> binds the stylesheet to "style.xsl" and leaves the source input empty.
>> I suppose you could also do that this way: [(), "style.xsl"] though
>> I'm not sure we've worked out what kinds of expressions can go in a
>> port set expression.
>>
>> The result of a step is, I think, a port set expression that binds
>> the output ports to the results. So the xslt() step produces a binding
>> that's equivalent to this:
>>
>> [result="result.xml", secondary="secondary.xml"]
>>
>> By the rule that says that port names that don't match are simply
>> ignored, we can still say that:
>>
>> xslt() -> store(href="output.xml")
>>
>> would store "result.xml" into "output.xml" but would do nothing with
>> the secondary output. If you want to remap things, you have to put in
>> a port set expression.
>>
>> xslt() -> [source=port("secondary")] -> store("secondary.xml")
>>
>> And it occurs to me that a port set expression doesn't even need
>> the port() function if we say that it can refer to the names of
>> readable ports directly:
>>
>> xslt() -> [$secondary] -> store("secondary.xml")
>>
>> All of the preceding is back-formation from my idea for block
>> expressions, which is to make them anonymous steps.
>>
>> xproc version = "2.0";
>> inputs $source as document-node();
>> outputs $result as document-node();
>>
>> [$source] → λ()[$in;$out] { if (xs:decimal($in/*/@version) < 2.0)
>> then [$in,"v1schema.xsd"] → validate-with-xml-schema() ≫ $out
>> else [$in,"v2schema.xsd"] → validate-with-xml-schema() ≫ $out }
>> → [$out,"stylesheet.xsl"] → xslt()
>> ≫ $result
>>
>> It's a little bit of extra syntax, but I think JavaScript and futures
>> have made anonymous functions commonplace.
>>
>> They also afford some interesting flexibility, consider:
>>
>> xproc version = "2.0";
>> inputs $source as document-node();
>> outputs $result as document-node();
>> options $minver as xs:decimal := 2.0,
>> $v1schema := "v1schema.xsd",
>> $v2schema := "v2schema.xsd";
>>
>> [$source] → λ($vertest as xs:decimal := $minver,
>> $v1 as xs:string := $v1schema,
>> $v2 as xs:string := $v2schema)
>> [$in;$out]
>> { if (xs:decimal($in/*/@version) < $vertest)
>> then [$in,$v1] → validate-with-xml-schema() ≫ $out
>> else [$in,$v2] → validate-with-xml-schema() ≫ $out }
>> → [$out,"stylesheet.xsl"] → xslt()
>> ≫ $result
>>
>> I'm not sure how useful that is, really, but ...
>>
>> Be seeing you,
>> norm
>>
>> --
>> Norman Walsh
>> Lead Engineer
>> MarkLogic Corporation
>> Phone: +1 512 761 6676
>> www.marklogic.com
>
>
>
> --
> --Alex Miłowski
> "The excellence of grammar as a guide is proportional to the paucity of the
> inflexions, i.e. to the degree of analysis effected by the language
> considered."
>
> Bertrand Russell in a footnote of Principles of Mathematics
>
Received on Friday, 15 April 2016 17:09:34 UTC