Michael,
Why don't you consider donating some of your "twisted" examples to the mount/xmlform sitemap? ----- Original Message ----- From: <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Friday, May 17, 2002 4:16 AM Subject: Re: [Announcement] XMLForm 0.8.2 released > > Ivelin, > > > >Thanks for hammering on XMLForm and sending more valuable feedback. > > Glad you understand I'm trying to help make XMLForm better. I plan to > be much more critical when I get caught up; I've been doing lots of > twisted things with XMLForm I haven't had time to discuss. Of course, > I wouldn't be expending all this effort if I didn't think XMLForm > was *very* cool: > 1) Amazing, hard-to-believe, validation speed. Sometimes I > validate things just to watch it happen. Seems 5-10 times faster > than anything else I have used. Really, really fast. That was the reason why I've opted to replace the original xslt based implementation with a java version. Kudos to Dmitri and his JXPath. > 2) Easy to learn Schematron rules. I'm not entirely convinced > Schematron is the total answer, but at least you can get validation > "up and running" with a minimum of effort. Exactly. That's the gist of Schematron. Start easy and grow on demand. > 3) Flexible, loosely coupled violation reporting. Presentation > component is just given a <violations> container and can decide for itself > what to do with its contents: display violations at top of the screen, > next to widget, inside a javascript alert, within a separate window, inside > a pop-up layer, etc, etc. Nice SoC. > 4) Demo's well. This is more important than you would think > because of Cocoon's "unpolished" appearance, lack of documentation, > white papers, market "presence" etc. Non-techies aren't interested in > Cocoon's intellectual beauty. They just want to see impressive results. Agreed. Heidi is writing a Howto document, which I can't wait to commit. > 5) Overall "potential". I mention this only because I have > been able to trick XMLForm into doing things you probably never intended > it to do. This makes me believe that other, more clever individuals > could develop XMLForm into a really complete forms solution. Sort of > a "critical app" for the web-application-server side of cocoon. Very curious to see these "tricks". > > But all this is sort of OT... > > >> I am having problems writing Schematron rules for multiple-select widgets.For > >> example, imagine you have an <xf:selectMany ref="/color"> widget which > presents > >> as a set of four checkboxes whose captions are "red", "blue", "green", and > >> yellow". You want to write two validation rules 1) At least one color must > be > >> selected and 2) No more than two colors may be selected. > > > >As a side note, you may consider using a radio button group. > > I need a many-of-many selector. Radio button group is one-of-many (selectOne). Silly me. > > >You might not have noticed, but I have patched XMLForm to support selectMany > >for multiple select controls, > >but not for a set of checkboxes. It seemed like a set of checkboxes cannot > >be universally rendered because of the layout issue you pointed out (which > >side of the box to place the text). > > Yeah, didn't notice that. Don't think you can avoid implementing selectMany > as checkbox set. Almost none of our customers use multiple select listbox > for selectMany: they all use checkbox sets. And the reason is *because* > of the flexible (i.e., nightmarish) layout possibilities. You can arrange > checkbox sets horizontal or vertical, have lots of white-space or explanatory > text where needed, align them to arbitrary grids, etc, etc. The result is > that they convey information visually better than multiple-select lists. Understood. I have an idea how to refactor the implementation and patch it back in. Will send a notification when ready. > > But implementation is painful. > > ><xf:repeat nodeset="/color"> > > <xf:selectBoolean ref="selected"/> > > <xf:output ref="displayText"/> > ></xf:repeat> > > >Provided that you have a collection of Color objects with 2 attributes: > >selected: boolean and > >displayText: String > > Clever. But shouldn't this just be a collection of simple boolean objects? > You're not saying to put displayText (==caption?) in the data model are you? Actually the displayText will have to be in the model in order for the repeat to match the checkboxes correctly to their labels. > > >The sample markup can be transformed in whatever layout is desired and it > >has a predictable serialization to html. > > Actually, anything that presents as a uncontained widget (a widget not in > its own bounding box) creates layout issues. So select list, multiple > select-list, > textarea, and textbox are pretty easy to deal with, because each has its own > bounding rectangle circumscribing the content. But all radio-button sets, > checkbox > sets, or boolean widgets have layout issues because they can be rendered in > so many ways. I have seen radio buttons arranged every which way; same with > checkboxes. Even booleans: "click here to toggle foo" where widget may be > above, below, right, or left of caption, and seperated from caption > by arbitrary amount of "white space" ! True. We can use the multi box tag as a reality check for introducing such controls within the framework vs. custom implementations. > > <snip /> > > >If you the example above suites your needs. The rules can be rewritten to: > > > > <rule context="/"> > > <assert test="count(color[selected='true'])=1">Exactly one > >color must be > > selected.</assert> > > </rule> > > > >This is a global rule which applies for all nodes and logicly belongs to the > >global context. > >If you need a rule that is specific for each color, then we can think of a > >local color context. > > I understand your argument about this being a global rule, but I don't entirely > agree. The rule is not about a relationship among completely unrelated instance > nodes. The nodes are part of one logical group (and are often presented as > such). > So a rule that says "CLASS_RANK must be <= CLASS_SIZE" I see as "global" because > 1) two different instance nodes and 2) not possible to decide whether to display > the violation message near CLASS_RANK widget or near CLASS_SIZE widget. But > checkbox > group is often a logical and visual unit, so even though there *may* be > different > instance nodes, it is usually possible to decide where to display violation > message. > Which is just what I want to do: > > <xf:selectMany selectUIType="checkboxGroup"> > <xf:item>...</xf:item> > <violations class="error" /> > </xf:selectMany> > > It seems to me that I should be able to bind a "violations" container to this > widget > without regard to its presentation style (selectUIType). Agreed. Point taken. > > >> Is there a compelling reason to use a SortedSet for violations? (cursory > >> examination of code suggests "yes", but...). Global violations end up > >sorted > >> alphabetically. Makes it difficult to display them in document order (the > >> "natural" order IMHO). > > >The driving force was that it is easy to enumerate all violations related to > >a node when they are kept in a sorted set. > > Thought it might be something like that. But I have this beautiful form wherein > all errors are displayed in a nicely formatted section at top of page. Each > violation message serves as a link which 1) takes user right to the place on the > form where the error occurred, 2) selects the contents of the widget, and 3) > places > the text-insert cursor at the appropriate location. Trouble is, everybody I > have > showed this to expects list of error messages to be in *document* order: they > don't > understand why they are in alphabetical order. If you retained document order, > user could apply <xsl:sort> to impose any order they wish: once you destroy > the original ordering information there is no going back... Good point. I was thinking that when you want to highlight the association, you would place the violations near the failing fields. Will consider an implementation which preserves the document order. > > >> Do you plan to support Schematron <report> element? Would make it easierto > >> write rules like "/foo is invalid if it contains any of the following > >> characters: #, &, *, %", or "/foo may contain only digits 0-9 and decimal > >> point". > > >>Report is supported. Report is simply a negation of assert. > > Just double checked this again. Report doesn't work for me. This works: > <assert test="contains(not(.,'$'))"> > but this doesn't: > <report test="contains(.,'$')"> I've tested it a bit but maybe there is a bug. Feel free to save XMLForm again :) The implementation is one line, so I can't immediately see where the problem might be. > > I realize report is just not(assert). But sometimes it is more clear to describe > what should *not* be in a field than what *should* be in a field. Like "any char > but one of {!,@,#,$,%,^,&,*,(,),_,+.=,-.}" You may also wish to use *both* > assert > and report, for example /PHONE must *include* {0,1,2,3,4,5,6,7,8,9} and > *exclude* > "555" in chars 1-3 (No U.S. phone numbers begin with a "555" exchange). > > Does <report> work for you? > > >> > >> Is there any way to implement Schematron <name> and <value-of> elements? > > <snip/> > > >You should be able to use xml markup withing the assert and then transform > >it into the actual node value. > > > ><assert >cannot contain <myns:name/> </assert> > > This would be *great* !! But unfortunately, doesn't work for me. Thought it > might be because I my tags didn't have their own namespace so I tried: > <assert test=".!=''">Please provide a <cnet:some_tag /></assert> > but the <some_tag> element just gets stripped out (by the validation > transformer?). Strange. Not intentional. Maybe another bug that waits to be busted. Thanks for all your cooperation, Ivelin > > > Cheers, > --Michael > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, email: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]