根据通道编号顺序,应选择值

问题描述 投票:0回答:1

我需要根据输入 xml 中的通道编号顺序选择值

<Rates>
    <Rate>
        <Channel>1</Channel>
        <Type>Life</Type>
        <GRates>
            <GRate>
                <band>&lt;25</band>
                <amount>0.04</amount>
            </GRate>
        </GRates>
    </Rate>
    <Rate>
        <Channel>2</Channel>
        <Type>Life</Type>
        <GRates>
            <GRate>
                <band>&lt;25</band>
                <amount>0.12</amount>
            </GRate>
        </GRates>
    </Rate>
    <Rate>
        <Channel>1</Channel>
        <Type>Add</Type>
        <GRates>
            <GRate>
                <band>&lt;25</band>
                <amount>0.08</amount>
            </GRate>
        </GRates>
    </Rate>
</Rates>

XSL 我已经尝试过以下方法:

<xsl:template match="/Rates">
    <xsl:for-each-group select="Rate[Channel=('1', '2')][Type=('Life', 'Add')]/GRates/GRate" group-by="band">
        <row>
            <entry align="center" colsep="1">
                <xsl:value-of select="band"/>
            </entry>
            <xsl:for-each select="current-group()">
                <entry>
                    <p>
                        <xsl:value-of select="format-number(amount, '$0.00')"/>
                    </p>
                </entry>
            </xsl:for-each>
        </row>
    </xsl:for-each-group>
</xsl:template>

我得到的输出:

<row>
    <entry align="center" colsep="1">&lt;25</entry>
    <entry>
        <p>$0.04</p>
    </entry>
    <entry>
        <p>$0.12</p>
    </entry>
    <entry>
        <p>$0.08</p>
    </entry>
</row>

预期输出是:

<row>
    <entry align="center" colsep="1">&lt;25</entry>
    <entry>
        <p>$0.04</p>
    </entry>
    <entry>
        <p>$0.08</p>
    </entry>
    <entry>
        <p>$0.12</p>
    </entry>
    <entry>
        <p>NA</p>
    </entry>
</row>

“Lif”和“Add”费率金额的通道 1 应为第一组行条目,通道 2 应为第二组行条目。如果任何通道号的“Life”或“Add”元素不可用,则该输出应为“NA”

xml xslt xslt-2.0
1个回答
0
投票

从单个示例中很难理解这里需要应用哪些规则。

假设在band的每个组内,按ChannelType划分的4个类别中的每一个类别中不能有超过一个Rate,您可以这样做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/Rates">
    <xsl:for-each-group select="Rate/GRates/GRate" group-by="band">
        <row>
            <entry align="center" colsep="1">
                <xsl:value-of select="band"/>
            </entry>
            
            <xsl:variable name="Life_1" select="current-group()[../../(Channel='1' and Type='Life')]" />
            <entry>
                <p>
                    <xsl:value-of select="if($Life_1) then format-number($Life_1/amount, '$0.00') else 'NA'"/>
                </p>
            </entry>
            
            <xsl:variable name="Add_1" select="current-group()[../../(Channel='1' and Type='Add')]" />
            <entry>
                <p>
                    <xsl:value-of select="if($Add_1) then format-number($Add_1/amount, '$0.00') else 'NA'"/>
                </p>
            </entry>
            
            <xsl:variable name="Life_2" select="current-group()[../../(Channel='2' and Type='Life')]" />
            <entry>
                <p>
                    <xsl:value-of select="if($Life_2) then format-number($Life_2/amount, '$0.00') else 'NA'"/>
                </p>
            </entry>
            
            <xsl:variable name="Add_2" select="current-group()[../../(Channel='2' and Type='Add')]" />
            <entry>
                <p>
                    <xsl:value-of select="if($Add_2) then format-number($Add_2/amount, '$0.00') else 'NA'"/>
                </p>
            </entry>
            
        </row>
    </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.