1

使用 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>
4

1 回答 1

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

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


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

于 2013-11-13T09:32:10.093 回答