如何以所需的顺序显示foreach xslt输出?

时间:2017-03-23 07:09:41

标签: xml xslt

我有一个输入xml:

<Fees>
 <Fee>
    <Name>A</Name>
    <Amt>10</Name>
 </Fee>
 <Fee>
    <Name>B</Name>
    <Amt>20</Name>
 </Fee>
 <Fee>
    <Name>C</Name>
    <Amt>30</Name>
 </Fee>
 <Fee>
    <Name>D</Name>
    <Amt>40</Name>
 </Fee>
</Fees>

使用xslt:

<xsl:for-each select="Fees/Fee">
 <xsl:value-of select="Name"/>
 <xsl:text> : </xsl:text>
 <xsl:value-of select="Fee"/>
</xsl:for-each>

使用简单的foreach打印名称时,我按顺序输出:

A : 10
B : 20
C : 30
D : 40

但我需要输出顺序如下:

C : 30
B : 20
D : 40
A : 10

此序列可能会以某些固定间隔发生变化。请建议如何从xslt完成它?如果我可以使用任何模板指定for-each中的任何序列,比如传递C,B,D,A或其他任何序列,那么它在生成输出时遵循相同的顺序?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:param name="order" select="'C,B,D,A'"/>

<xsl:template match="/Fees">
    <xsl:for-each select="Fee">
        <xsl:sort select="string-length(substring-before(concat(',', $order, ','), concat(',', Name, ',')))" data-type="number" order="ascending"/>
        <xsl:value-of select="Name"/>
        <xsl:text> : </xsl:text>
        <xsl:value-of select="Amt"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

这允许您通过将不同的字符串作为order参数传递来更改顺序。