使用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() < 20">
<xsl:value-of select="Coffee"/>
</xsl:if>
</xsl:for-each>
答案 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() < 21">
以防止进一步输出。
您通常还希望避免使用<Coffee1>
和<Coffee2>
等“编号”元素。如果这些元素意味着代表相同的概念(例如,咖啡),它们都应该具有相同的名称。