- 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