1

我有一个 XSL 模板,它将 XML 文档处理成 Gherkin 中的测试。对于我正在生成的 XML 和 Gherkin 行中的每个元素,例如

And I fill in the "check-temp" field with "23"

这很好,但我只想为 的前 20 个实例生成这一行,然后做一些其他输出,然后从我离开的地方继续。像这样,使用虚构的语法:

<xsl:for-each select="formline" [0..20]> 
...other stuff...
<xsl:for-each select="formline" [21..40]> 

与此相关,XSL 能否“知道”找到多少匹配项?

已解决:感谢您的贡献。这是我所做的:

# Fill in first 'half' of form 
<xsl:for-each select="formline[not(position() > 20)]">                           
<xsl:for-each select="formentrycontext">And I fill in "<xsl:value-of select="formentry/@id"/>" with "xxx"
</xsl:for-each>
</xsl:for-each>
# Check first 'half' of form 
<xsl:for-each select="formline[not(position() > 20)]">                           
<xsl:for-each select="formentrycontext">And the "<xsl:value-of select="formentry/@id"/>" field should contain "xxx"
</xsl:for-each>
</xsl:for-each>
# Fill in second 'half' of form 
<xsl:for-each select="formline[position() > 20 and not(position() > last())]">                           
<xsl:for-each select="formentrycontext">And I fill in "<xsl:value-of select="formentry/@id"/>" with "xxx"
</xsl:for-each>
</xsl:for-each>
# Check second 'half' of form 
<xsl:for-each select="formline[position() > 20 and not(position() > last())]">                           
<xsl:for-each select="formentrycontext">And I fill in "<xsl:value-of select="formentry/@id"/>" with "xxx"
</xsl:for-each>
</xsl:for-each> 

我没有使用应用模板,因为我想一次应用一个转换,然后再将另一个转换应用于相同的数据。也许有办法做到这一点,但到目前为止这对我来说非常有效。

4

2 回答 2

1

与此相关,XSL 能否“知道”找到多少匹配项?

是的,使用以下count()功能

 count(formline[not(position() > 20)])

或者,在一个匹配的模板中xsl:for-each可以使用last()函数

 <xsl:apply-templates select="formline[not(position() > 20)]"/>

并且在

 <xsl:template match="formline">
   <xsl:value-of select="last()"/>
   <!-- Your processing here -->
 </xsl:template>
于 2013-04-09T14:44:26.773 回答
0

这种方法可以为您工作:

<xsl:apply-templates select="formline[not(position() > 20)]"/>
...other stuff...
<xsl:apply-templates select="formline[position() > 20 and not(position() > 40)]"/>

您需要将显示表单数据的代码放入这样的模板中

<xsl:template match="formline">  

所以你只需要一个每次都会再次使用的。如果 XML 数据中的 formline 元素不与其他元素混合以便可以使用它们的位置,这将起作用。
编辑:我更喜欢使用 ">" 和 "not( > )" 而不是 ">" 和 "& lt;" 甚至“>” 和“<” 但这只是时尚。编辑:根据迈克尔凯的评论更正(谢谢,我不知道)

于 2013-04-09T13:45:19.007 回答