Orbeon的itemset元素的实现无法遍历带有命名空间的元素?

时间:2011-01-27 16:13:11

标签: orbeon

我正在尝试运行此代码:

<xforms:select1 xmlns:xbl="http://www.w3.org/ns/xbl"
                                            xmlns:fb="http://orbeon.org/oxf/xml/form-builder"
                                            xmlns:pipeline="java:org.orbeon.oxf.processor.pipeline.PipelineFunctionLibrary"
                                            appearance="xxforms:tree"
                                            bind="retrievalControl-bind"
                                            id="retrievalControl-control-laidOut">
<xforms:label ref="$form-resources/retrievalControl/label"/>
<xforms:help ref="$form-resources/retrievalControl/help"/>
<xforms:itemset nodeset="instance('fr-form-instance')/retrievalSection/retrievalControl/*/*/APP">
    <xforms:label ref="NAME"/>
    <xforms:value />
</xforms:itemset>

其中retrievalControl包含此文档:

<?xml version="1.0" encoding="utf-8"?><jax-rx:results xmlns:jax-rx="http://jax-rx.sourceforge.net"><jax-rx:result><APP count="1">
        <NAME>ABCD</NAME>
        <ID>12</ID>
    </APP>
</jax-rx:result></jax-rx:results>

但它不起作用(没有为select1创建的项目)。如果我删除/ * / * / APP,以便将整个文档打印为项目标签(通过将标签修改为ref =“。”,它会喷出数据。

无法弄清楚为什么它不能遍历指定为ns的jax-rx的元素...任何变通方法(查询在XMLSpy中工作正常)?

根据下面最早的回复(1月27日)进行更新:

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:xforms="http://www.w3.org/2002/xforms"
        xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
        xmlns:ev="http://www.w3.org/2001/xml-events"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:fr="http://orbeon.org/oxf/xml/form-runner">
<xhtml:head>
    <xforms:model>
        <xforms:instance>
            <instance>
                <weird/>
            </instance>
        </xforms:instance>
        <xforms:instance id="fr-form-instance">
            <form>
                <retrievalSection>
                    <retrievalControl>
                        <jax-rx:results xmlns:jax-rx="http://jax-rx.sourceforge.net">
                            <jax-rx:result>
                                <APP count="1">
                                    <NAME>ABCD</NAME>
                                    <ID>12</ID>
                                </APP>
                            </jax-rx:result>
                        </jax-rx:results>
                    </retrievalControl>
                </retrievalSection>
            </form>
        </xforms:instance>
        <xforms:bind id="fr-form-binds" nodeset="instance('fr-form-instance')">
            <xforms:bind id="retrievalSection-bind" nodeset="retrievalSection" name="retrievalSection">
                <xforms:bind id="retrievalControl-bind" nodeset="retrievalControl" name="retrievalControl"/>
            </xforms:bind>
        </xforms:bind>
        <xforms:submission resource="http://AURLWhereOurExampleDataFileIsAvailale"
                           method="get"
                           id="getData"
                           replace="text"
                           instance="fr-form-instance"
                           targetref="/instance/weird"
                           serialization="none">
            <xforms:message ev:event="xforms-submit-error" level="modal">A submission error occurred:<xforms:output value="event('error-type')"/>
            </xforms:message>
        </xforms:submission>
        <xforms:send ev:event="xforms-ready" submission="getData"/>
    </xforms:model>
</xhtml:head>
<xhtml:body>
    <xforms:select1 xmlns:xbl="http://www.w3.org/ns/xbl"
                    xmlns:fb="http://orbeon.org/oxf/xml/form-builder"
                    xmlns:pipeline="java:org.orbeon.oxf.processor.pipeline.PipelineFunctionLibrary"
                    appearance="xxforms:tree"
                    bind="retrievalControl-bind"
                    id="retrievalControl-control-laidOut">
        <xforms:itemset nodeset="instance('fr-form-instance')">
            <!--<xforms:itemset nodeset="instance('fr-form-instance')/retrievalSection/retrievalControl/*/*/APP">-->
            <!--<xforms:itemset nodeset="instance()/*/*/APP">-->
            <xforms:label ref="."/>
            <xforms:value/>
        </xforms:itemset>
    </xforms:select1>
</xhtml:body>

我根据下面的第一个响应进一步研究了这个问题,问题似乎不在于能够用命名空间解析元素,但可能与XForms提交的实现方式有关(或者我的理解不好,在这种情况下我请求是通过对此问题的回答纠正)。 XForms Submission的问题是在尝试使用replace =“text”时有错误的实例替换,但可能也会影响replace =“instance”,它看起来只在默认实例上发生替换a)b)与spec相比发生错误说,(来自http://www.w3.org/TR/xforms11/#submit-data-replacement):

如果replace属性包含值“text”且提交响应符合XML mediatype(由[RFC 3023]中的内容类型说明符定义)或文本媒体类型(由内容类型说明符定义) text / *),然后将响应数据编码为文本并替换替换目标节点的内容。

