XForms:使用select元素获取模型中项的位置

时间:2015-10-25 03:52:36

标签: xforms

我真的在与XForms斗争。这段代码有两个问题。我的刷新操作无效,我的position()值无法正常工作。我找不到任何文档来指定哪些元素允许/需要彼此嵌套。似乎XForms具有大量的功能,但我无法得到任何东西。这只是设置" sel" 2.我还试过" value =" instance(' foo')/ bar [index(' ns')] / position() " "因为我不确定只有ref属性是否继承了一个上下文节点。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xf="http://www.w3.org/2002/xforms">
<body>
    <xf:model id="master">
        <xf:instance xmlns="" id="test">
            <foo>
                <bar>test</bar>
                <bar>error</bar>
                <sel>1</sel>
            </foo>
        </xf:instance>
    </xf:model>
    <xf:output ref="sel"/>
    <xf:select1 id="sl" ref="instance('test')/sel">
        <xf:itemset id="ns" nodeset="instance('test')/bar[.='error']">
            <xf:label ref="."/>
            <xf:value value="./position()"/>
        </xf:itemset>
        <xf:action>
            <xf:refresh model="master"/>
        </xf:action>
    </xf:select1>
</body>
</html>

任何关于所有XForms元素的规则和类别的文献也将受到赞赏。 http://www.w3.org/TR/xforms/确保它看起来像select元素,而trigger元素是类似的东西。但如果是,为什么我的刷新工作在trigger而不是select

2 个答案:

答案 0 :(得分:1)

首先,根据所选择的节点列表评估position()函数,在这个例子中,由于谓词,只有一个元素。可以使用count()函数,如&#34; count(preceding-sibling :: bar)+ 1&#34;。

关于操作,需要ev:event属性来判断何时执行操作。

答案 1 :(得分:1)

关于您的代码的一些注释:

  • 通常,XForms模型放在HTML head元素下,但允许实现将模型放在其他位置。
  • 我无法看到您的代码如何将sel的值设置为2,因为您将使用带有标签&#34;错误&#34;的单个项目进行下拉控件。和价值2。但是没有代码将sel的值设置为2。这是因为只有当用户更改下拉列表中的选定值时,该值才会更改,但由于只有一个项目,用户无法执行此操作。
  • 在XForms中,您很少需要明确的refresh操作。完成对数据模型的更改后,视图将自动刷新。
  • 是的,trigger就像select1core form control
  • 所有XForms操作都需要告诉他们对ev:event属性做出反应的事件(或者使用某些实现的普通event)。您的action操作没有ev:event属性,因此无论如何都不会运行。
  • XForms现在建议始终使用ref而不是nodeset。一些实现已经支持。
  • position() XPath表达式有时很棘手,因为它只能在XPath上下文位置之后工作。使用Orbeon,在显示作品时使用position()。但如果不是,您也可以尝试使用count(preceding::bar) + 1计算位置。

以下适用于Orbeon,因为我已将您的项目集指向两个bar元素,如果用户更改了选择,则sel中的值会发生变化。无需显式操作或刷新,因为下拉列表会在更改时将其值写入sel元素。

<html
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xf="http://www.w3.org/2002/xforms">
    <head>
        <xf:model id="master">
            <xf:instance xmlns="" id="test">
                <foo>
                    <bar>test</bar>
                    <bar>error</bar>
                    <sel>1</sel>
                </foo>
            </xf:instance>
        </xf:model>
    </head>
    <body>
        <xf:output ref="sel"/>
        <xf:select1 id="sl" ref="sel">
            <xf:itemset id="ns" nodeset="instance('test')/bar">
                <xf:label ref="."/>
                <xf:value value="position()"/>
            </xf:itemset>
        </xf:select1>
    </body>
</html>