XPath可以连接两个节点集值吗? (用于XForms)

时间:2010-06-09 19:21:21

标签: xml xpath concatenation xforms

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

我知道XPath有一个concat(字符串,字符串)函数,但是如何连接两个节点集值呢?

开始编辑: 我尝试了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相当新)

P.S。当我输入它时,我所问的对我来说是有意义的,但如果你无法弄清楚我在问什么,请告诉我......

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

...你应该发现它可以正常工作。

答案 2 :(得分:1)

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

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

之类的表达式

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