我无法为以下问题创建XSLT

时间:2019-06-28 12:31:48

标签: xml xslt

我无法为以下问题创建XSLT。

最大金额= 100

输入:

EMP1
AMT = 10
EMP1
AMT = 20
EMP1 
AMT = 90
EMP2
AMT = 50
EMP2
AMT = 60

输出

Header

EMP1 
AMT = 10

EMP1
AMT = 20

EMP1
AMT = 20     ---  EMP1 Amount total exceeding max amount so Total amount - Max Amount and rest of the amount will go in next batch section 

Trailer
------------------------------

Header

EMP1
AMT = 70

EMP2
AMT = 50

EMP2 
AMT = 10

Trailer
------------------------------

Header

EMP2
AMT = 50  and so on according to the data

Trailer

任何批记录中都不会包含金额超过最大金额的同一员工。

我尝试使用局部和全局变量,还尝试了XSLT中的Key概念,但似乎没有任何效果。帮助将不胜感激。

使用局部变量和全局变量对场景进行了尝试并捕获了“金额”字段,还使用了xslt的Key功能,但是没有运气

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="/DATA_DS/G_1/G_2/FILE_FRAGMENT/TEST_DD/Rel_Action">
            <xsl:variable name="Amount_MAX">100</xsl:variable>
            <!-- HEADER Begin -->
            <xsl:text>Header</xsl:text>
            <!-- HEADER End -->

            <!-- DETAIL Begin -->
            <xsl:for-each select="/DATA_DS/G_1/G_2/FILE_FRAGMENT/TEST_DD/Rel_Action">
              <xsl:variable name="Amount_Loop"
                  select="Personal_Payments_Trav/Personal_Payments/Personal_Payment_Rec/Payment_Amount"/>
                <xsl:choose>    
                    <xsl:when test="/DATA_DS/G_1/G_2/FILE_FRAGMENT/TEST_DD/Rel_Action/Personal_Payments_Trav/Personal_Payments/Personal_Payment_Rec/Payment_Amount &lt; 100">
                        <xsl:value-of select="Personal_Payments_Trav/Personal_Payments/Personal_Payment_Rec/Payment_Amount"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <Record>
                            <xsl:value-of select="Personal_Payments_Trav/Personal_Payments/Personal_Payment_Rec/Payment_Amount - 99"/>
                        </Record>
                    </xsl:otherwise>
                </xsl:choose>
                <xsl:text> </xsl:text>
                <!--Single space filler-->
                <xsl:text> </xsl:text>
            </xsl:for-each>
            <!-- DETAIL End -->

            <!-- TRAILER Begin -->
            <xsl:text>Trailer</xsl:text>
            <!-- TRAILER End -->
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Header

EMP1 
AMT = 10

EMP1
AMT = 20

EMP1
AMT = 20     ---  EMP1 Amount total exceeding max amount so Total amount - Max Amount and rest of the amount will go in next batch section 

Trailer
------------------------------

Header

EMP1
AMT = 70

EMP2
AMT = 50

EMP2 
AMT = 10

Trailer
------------------------------

Header

1 个答案:

答案 0 :(得分:0)

这在XSLT中是一个非常棘手的问题。如果可以在XSLT 3.0中使用xsl:iterate,那么我建议:

(a)首次通过:使用xsl:iterate在需要开始新批处理的位置注入“ new-batch”元素,您可以通过将当前批处理的大小作为参数保留来进行此操作xsl:iterate。当您发现需要拆分为两个(或更多?)批次的物品时,请在此过程中进行拆分。

(b)第二遍:使用xsl:for-each-group group-starting-with="new-batch"生成按批次分组的输出。

对不起,我没有时间为您解决细节。