将xsl:template不应用于所有元素,而是应用于一半

时间:2013-04-09 13:16:02

标签: xslt

我有一个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> 

我没有使用apply-templates,因为我想一次应用一个转换,然后再转换为相同的数据。也许有办法做到这一点,但到目前为止,这对我来说非常适合。

2 个答案:

答案 0 :(得分:1)

  

与此相关,XSL&#34;能否知道&#34;找到了多少场比赛?

是的,请使用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>

答案 1 :(得分: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数据中的表单元素元素不与其他元素混合,那么这将起作用,因此可以使用它们的位置 编辑:我喜欢使用“&gt;”和“不(&gt;)”而不是“&gt;”和“&amp; lt;”甚至“&amp; gt;”和“&amp; lt;”但那只是时尚。 编辑:根据Michael Kay的评论进行更正(谢谢,我不知道)