0

我正在尝试运行此代码:

<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>

其中 retrieveControl 包含此文档:

<?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 =“。”,它会喷出数据。

无法弄清楚为什么它不能遍历将 jax-rx 指定为 ns 的元素......任何解决方法(查询在 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) 与规范相比发生错误说,这是(来自http://www.w3.org/TR/xforms11/#submit-data-replacement):

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

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

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

4

2 回答 2

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>
于 2011-01-27T23:33:10.760 回答
0

XForms 1.1 说targetref

“提交元素的范围内评估上下文用于评估表达式”。

你在你的例子中写道:

<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, 不要使用instanceas 东西然后会变得混乱。

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

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

让我们看看这是否能让你走得更远。

于 2011-02-01T03:07:44.987 回答