You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

xf:dispatch基于上下文节点的动态事件名称失效问题排查

XForms中Group/Repeat组件的上下文节点丢失问题

我尝试基于实例内容定义一组按钮,将动作置于模型中以简化视图结构,使用dispatch元素触发动态命名的事件(通过name元素)。

发现在group或repeat组件中节点上下文似乎丢失:测试用例里,硬编码显式XPath的场景可正常工作,但隐式或显式引用上下文节点的测试均失效。测试代码如下:

<?xml
    version="1.0"
    encoding="UTF-8"?>
<?xml-stylesheet
    href="declarative4all/build/xsl/xsltforms.xsl"
    type="text/xsl"?>
<?xsltforms-options
    debug="no"?>
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ht="http://www.w3.org/1999/xhtml"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xf="http://www.w3.org/2002/xforms"   
      xmlns:ev="http://www.w3.org/2001/xml-events"
      lang="en">
<head>
    <xf:model id="model">
        <xf:instance>
            <data xmlns="">
                <button name="b1" icon="arrow_upward"/>
                <button name="b2" icon="arrow_downward"/>
            </data>
        </xf:instance>

        <xf:action ev:event="b1">
            <xf:message>b1</xf:message>
        </xf:action>

        <xf:action ev:event="b2">
            <xf:message>b2</xf:message>
        </xf:action>

    </xf:model>
</head>
<body>
        <h1>TEST 1: hardcoded XPath in name element (works)</h1>

            <xf:trigger id="t1">
                <xf:label ref="button[1]/@name"/>
                    <xf:dispatch ev:event="DOMActivate">
                        <xf:targetid>model</xf:targetid>
                        <xf:name value="button[1]/@name"/>
                    </xf:dispatch>
            </xf:trigger>

        <h1>TEST 2: XPath implicit reference to context node (doesn't work)</h1>

        <xf:group ref="button[1]">
            <xf:trigger id="t2">
                <xf:label ref="@name"/>
                    <xf:dispatch ev:event="DOMActivate">
                        <xf:targetid>model</xf:targetid>
                        <xf:name value="@name"/>
                    </xf:dispatch>
            </xf:trigger>
        </xf:group>

        <h1>TEST 3: XPath explicit reference to context node (doesn't work)</h1>

        <xf:group ref="button[1]">
            <xf:trigger id="t3">
                <xf:label ref="context()/@name"/>
                    <xf:dispatch ev:event="DOMActivate">
                        <xf:targetid>model</xf:targetid>
                        <xf:name value="context()/@name"/>
                    </xf:dispatch>
            </xf:trigger>
        </xf:group>

</body>
</html>

已找到临时解决方案:由于按钮将置于repeat组件中,可使用index()函数定位正确节点,代码如下:

<xf:repeat id="r2" ref="button">
            <xf:input ref="@name"/>
            <xf:input ref="@icon"/>
            <xf:trigger>
                <xf:label ref="@name"/>
                <xf:action ev:event="DOMActivate">
                    <xf:dispatch>
                        <xf:targetid>model</xf:targetid>
                        <xf:name value="instance()/button[index('r2')]/@name"/>
                    </xf:dispatch>
                </xf:action>
            </xf:trigger>
        </xf:repeat>

内容的提问来源于stack exchange,提问作者monojohnny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:15:56