我真的在与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
?
答案 0 :(得分:1)
首先,根据所选择的节点列表评估position()函数,在这个例子中,由于谓词,只有一个元素。可以使用count()函数,如&#34; count(preceding-sibling :: bar)+ 1&#34;。
关于操作,需要ev:event属性来判断何时执行操作。
答案 1 :(得分:1)
关于您的代码的一些注释:
head
元素下,但允许实现将模型放在其他位置。sel
的值设置为2
,因为您将使用带有标签&#34;错误&#34;的单个项目进行下拉控件。和价值2
。但是没有代码将sel
的值设置为2
。这是因为只有当用户更改下拉列表中的选定值时,该值才会更改,但由于只有一个项目,用户无法执行此操作。refresh
操作。完成对数据模型的更改后,视图将自动刷新。trigger
就像select1
:core form control。ev:event
属性做出反应的事件(或者使用某些实现的普通event
)。您的action
操作没有ev:event
属性,因此无论如何都不会运行。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>