好的,这可以通过在select1中的item-label中填充实例的整个内容来证明,请注意上面的提交ID getData正在尝试替换在引用的实例ID中甚至不存在的targetref,但是它有效(如果我正确地为引用的实例ID放置了targetref,它就不起作用;换句话说,只有当targetref指向'default'实例中的有效节点时才会起作用(恰好是第一个实例) ,而不是引用的实例ID。 即使它工作,它也不会替换targetref节点中的内容(我不知道它究竟在哪里(Orbeon的提交替换机制)放置该内容,我所知道的是它将该内容放在默认实例的某个地方,但是在哪里 - 在新创建的文本节点中?)

您需要将提交资源修改为示例数据文件可用的URL,抱歉无法使其更加独立。

2 个答案:

答案 0 :(得分:0)

我怀疑<retrievalControl>并不像您期望的那样真正包含<jax-rx:results>。如果我创建一个独立的示例,将您粘贴的部分放在一起,一切都按预期工作(见下文)。您是否有一个完整的(尽可能少的)示例来重现这个?

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:xforms="http://www.w3.org/2002/xforms"
            xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
            xmlns:ev="http://www.w3.org/2001/xml-events"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:fr="http://orbeon.org/oxf/xml/form-runner">
    <xhtml:head>
        <xforms:model>
            <xforms:instance>
                <instance>
                    <select1/>
                    <jax-rx:results xmlns:jax-rx="http://jax-rx.sourceforge.net">
                        <jax-rx:result>
                            <APP count="1">
                                <NAME>ABCD</NAME>
                                <ID>12</ID>
                            </APP>
                        </jax-rx:result>
                    </jax-rx:results>
                </instance>
            </xforms:instance>
        </xforms:model>
    </xhtml:head>
    <xhtml:body>
        <xforms:select1 xmlns:xbl="http://www.w3.org/ns/xbl"
                        xmlns:fb="http://orbeon.org/oxf/xml/form-builder"
                        xmlns:pipeline="java:org.orbeon.oxf.processor.pipeline.PipelineFunctionLibrary"
                        appearance="xxforms:tree"
                        ref="select1"
                        id="retrievalControl-control-laidOut">
            <xforms:itemset nodeset="instance()/*/*/APP">
                <xforms:label ref="NAME"/>
                <xforms:value/>
            </xforms:itemset>
        </xforms:select1>
    </xhtml:body>
</xhtml:html>

答案 1 :(得分:0)

XForms 1.1说的是targetref

  

“范围内的评估背景   submission元素用于   评估表达“。

你在你的例子中写道:

<xforms:submission resource="http://AURLWhereOurExampleDataFileIsAvailale"
                   method="get"
                   id="getData"
                   replace="text"
                   instance="fr-form-instance"
                   targetref="/instance/weird"
                   serialization="none">

instance属性不会修改范围内的评估上下文(据我可以阅读规范),所以这里targetref它与instance属性无关,但是提交的范围内评估上下文,由于您未指定ref属性,因此是默认(第一个)实例。

基本上,如果您使用targetref,请不要使用instance,因此会让您感到困惑。

请删除instance属性,然后撰写targetref="instance('fr-form-instance')/weird"

现在,如果您使用上面的更新示例执行此操作,您将获得xforms-submit-error,因为第二个实例中不存在该节点。

让我们看看这是否会让你更进一步。