如何通过XPath关联实例数据与约束,限制XForms ItemSet选项?
基于XSLTForms 1.3实现下拉选项的动态限制
核心逻辑是通过XPath关联两个实例的数据:统计i-rec中目标元素的数量,再与i-schemaConstraints里定义的maxOccurs对比,过滤掉达到上限的选项。
可行的实现方式
假设你的实例结构如下(可根据实际调整):
<!-- 约束规则实例 --> <instance id="i-schemaConstraints"> <constraints> <constraint element-type="foo" maxOccurs="2"/> <constraint element-type="bar" maxOccurs="1"/> <constraint element-type="baz" maxOccurs="3"/> </constraints> </instance> <!-- 业务数据实例 --> <instance id="i-rec"> <data> <foo/> <foo/> <bar/> </data> </instance>
方式1:直接在itemset的nodeset中过滤
通过XPath直接筛选出未达到数量上限的约束项,作为下拉选项的数据源:
<xf:select1 ref="selected-element-type"> <xf:itemset nodeset="instance('i-schemaConstraints')/constraints/constraint[ count(instance('i-rec')/data/*[local-name() = @element-type]) < number(@maxOccurs) ]"> <xf:label ref="@element-type"/> <xf:value ref="@element-type"/> </xf:itemset> </xf:select1>
方式2:通过relevant属性动态控制选项显示
如果需要保留所有选项节点但隐藏不可选的项,可以直接在xf:item上设置relevant:
<xf:select1 ref="selected-element-type"> <xf:itemset nodeset="instance('i-schemaConstraints')/constraints/constraint"> <xf:label ref="@element-type"/> <xf:value ref="@element-type"/> <xf:item relevant="count(instance('i-rec')/data/*[local-name() = current()/@element-type]) < number(current()/@maxOccurs)"/> </xf:itemset> </xf:select1>
关键注意事项
- 路径准确性:确保
instance('i-rec')中元素的路径与实际结构匹配,比如如果业务数据嵌套更深,要调整/data/*为对应层级。 - 命名空间处理:如果你的元素带有命名空间,需要在XPath中加入命名空间判断,比如:
*[local-name() = @element-type and namespace-uri() = instance('i-schemaConstraints')/constraints/constraint/@element-ns] - 数值类型转换:用
number(@maxOccurs)将属性值转为数值,避免字符串比较导致的逻辑错误(比如字符串"10"会被认为小于"2")。
内容的提问来源于stack exchange,提问作者wsalesky
相关产品推荐
相关产品推荐

