Passing parameters to XBL in Orbeon

275 views Asked by At

I've created these two simple files , view.xhtml :

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xh="http://www.w3.org/1999/xhtml"
  xmlns:xf="http://www.w3.org/2002/xforms"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fr="http://orbeon.org/oxf/xml/form-runner"
  xmlns:ev="http://www.w3.org/2001/xml-events"
  xmlns:xxf="http://orbeon.org/oxf/xml/xforms">
<head>
    <title>Test</title>
    <xf:model>

        <!-- Instance that contains all the books -->
        <xf:instance id="people-instance">
            <people xmlns="">
                <person>
                 <test/>
                </person>
            </people>
        </xf:instance>
    <xf:bind id="test-bind" name="test" ref="person/test"/>
    </xf:model>

</head>
<body>
<xf:input id="test-control" bind="test-bind">
    <xf:label>THIS</xf:label>
</xf:input>
<fr:my-name test="'test'">
</fr:my-name>       
</body>

And my-name.xbl :

<xbl:xbl xmlns:xh="http://www.w3.org/1999/xhtml"
     xmlns:xf="http://www.w3.org/2002/xforms"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:ev="http://www.w3.org/2001/xml-events"
     xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
     xmlns:fr="http://orbeon.org/oxf/xml/form-runner"
     xmlns:xbl="http://www.w3.org/ns/xbl"
     xmlns:xxbl="http://orbeon.org/oxf/xml/xbl"
     xmlns:fb="http://orbeon.org/oxf/xml/form-builder">

<xbl:binding element="fr|my-name" id="fr-my-name" xxbl:mode="lhha binding value">
    <metadata xmlns="http://orbeon.org/oxf/xml/form-builder" xmlns:xf="http://www.w3.org/2002/xforms">
    <templates>
          <view>
               <fr:my-name id="" appearance="minimal"   xmlns="" test="" >
               </fr:my-name>        
           </view>
     </templates>

     <xf:input ref="@test">
        <xf:label lang="en">Resource URI</xf:label>
      </xf:input>

    </metadata> 

    <xbl:template>
        <!-- Local model and instance -->
    <xf:var name="test-avt" xbl:attr="xbl:text=test" xxbl:scope="outer"/>
        <xf:var name="test" xbl:attr="xbl:text=test" >
        <xf:action ev:event="xforms-enabled xforms-value-changed">
            <xf:setvalue ref="instance('test')" value="$test"/>
        </xf:action>
      <xxf:sequence value="xxf:evaluate-avt($test-avt)" xxbl:scope="outer"/>
      </xf:var>
    <xf:model>
       <xf:instance id="test"><value/></xf:instance>
       <xf:instance><value/></xf:instance>
       <xf:submission id="save-submission" ref="instance('test')"   
                action="/exist/rest/db/orbeon/my-name/person.xml"
                method="put" replace="none">
                <xf:message ev:event="xforms-submit-error" level="modal">An error occurred while saving!</xf:message>
            </xf:submission>

     </xf:model>

    <xf:input class="xforms-disabled" ref="xxf:instance('people-instance')//*[name() = saxon:evaluate($test)]" >
        <xf:label>Your name</xf:label>
        <xf:send ev:event="xforms-value-changed" submission="save-submission"/> 
    </xf:input>

  </xbl:template>
</xbl:binding>

Now I would like pass parameters from my view.xhtml to XBL so when user inserts something in xf:input id='test-control' it would cause that the text will be saved in database. The problem is, instead of what user actually inserted in my database I have :

<value>'test'</value>

instead of expected, f.e. if I insert 123

<value>123</value>

Anyone has any idea why my code doesn't work and how to fix this ?

1

There are 1 answers

6
ebruchez On BEST ANSWER

Here is an example which works. I put both files together to make it easier to try.

A few things I changed:

  • If your test attribute is in fact an AVT, it shouldn't have quotes around it. So you have for example test="foo{42}" which evaluates to foo42, which, if I understand well, is the name of the XML element you want to observe.
  • You probably don't want saxon:evaluate($test): the AVT is already evaluated and the result available in the variable $test. There is no point evaluating the result as an XPath expression again.
  • The 2nd var must not have xbl:attr="xbl:text=test"
  • Optional: I used xxf:binding-context('fr-my-name')/root() instead of xxf:instance(), but xxf:instance() will work too (although its usage is not recommended).
  • Optional: I moved the XBL model under xbl:implementation. It makes it clearer that this is not dependent on the template.