XForms 在 XML 树中向上或向下移动节点

XForms move node up or down in the XML tree

我需要允许我的 XForms(使用 XSLTForms)用户在 XML 树中上下移动元素。只要我使用包括实例在内的元素的完整路径,我就可以正常工作。但是我想知道是否有可能在不引用完整路径或实例的情况下具有相同的功能,因为我在重复中使用了一系列嵌套子表单。

下面的简化示例:up1 按预期工作,up2 不工作。唯一的区别是路径。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xf="http://www.w3.org/2002/xforms">
    <head>
        <title>Move Test</title>
        <xf:model>
            <xf:instance id="i-rec">
                <TEI xmlns="http://www.tei-c.org/ns/1.0">
                    <msPart>
                        <msIdentifier>
                            <idno>1</idno>
                            <idno>2</idno>
                            <idno>3</idno>
                            <idno>4</idno>
                        </msIdentifier>
                    </msPart>
                </TEI>
            </xf:instance>
            <xf:instance id="i-move">
                <data xmlns="">
                    <tmp/>
                </data>
            </xf:instance>
        </xf:model>
    </head>
    <body style="margin:3em; padding-left:4em;">
        <h1>Move Test</h1>
        <xf:group ref="instance('i-rec')//*:msPart[1]">
            <xf:group ref="*:msIdentifier"> 
                <xf:repeat id="msIdentifierRepeatLevel1" ref="./*">
                    <xf:trigger appearance="minimal">
                        <xf:label>up1 </xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="instance('i-move')/tmp" value="index('msIdentifierRepeatLevel1')"></xf:setvalue>
                            <xf:insert  
                                nodeset="instance('i-rec')//descendant::*:msPart/*:msIdentifier/*"
                                at="index('msIdentifierRepeatLevel1') - 1" 
                                origin="instance('i-rec')//descendant::*:msPart/*:msIdentifier/*[index('msIdentifierRepeatLevel1')]"
                                position="before"/>
                            <xf:delete nodeset="instance('i-rec')//descendant::*:msPart/*:msIdentifier/*[instance('i-move')/tmp + 1]"/>
                        </xf:action>
                    </xf:trigger> |
                    <xf:trigger appearance="minimal">
                        <xf:label>up2 </xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="instance('i-move')/tmp" value="index('msIdentifierRepeatLevel1')"></xf:setvalue>
                            <xf:insert  
                                nodeset="."
                                at="index('msIdentifierRepeatLevel1') - 1" 
                                origin=".[index('msIdentifierRepeatLevel1')]"
                                position="before"/>
                            <xf:delete nodeset=".[instance('i-move')/tmp + 1]"/>
                        </xf:action>
                    </xf:trigger> 
                    <div><xf:input ref="."/></div>
                </xf:repeat> 
            </xf:group>
        </xf:group>
    </body>
</html>

要使“up2”像“up1”一样工作,您应该替换“.”用“../*”