读取XBL组件的子元素并构造xpath

时间:2010-11-18 14:15:23

标签: xforms

这是我的测试组件

<fr:mycomponent name="test">
<fr:constraint instance="myinstance" xpath="item/@id" />
</fr:mycomponent>

我必须在XBL中读取instance属性的值。我这样做。

<xsl:value-of select="./fr:constraint/@instance" />
要么 <xxforms:variable name="instance" select="xxforms:evaluate-avt='{/*/fr:constraint/@instance}'" />

我必须连接实例名称和xpath来读取我需要帮助的值。 <xxforms:variable name="instance" select="concat('instance(''', xxforms:evaluate-avt='{/*/fr:constraint/@instance}'", ''')' />

我可以像我一样读取xpath,然后用上面的变量连接它。

<xxforms:variable name="xpath" select="xxforms:evaluate-avt='{/*/fr:constraint/@xpath}'" />
<xxforms:variable name="nodeset" select="concat($instance, '/', $xpath)" />

我会得到一堆我想重复的元素

<xforms:repeat nodeset="$nodeset">
<xforms:output value="." />
<xforms:repeat/>

连接字符串以创建xpath并在重复中使用它是问题所在。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

实际上xxforms:evaluate-avt工作。这是我的应用程序中的缓存问题。这是后续问题。

XSLT
<xsl:value-of select="./fr:constraint/@instance" />

的XForms
<xxforms:variable name="instance" select="xxforms:evaluate-avt='{/*/fr:constraint/@instance}'" />

这是在xforms中访问变量的正确方法吗?还有更好的方法吗?

答案 1 :(得分:0)

取决于/*/fr:constraint/@instance的内容:

  1. 如果它是AVT,那么是的,使用xxforms:evaluate-avt()是可行的方法。
  2. 但是,也许你可以制作一个XPath表达式,而不是AVT,然后你可以写:

    <xxforms:variable name="instance"
                      select="{/*/fr:constraint/@instance}"/>
    
  3. 如果它是一个实例id,这似乎是基于你的例子的情况,那么你将如下声明你的XForms变量。 AVT由XSLT解释,因此XForms看到的是select="instance('myinstance')"

    <xxforms:variable name="instance" 
                      select="instnce('{/*/fr:constraint/@instance}')"/>