XForms重复函数中根节点的值设置问题
解决XSLTForms重复列表中初始化值的问题
嘿Ralph,看了你的代码,问题大概率出在节点层级的引用和插入逻辑不匹配上。咱们一步步拆解下:
核心问题分析
你现在直接插入placeName节点到现有place下,但从TEI的结构和重复列表的逻辑来看,place应该是重复条目的根容器,placeName是它的子节点。直接插入placeName会破坏结构,也导致后续的setvalue定位容易出错。
具体修复方案
1. 先插入完整的place条目,再设置子节点值
这是最常见的正确流程:先新增一个place容器节点,再定位到它下面的placeName来设置值和属性:
<xf:trigger> <xf:label>New place name</xf:label> <xf:action ev:event="DOMActivate"> <!-- 插入新的place容器节点 --> <xf:insert ref="instance('place')/listPlace/place" at="index('repeat')" position="after"/> <!-- 定位到刚插入的place下的placeName,设置值和属性 --> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName">placename</xf:setvalue> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName/@type">your-default-type</xf:setvalue> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName/@lang">en</xf:setvalue> </xf:action> </xf:trigger>
2. 确保实例文档结构正确
如果你的place实例里,新插入的place节点默认没有placeName子节点,那得先插入placeName再赋值:
<xf:trigger> <xf:label>New place name</xf:label> <xf:action ev:event="DOMActivate"> <xf:insert ref="instance('place')/listPlace/place" at="index('repeat')" position="after"/> <!-- 先给新place插入placeName节点(用第一个条目作为模板) --> <xf:insert ref="instance('place')/listPlace/place[last()]" origin="instance('place')/listPlace/place[1]/placeName"/> <!-- 再设置值和属性 --> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName">placename</xf:setvalue> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName/@type">your-default-type</xf:setvalue> <xf:setvalue ref="instance('place')/listPlace/place[last()]/placeName/@lang">en</xf:setvalue> </xf:action> </xf:trigger>
3. 用变量简化引用(XSLTForms专属技巧)
XSLTForms支持用变量存储刚插入的节点,避免重复写冗长的路径,更不容易出错:
<xf:trigger> <xf:label>New place name</xf:label> <xf:action ev:event="DOMActivate"> <xf:insert ref="instance('place')/listPlace/place" at="index('repeat')" position="after"/> <!-- 把新插入的place节点存到变量里 --> <xf:var name="newPlace" value="instance('place')/listPlace/place[last()]"/> <!-- 直接用变量引用子节点 --> <xf:setvalue ref="$newPlace/placeName">placename</xf:setvalue> <xf:setvalue ref="$newPlace/placeName/@type">your-default-type</xf:setvalue> <xf:setvalue ref="$newPlace/placeName/@lang">en</xf:setvalue> </xf:action> </xf:trigger>
4. 检查重复控件的绑定
最后确认你的重复控件是绑定到place节点的,比如:
<xf:repeat id="repeat" ref="instance('place')/listPlace/place"> <xf:input ref="placeName"> <xf:label>Place Name</xf:label> </xf:input> <xf:select1 ref="placeName/@type"> <xf:label>Type</xf:label> <xf:item> <xf:label>City</xf:label> <xf:value>city</xf:value> </xf:item> </xf:select1> </xf:repeat>
如果重复控件绑定的是placeName,那插入逻辑也要对应调整,但通常用place作为重复根更符合TEI结构和表单逻辑。
试试上面的方案,应该就能解决你初始化placeName值的问题啦~
内容的提问来源于stack exchange,提问作者Ralph Corrigan
相关产品推荐
相关产品推荐

