【问题标题】:Can XPath concatenate two nodeset values? (for use in XForms)XPath 可以连接两个节点集值吗? (用于 XForms)
【发布时间】:2010-06-09 19:21:21
【问题描述】:

我想在 XForms 中使用 XPath 连接两个节点集值。

我知道 XPath 有一个 concat(string, string) 函数,但我将如何连接两个节点集值?

开始编辑: 我尝试了 concat 函数.. 我尝试了这个.. 以及它的变体以使其工作,但它没有

<xf:value ref="concat(instance('param_choices')/choice/root, .)"/>

结束编辑

下面是我想要实现的简化代码示例。

XForms 模型:

<xf:instance id="param_choices" xmlns="">
    <choices>
        <root label="Param Choices">/param</root>
        <choice label="Name">/@AAA</choice>
        <choice label="Value">/@BBB</choice>
    </choices>
</xf:instance>

我目前拥有的 XForms ui 代码:

<xf:select ref="instance('criteria_data')/criteria/criterion" appearance="full">
    <xf:label>Param choices:</xf:label>    
    <br/>
    <xf:itemset nodeset="instance('param_choices')/choice">
        <xf:label ref="@label"></xf:label>
        <xf:value ref="."></xf:value>
    </xf:itemset>
</xf:select>    

(如果用户选择“名称”复选框..)XML 输出是:

<criterion>/@BBB</criterion>

但是!我想将根节点集值与当前选择节点集值结合起来。

基本上:

<xf:value ref="concat(instance('param_choices')/choice/root, .)"/>

<xf:value ref="(instance('definition_choices')/choice/root) + ."/>

实现如下XML输出:

<criterion>/param/@BBB</criterion>

关于如何做到这一点的任何建议? (我对 XPath 和 XForms 还很陌生)

附言我输入的内容对我来说是有意义的,但是如果您无法弄清楚我在问什么,请告诉我..

谢谢!

【问题讨论】:

    标签: xml xpath concatenation xforms


    【解决方案1】:

    XPath 表达式的求值不能修改 XML 文档的结构/内容——它只选择(一组)现有节点

    为了生成 XML 文档中不存在的节点,必须结合 XPath 使用其他方式(例如 XSLT)。

    【讨论】:

    • 感谢您的快速回复。我想我的解决方案是用每个选择对根进行硬编码......所以选择看起来像 /param/@BBB.. 我想避免这种情况是有原因的,但我可能能够牺牲那些理由。
    • 这个答案是错误的,XForms 让这一切成为可能(确实是 XForms 存在的理由)。
    • Phil-Booth:这个答案是正确的。它陈述了一个关于 XPath 的众所周知的事实,而不是关于 XForms 的任何内容。
    • Dimitre,这可能确实是关于 XPath 的一个众所周知的事实,但是作为对这个关于 XForms 的问题的回答,您的回答是错误的。
    【解决方案2】:

    问题是您在value element 上使用ref 属性而不是value 属性。 ref 属性用于将元素绑定到单个节点,而value 属性用于使用已解析 XPath 表达式中的值。

    您的 XPath 表达式本身也存在一个小错误,因此如果您将 value 元素更改为:

    <xf:value value="concat(instance('param_choices')/root, .)" />
    

    ...您应该会发现它工作正常。

    【讨论】:

    • 匿名投反对票,很好。这是支持我的答案的 XForms 规范的一部分(请参阅关于 @value 的部分):w3.org/TR/xforms11/#ui-selection-commonelems-value
    • 虽然我很高兴看到这个解决方案,但它对我不起作用。使用此解决方案:当我加载表单时,预先选择了复选框(我不想发生这种情况),当我提交数据时,根本没有生成任何 xml.. :(
    • @iHeartGreek:您使用的是哪个 XForms 处理器?
    【解决方案3】:

    XForms 还不支持动态 XPath 表达式构造。 Javascript 没有 eval() 这样的函数。

    作为一种非常有限的解决方法,您可以使用诸如

    之类的表达式

    /*[name() = substring-after(instance('param_choices')/root,'/')]/@*[name() = substring-after(.,'/@')]

    【讨论】:

    • 阿兰,他为什么不能直接用xf:value/@value
    • xf:value/@value 将给出字符串'/param/@BBB',而不是相应的节点值!
    • 是的,完全正确。也许我们正在阅读不同的问题?从我正在阅读的问题中,它说"to achieve the following XML output: &lt;criterion&gt;/param/@BBB&lt;/criterion&gt;"。你的问题说明了什么?
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多