xslt循环限制次数

时间:2013-11-13 08:54:16

标签: xml xslt

使用xslt我需要循环咖啡项目的数量,但必须限制 - 20次。如果有10个咖啡项目,则需要在20次下循环10次。如果超过20种咖啡,那是不可接受的。循环咖啡项后,将它们添加到转换后的xml中的CoffeeList节点。

如果咖啡商品没有价值,请忽略它。如何使用xslt文件实现它。非常感谢您的帮助。

XML:

<Action>
<Coffee1> hello 1 </Coffee1>
<Coffee2> hello 2</Coffee2>
<Coffee3> </Coffee3>
<Coffee4> hello 4</Coffee4>

<Amount1>1.2000</Amount1>
<Amount2>2.0000</Amount2>
<Amount3>1.2100</Amount3>
<Amount4>2.0000</Amount4>
</Action>

输出:

    <CoffeeList>
      <Coffee coffeeCode="hello 1" amount="1.2000" />
      <Coffee coffeeCode="hello 2 " amount="2.0000" />
      <Coffee coffeeCode="hello 4" amount="1.2100" />
    </CoffeeList>

XSLT: - 我不知道如何实现这个,因为我想要输出。

  <xsl:for-each select="Action">
  <xsl:sort select="Coffee" data-type="string" />  
  <xsl:if test="position() &lt; 20">
        <xsl:value-of select="Coffee"/>
  </xsl:if>
  </xsl:for-each>

1 个答案:

答案 0 :(得分:2)

您通常希望避免XSLT中的循环。

而是选择节点并将模板应用于它们。

<xsl:template match="Action">
  <CoffeeList>
    <xsl:apply-templates select="*[
      starts-with(name(), 'Coffee') and normalize-space(.) != ''
    ]" />
  </CoffeeList>
</xsl:template>

<xsl:template match="*[starts-with(name(), 'Coffee')]">
  <xsl:variable name="myNumber" select="substring-after(name(), 'Coffee')" />
  <xsl:variable name="amountName" select="concat('Amount', $myNumber)" />
  <xsl:variable name="amount" select="../*[name() = $amountName]" />

  <Coffee coffeeCode="{normalize-space(.)}" amount="{$amount}" />
</xsl:template>

请参阅http://www.xmlplayground.com/E0eXFs

例如,您可以在第二个模板中添加<xsl:if test="position() &lt; 21">以防止进一步输出。


您通常还希望避免使用<Coffee1><Coffee2>等“编号”元素。如果这些元素意味着代表相同的概念(例如,咖啡),它们都应该具有相同的名称。