我想在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。当我输入它时,我所问的对我来说是有意义的,但如果你无法弄清楚我在问什么,请告诉我......
谢谢!
答案 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(.,'/@')]