Hi Hans-Jürgen, Sounds like an interesting idea. As the output of xquery:parse is XML, the xquery:data-paths function could probably be written in XQuery itself?
Best, Christian _________________________________ On Sat, Feb 20, 2016 at 12:24 AM, Hans-Juergen Rennau <hren...@yahoo.de> wrote: > Dear BaseX team, > > perhaps I hear an opinion about the following idea. > > (1) The function xquery:parse is already immensely useful as it allows to > *validate* XPath expressions, as for example used in configuration data. (A > practical example: the XPath expressions used in JMeter [1] test plans in > order to extract message data and define test assertions.) > > (2) Given the XSDs of a Web Service (or other application), it is possible > to determine all valid data paths (e.g. /a/b/c is valid, /a/b/C is not > valid). > > (3) If there were a reliable way to map the output of xquery:parse to the > implied data paths, then one could use xquery:parse to validate xpath > expression not only for syntactic correctness (which is already very much!), > but also for consistency with application XSDs. This would be extremly > usefuly as XSDs evolve and a checking if configuration-based XPath > expressions must be adapted is otherwise very difficult to achieve in any > systematic way. > > (4) Looking at the xquery:parse output, it seems certainly feasible to write > such a mapping (xquery:parse output => data paths); but the problem I see is > that the format is not guaranteed to be stable, as it is no standard. (And > it is probably not described.) If BaseX provided such a functionality as an > additional extension function (e.g. xquery:data-paths($query as xs:string)) > you would simply be - heros. > > Cheers, > Hans-Jürgen > > [1] http://jmeter.apache.org/ > > PS: Illustrative example. > > let $query := "/descendant::OutboundFlight[Status = > 'Booked'][1]/FlightDeparture/DepartureTime" > return xquery:parse($query) > => > <MainModule updating="false"> > <QueryPlan compiled="false"> > <CachedPath> > <Root/> > <IterPosStep axis="descendant" test="OutboundFlight"> > <CmpG op="="> > <CachedPath> > <IterStep axis="child" test="Status"/> > </CachedPath> > <Str value="Booked" type="xs:string"/> > </CmpG> > <Int value="1" type="xs:integer"/> > </IterPosStep> > <IterStep axis="child" test="FlightDeparture"/> > <IterStep axis="child" test="DepartureTime"/> > </CachedPath> > </QueryPlan> > </MainModule> > > let $query := > "/descendant::OutboundFlight[FlightDeparture/DepartureDate][1]/FlightDeparture/DepartureDate" > return xquery:data-paths($query) > => > //OutboundFlight/FlightDeparture/DepartureTime, > //OutboundFlight/Status >