Hello members,
I have a situation where I would like to copy/clone the response-body to
a instance, so I wrote this code.
<xf:instance id="customer"> <!-- instance to submit -->
<r xmlns="">
<name/>
<email/>
</r>
</xf:instance>
<xf:instance xmlns="" id="messages"> <!-- instance to hold the
error messages -->
<messages>
<xforms-submit-error>
<error-type/>
<response-body/>
</xforms-submit-error>
</messages>
</xf:instance>
<xf:action ev:event="xforms-submit-error">
<xf:setvalue
ref="instance('messages')/xforms-submit-error/error-type"
value="event('error-type')"/>
<xf:insert
context="instance('messages')/xforms-submit-error/response-body"
nodeset="dummy"
origin="event('response-body')"/>
</xf:action>
However, when the instance customer is submitted and the server answer
with a HTTP error message 403 and this content
<error module="/home/jvv/basex/webapp/saveCustomer.xqm"
code="err:XUTY0013" value="" line="70" column="9">
<desc>Source expression in copy clause must return a single node.</desc>
</error>
the instance "instance('messages')/xforms-submit-error/error-type" is
updated correctly with value 'resource-error' but the instance
"instance('messages')/xforms-submit-error/response-body" remains unchanged.
After a lot a tries I decided to follow the xsltforms.js with the
debugger and found that it fails in function
XsltForms_insert.prototype.run. It fails when try to insert the clone
node with DOM method appendChild (or insertBefore, it depends on target)
XsltForms_insert.prototype.run = function(element, ctx) {
...
} else {
var nodeAfter;
if (index >= nodes.length && nodes.length !== 0) {
nodeAfter = nodes[nodes.length - 1].nextSibling;
} else {
nodeAfter = nodes[index];
}
if (nodeAfter) {
nodeAfter.parentNode.insertBefore(clone, nodeAfter);
} else {
parent.appendChild(clone);
}
var repeat = nodes.length > 0?
XsltForms_browser.getMeta(nodes[0], "repeat") : null;
nodes.push(clone);
if (repeat) {
document.getElementById(repeat).xfElement.insertNode(clone, nodeAfter);
}
}
...
After inspect the parent and clone I found the clone is a DocumentNode
and not a Element or Attribute node and though that should be the reason
to fail.
As I needed to overcome this, I did some more debug and found this line
in xsltforms.js
evcontext["response-body"] =
[XsltForms_browser.createXMLDocument(req.responseText)];
in function XsltForms_submission.requesteventlog. So I changed it to
evcontext["response-body"] =
[XsltForms_browser.createXMLDocument(req.responseText).documentElement];
and now it works as I expected, however I don't now if I found a bug in
XSLTFORMS or if I am using the xforms insert in a wrong way.
I though it could be my mistake trying to insert a DocumentNode into a
element Node. So I did try first to change the xpath expression in
input's origin attribute as this
<xf:insert
context="instance('messages')/xforms-submit-error/response-body"
nodeset="dummy"
origin="event('response-body')/*"/>
but it gave a Xsltforms exception
XSLTForms Exception
--------------------------
Error evaluating the following XPath expression :
event('response-body')/*
TypeError
node.selectSingleNode(...) is null
Another idea I had was try to set the target as an instance root, so I
did this
<xf:insert
nodeset="instance('messages')"
origin="event('response-body')"/>
But it just wiped the entire instance.
So my problem now is: can I assume this is a xsltforms and fix it as I
did above or am I using the xforms insert element in the wrong way.
Here is my complete xforms example
<?xml-stylesheet type="text/xsl" href="./xsltforms/xsltforms.xsl"?>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:saf="urn:OECD:StandardAuditFile-Tax:PT_1.03_01"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:sxf="http://serprest.pt/xpath-functions"
sxf:bogus="Workaround for FF's bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=94270">
<head>
<title>Edit customer</title>
<link type="text/css" rel="stylesheet" href="/static/style.css"/>
<xf:model>
<xf:instance id="customer">
<r xmlns="">
<name/>
<email/>
</r>
</xf:instance>
<xf:instance xmlns="" id="messages">
<messages>
<xforms-submit-error>
<error-type/>
<response-body/>
</xforms-submit-error>
</messages>
</xf:instance>
<xf:submission id="saveCustomer"
resource="/saveCustomer"
method="put"
ref="instance('customer')"
replace="instance"
instance="customer"/>
<xf:submission id="showErrors"
resource="/sendMessagesErrors"
method="put"
ref="instance('messages')"
replace="none"/>
<xf:action ev:event="xforms-submit-error">
<xf:setvalue
ref="instance('messages')/xforms-submit-error/error-type"
value="event('error-type')"/>
<xf:insert
context="instance('messages')/xforms-submit-error/response-body"
nodeset="dummy"
origin="event('response-body')"/>
</xf:action>
</xf:model>
</head>
<body>
<div id="body">
<div class="actions">
<xf:submit submission="saveCustomer">
<xf:label>Ok</xf:label>
</xf:submit>
<xf:submit submission="showErrors">
<xf:label>ShowErrors</xf:label>
</xf:submit>
</div>
<xf:group ref="instance('customer')" class="customerEdit">
<xf:input ref="name"/>
<xf:input ref="email"/>
</xf:group>
</div>
</body>
</html>
(The submission showErrors is just used to send messages instance out o
browser and see them with firebug in network panel.)
Thanks in advance for your help
|
|
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Xsltforms-support mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xsltforms-support