[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XPattern Specification
Alan Gutierrez wrote: > * Karl Waclawek <karl@w...> [2005-01-17 09:16]: > > >> > 4. Position counters (to enable position predicates and >> > position() >> >>>function) >> >>Especially for a streaming processor, should the goal of a pattern >>matching language not be, to allow for flexible cooperation >>between what the language does and what the handlers do? > > > Brings me back to my suggestion for a generic XPath binding API. > > public interface Function { > public Node invoke(NodeList arguments); > } > > Works for Java. > > What works across all languages? If one "language" needs to interact with multiple other languages, then what we are talking about is multiple "lanuage bindings". >>Predicate evaluation could also be performed in the handler >>call-backs. So, maybe the XPattern language could provide for >>simple attribute value matching, but leave more difficult tasks to >>the call-back handlers, which can take advantage of a Turing >>complete language, and which can also easliy interact with >>application context (e.g if our database has a record for this >>id, return true, otherwise return false). And there should be a >>specified way for how the handlers return results for predicate >>evaluation. > > > I'm of that mind set. I like this proposal. > > I'd like to match information, then respond with Java. My > example, simplified. > > <document> > <reverse>Alan</reverse> > </dcoument> > > Transformed to: > > <document> > <reverse>Alan</reverse> > <reversed>nalA</reversed> > </document> I am using an API I have developed mostly for myself (although open sourced). Whenever I match an element, call-backs are made on one of these interfaces (C# with generics): public interface IXmlHandler<S> where S: EventStatus { void Reset(); void ProcessingInstruction(string target, string data, S status); void SkippedEntity(string name, S status); } public interface IDocHandler<S>: IXmlHandler<S> where S: EventStatus { void StartDocument(object context, S status); void EndDocument(S status); void StartRoot(QName name, IAttributes attributes, S status); void EndRoot(S status); } public interface IElementHandler<C, N, S>: IXmlHandler<S> where C: XmlPathContext<C, N, S> where N: XmlPathNode<N, C, S> where S: EventStatus { // context is valid until Deactivate is called, but attributes is only // valid during the call to Activate void Activate(C context, QName name, IAttributes attributes, S status); void Characters(char[] chars, int start, int length, S status); void IgnorableWhitespace(char[] ws, int start, int length, S status); // called before child is activated void StartChild(QName name, IAttributes attributes, S status); // called after child is deactivated void EndChild(S status); void Deactivate(S status); } > I'm looking to notified of a reverse element, and to be notified > of the end of the reverse element, so I can insert the reversed > element. This isn't really node matching, but event matching. > > + = open, - = close, () = capture, [] = emit > > +document > +reverse (foo) -reverse > [+reversed &util::reverse($foo) -reversed] Some events for the API above would be (matching on /document/reverse): - Activate(..., "reverse",...) - one or more Characters() calls - Deactivate(...) In the Deactivate event the handler would emit: <reverse>Alan</reverse> <reversed>nalA</reversed> The handler wouldbe derived from an existing helper class, which performs character buffering. For that task that would be all the pattern matching language and API support I would need. Maybe there is a danger of overengineering in this discussion? Karl
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|