Never mind; I fixed it. See http://issues.apache.org/bugzilla/show_bug.cgi?id=28723 for the patch.

Luigi Bai wrote:
Any ideas?

Luigi Bai wrote:

I'm having a problem with XMLDBTransformer sending an xupdate to an XMLDB database. I'm pretty sure others are using this successfully, so I'm not sure what I'm doing wrong.

I'm using a generator to output a document that looks like this (confirmed with ?cocoon-view=content):

<?xml version="1.0" encoding="ISO-8859-1"?>
<ax:query type="update" oid="setings.xml" xmlns:ax="http://apache.org/cocoon/xmldb/1.0";>
<xu:modifications version="1.0" xmlns:xu="http://www.xmldb.org/xupdate";>
<xu:append select="/auth/login">
<user name="user" uid="7" password="pickle" home="">
<group>users</group>
</user>
</xu:append>
<xu:update select="/auth/login/@last-uid">7</xu:update>
</xu:modifications>
</ax:query>


XMLDBTransformer correctly identifies the outer element and creates its ContentHandler for the inner one, a transformer(org.apache.xalan.transformer.TransformerIdentityImpl from Xalan 2.6.0) with a new StreamResult around a StringWriter. Once the endElement is seen for ax:query, the inner ContentHandler is sent an endDocument(), and the StringWriter is asked to produce its string to be sent to the target XUpdateQueryService. However, the string (serialized XML) lackes any xmlns Attributes, which causes at least eXist's SAX parser to throw an Exception.

String:
<xu:modifications version="1.0">
<xu:append select="/auth/login">
<user name="user" uid="7" password="pickle" home="">
<group>users</group>
</user>
</xu:append>
<xu:update select="/auth/login/@last-uid">7</xu:update>
</xu:modifications>

throws:
[Fatal Error] :1:33: The prefix "xu" for element "xu:modifications" is not bound.
org.xml.sax.SAXParseException


I've tried, in my cocoon.xconf, to do the following for namespaces; I turned "namespace-prefixes" on:

<xml-parser class="org.apache.excalibur.xml.impl.JaxpParser" logger="core.xml-parser" pool-grow="4" pool-max="32" pool-min="8">
<parameter name="validate" value="false"/>
<parameter name="namespace-prefixes" value="true"/>
<parameter name="stop-on-warning" value="true"/>
<parameter name="stop-on-recoverable-error" value="true"/>
<parameter name="reuse-parsers" value="true"/>
<parameter name="drop-dtd-comments" value="true"/>
</xml-parser>


Also, I modified XMLDBTransformer() to explicitly set the Output.METHOD to "xml":

    public XMLDBTransformer() {
        format.put(OutputKeys.ENCODING, "utf-8");
        format.put(OutputKeys.INDENT, "yes");
        format.put(OutputKeys.OMIT_XML_DECLARATION, "yes");
        format.put(OutputKeys.METHOD, "xml");
    }

I have a feeling it's not the Transformer nor the XMLParser which are the problem, for two reasons. One, the cocoon-view=content properly shows the namespaces, so the xml serializer there seems to work fine. Second, in XMLDBTransformer.startElement() I traced the arguments, and saw:
Putting prefix ax as URI http://apache.org/cocoon/xmldb/1.0
Putting prefix xu as URI http://www.xmldb.org/xupdate
Queryhandler is getting #http://www.xmldb.org/xupdate#, loc#modifications#, raw#xu:modifications#, 1 attributes.


Queryhandler is getting #http://www.xmldb.org/xupdate#, loc#append#, raw#xu:append#, 1 attributes.

Queryhandler is getting ##, loc#user#, raw#user#, 4 attributes.

Queryhandler is getting ##, loc#group#, raw#group#, 0 attributes.

Queryhandler is getting #http://www.xmldb.org/xupdate#, loc#update#, raw#xu:update#, 1 attributes.

By looking at the count of attributes on each element, I don't see an explicit "xmlns" attribute being passed through - but I do see the startPrefixMapping happening, so I'm fine with that.

Any suggestions? After all that, it's probably something pretty simple I'm missing. :-(






--
<A HREF="http://www.focalpoint.com/";>Home Page</A>
education is what's left after what is learned is forgotten.
                               -- b f skinner
Luigi P. Bai                   Focal Point Software, Inc.
[EMAIL PROTECTED]             3701 Kirby Drive, Suite 512
turning data into information  Houston, TX   77098
                               (713) 215-1600 x 33#



Reply via email to