oh blast, sorry for being so bone-headed, but I really needed your example here... you refer to the document-order of the node!
so not just about the creation of the new node, but creating it at a very specific place....
only way out (for now) seems to be to get into writing your own custom DOMfactory that knows about your specific document
(see over at o.a.c.util and register that on the JXPAthContext before handing it over to the binding using some javascript that looks like this:)
example snatched from a recent posting on cocoon-dev: see http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107062994517119&w=2
in the flow, don't load/save the DOM directly, but through a JXPathContext as follows;
var doc = readDocument(url); var bindingCtx = createBindingContext(doc); form.load(bindingCtx); form.showForm("pipeline"); form.save(bindingCtx);
And here's the createBindingContext function:
function createBindingContext(document) {
// Create a JXPath context on the document.
var xpathContext = Packages.org.apache.commons.jxpath.JXPathContext.newContext(document);
you should replace this by instantiating your own implementation of the Factory interface for jxpath (see here: http://jakarta.apache.org/commons/jxpath/apidocs/org/apache/commons/jxpath/AbstractFactory.html)
you should find some hints for doing this in the current implementation of the generic (but simply adding at the end) DOMFactory implementation over at:
http://cvs.apache.org/viewcvs.cgi/cocoon-2.1/src/java/org/apache/cocoon/util/jxpath/DOMFactory.java?rev=1.1&view=auto
in case you get tempted in doing the generic implementation for any possible DTD, then be sure to send in the patch :-)
// Set it to lenient
xpathContext.setLenient(true);
// Add the necessary factory create elements and attributes as needed on non-existing paths
xpathContext.setFactory(new Packages.org.apache.cocoon.util.jxpath.DOMFactory());
return xpathContext;
}
HTH, -marc=
Markus Heussen wrote:
-----Ursprüngliche Nachricht----- Von: Marc Portier Gesendet: Montag, 22. Dezember 2003 12:41 An: [EMAIL PROTECTED] Betreff: Re: AW: AW: AW: [Woody] Binding problem for missing elements in source file
Markus Heussen wrote:
Many thanks to you, now everything works fine :-)
yeah, we get there *eventually*
But two questions I still have:
1. Is it possible to control the position where nodes will be
created within
a context? Sometimes this is necessary if the xml schema defines the sequence of nodes.
could you be more specific?
naieve first thought: the @path attribute of the wb:context has precisely this purpose
(given your previous questions and remarks that sounds like a too simplistic answer though)
My source file contains something like this: ... <v:Person Rolle="Versicherungsnehmer"> <v:Anrede Schlüssel="1"/> <!-- here a v:Titel node is missing --> <v:Vorname>firstname</v:Vorname> <v:Name>name</v:Name> <v:Anschrift> <v:Straße>street</v:Straße> <v:Plz>12345</v:Plz> <v:Ort>location</v:Ort> </v:Anschrift> <v:Geschlecht Schlüssel="1"/> <v:Geburtsdatum>0000-00-00</v:Geburtsdatum> <v:Familienstand Schlüssel="1"/> <v:Staatsangehörigkeit>D</v:Staatsangehörigkeit> ... </v:Person> ...
And here is my binding: ... <wb:context path="v:Partner/[EMAIL PROTECTED]'Versicherungsnehmer'][1]"> <wb:value id="vn_anrede" path="v:Anrede/@Schlüssel" lenient="true"/> <wb:value id="vn_titel" path="v:Titel" lenient="true"/> <wb:value id="vn_vorname" path="v:Vorname" lenient="true"/> <wb:value id="vn_name" path="v:Name"/> <wb:value id="vn_namenszusatz" path="v:Namenszusatz" lenient="true"/> <wb:context path="v:Anschrift"> <wb:value id="vn_strasse" path="v:Straße" lenient="true"/> <wb:value id="vn_plz" path="v:Plz"/> <wb:value id="vn_ort" path="v:Ort"/> </wb:context> ... </wb:context> ...
After submission the v:Titel node is recognized as missing and will be created as the last node of the context. So my result looks like this:
... <v:Person Rolle="Versicherungsnehmer"> <v:Anrede Schlüssel="1"/> <!-- here the v:Titel node has to be created --><!--<v:Titel>Dr.</v:Titel>--> <v:Vorname>firstname</v:Vorname> <v:Name>name</v:Name> <v:Anschrift> <v:Straße>street</v:Straße> <v:Plz>12345</v:Plz> <v:Ort>location</v:Ort> </v:Anschrift> <v:Geschlecht Schlüssel="1"/> <v:Geburtsdatum>0000-00-00</v:Geburtsdatum> <v:Familienstand Schlüssel="1"/> <v:Staatsangehörigkeit>D</v:Staatsangehörigkeit> ... <!-- here the node was created --><v:Titel>Dr.</v:Titel> </v:Person> ...
But the W3C schema not allows this position for this node because the sequence of the nodes has to be like this:
... <v:Person Rolle="Versicherungsnehmer"> <v:Anrede Schlüssel="1"/> <v:Titel>Dr.</v:Titel> <v:Vorname>firstname</v:Vorname> <v:Name>name</v:Name> <v:Anschrift> <v:Straße>street</v:Straße> <v:Plz>12345</v:Plz> <v:Ort>location</v:Ort> </v:Anschrift> <v:Geschlecht Schlüssel="1"/> <v:Geburtsdatum>0000-00-00</v:Geburtsdatum> <v:Familienstand Schlüssel="1"/> <v:Staatsangehörigkeit>D</v:Staatsangehörigkeit> ... </v:Person> ...
Is there a way woody supports this? A workaround can be a transformation of the result message that constructs the xml document that is valid against the schema. But that's not my favor :-(
Thank you for your help!
Markus
2. If the input of a date form field is for example "31.02.2004" after submission this value is automatically set to "02.03.2004". How
can I change
this behavior? Is there a attribute I can set in the woody binding or definition file to get the behavior like using the "setLenient(false)" method of the class SimpleDateFormat?
not yet, see other thread where you originally posted this...
Thanks for helping me!
de nada,
-marc=
Greetings, Markus
-----Ursprüngliche Nachricht----- Von: Marc Portier Gesendet: Samstag, 20. Dezember 2003 16:08 An: [EMAIL PROTECTED] Betreff: Re: AW: AW: [Woody] Binding problem for missing elements in source file
Yo, all.
answer is in the combination of using - @lenient (for surviving reads from paths that don't exist yet) - and the o.a.c.util.jxpath.DOMFactory (for creating new paths on the target XML)
for some mysterious reason one of my commits messed up the auto-registry of that factory on Nodes, fixed now.
regards, -marc=
Markus Heussen wrote:
-----Ursprüngliche Nachricht----- Von: Upayavira [mailto:[EMAIL PROTECTED] Gesendet: Donnerstag, 18. Dezember 2003 12:12 An: [EMAIL PROTECTED] Betreff: Re: AW: [Woody] Binding problem for missing elements
in source
file
Markus Heussen wrote:
-----Ursprungliche Nachricht----- Von: Upayavira Gesendet: Mittwoch, 17. Dezember 2003 16:49 An: [EMAIL PROTECTED] Betreff: Re: [Woody] Binding problem for missing elements in
source file
Markus Heussen wrote:
Hi all.
I'm new to the Woody framework but till now it works fine
for me. But I
have
one problem I don't know how to solve at best :-(
I get the following exception when I submit the form:
org.apache.cocoon.woody.binding.BindingException: Problem
binding field
vn_titel (parent = "") to xpath v:Titel (context xpath = "/soap-env:Envelope[1]/soap-env:Body[1]/v:Versicherung[1]/v:Par
tner[1]/v:P
er
son[1]")
org.apache.commons.jxpath.JXPathException: No value for
xpath: v:Titel
The field is defined in the form definition file and a
binding is also
defined in the woody binding file. But in one case there is no
corresponding
XML tag in my source file. In other case there is one. I
have to create
the
element if it is missing. So how can I manage this
situation at best?
Who can point me to the right direction?
Not sure if I'm right here, but I think you need 'lenient'
jxpath within
binding - this means that, if jxpath doesn't find a node, it
ignores it,
rather than causing an exception.
But this is not exactly what I have to do. If there is no node
in the source
file I have to create this node before the binding saves it
back to the
source. How can I manage this at best? I have no experience in
using the
woody framework. When I set @readonly to true within the
binding I get no
exceptions because there is no saving process. But in fact I
have to save
it. I tried something around <wb:insert-node/> but it didn't work :-( <wb:delete-node/> does what I expected.
Anyone there who can give me a hint? I really need this feature.
I'm no expert either, and I've never used binding. I am talking about 'lenient' not 'readonly' or 'direction'. It was committed
into CVS this
morning, here's a snippet from the status.xml file:
<action dev="MPO" type="add" > Changed semantics on the cforms binding. Added a @direction (which replaces the @read-only) and a @lenient attribute on all binding implementations in the pool. </action>
Still don't know if this is what you're after.
Regards, Upayavira
I spend some time learning more about this lenient thing and
meanwhile I use
a current developer version (about two hours old) for my application.
But still it doesn't work :-( Maybe somebody can explain what I'm doing wrong. I have something like this:
woody binding: <wb:value id="vn_titel" path="v:Titel" lenient="true"/>
woody field: <wd:field id="vn_titel" required="false"> <wd:label>Titel</wd:label> <wd:datatype base="string"/> </wd:field>
On submit I get the following exception:
org.apache.commons.jxpath.JXPathException: Exception trying to
create xpath
v:Titel; Factory is not set on the JXPathContext - cannot create path:
/soap-env:Envelope[1]/soap-env:Body[1]/v:Versicherung[1]/v:Partner [1]/v:Pers
on[1]
Though it was recognized that the v:Titel node is not present
in my source
file. But what's my mistake? I also tried to set the lenient
attribute on
the parent context element but I still get the exception.
I need your help because this feature is very basic for me.
Thanks for your help.
Markus
Markus
There has been discussion on the dev list about adding this over the last couple of days. I'm not sure if it is in CVS Cocoon yet, but I suspect it will be within a day or so.
Regards, Upayavira
Thanks for your help, Markus.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Marc Portier http://outerthought.org/ Outerthought - Open Source, Java & XML Competence Support Center Read my weblog at http://blogs.cocoondev.org/mpo/ [EMAIL PROTECTED] [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Marc Portier http://outerthought.org/ Outerthought - Open Source, Java & XML Competence Support Center Read my weblog at http://blogs.cocoondev.org/mpo/ [EMAIL PROTECTED] [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Marc Portier http://outerthought.org/ Outerthought - Open Source, Java & XML Competence Support Center Read my weblog at http://blogs.cocoondev.org/mpo/ [EMAIL PROTECTED] [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]