对XSLT中的数据进行分组后的行数

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

在对数据进行分组后,我需要获取输出中的行数。XML输入文件如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<root>
      <entry>
             <ID>T-1149</ID>
             <Item_ID>FM1</Item_ID>
             <Item_Amount>
                        <Amount>20.00</Amount>
             </Item_Amount>
      </entry>
      <entry>
             <ID>T-1149</ID>
             <Item_ID>FM1</Item_ID>
             <Item_Amount>
                         <Amount>10.00</Amount>
             </Item_Amount>
      </entry>
      <entry>
             <ID>T-1142</ID>
             <Item_ID>FM1</Item_ID>
             <Item_Amount>
                          <Amount>10.00</Amount>
             </Item_Amount>
      </entry>
      <entry>
             <ID>T-1142</ID>
             <Item_ID>FM2</Item_ID>
             <Item_Amount>
                         <Amount>-50.00</Amount>
             </Item_Amount>
      </entry>
</root> 

固定宽度的输出将如下所示:

Header1
T-1149                        FM1                      30.00
T-1142                        FM1                      10.00
T-1142                        FM2                     -50.00
TRAILER 5 15

预告片中的数字5是包括标题和预告片在内的行数。

我有此代码,但这计算了XML文件中的所有条目:

<xsl:variable name="count_invoice_line"
    select="count(root/entry)"/>

<xsl:variable name="header_line">
    <xsl:value-of select="1"/>
</xsl:variable>

<xsl:variable name="trailer_line">
    <xsl:value-of select="1"/>
</xsl:variable> 

<xsl:variable name="RightPadding"
    select="'                                                                                                                                                                                                                                                                                                                                                                                                                
 '"/>

<xsl:variable name="LeftPadding"
    select="'                                                                                         
'"/>
<xsl:function name="mf:PadLeft">
    <xsl:param name="string"/>
    <xsl:param name="length"/>
    <xsl:variable name="leftPad">
        <xsl:value-of
            select="substring($LeftPadding, 1, $length - string-length(string($string)))"/>
    </xsl:variable>
    <xsl:sequence select="concat($leftPad, $string)"/>
</xsl:function>

<xsl:function name="mf:PadRight">
    <xsl:param name="string"/>
    <xsl:param name="length"/>
    <xsl:sequence select="substring(concat($string, $RightPadding), 1, $length)"/>
</xsl:function>

<xsl:template match="/">

   <xsl:apply-templates/>
  <xsl:sequence
    select="accumulator-after('remainder-sum')"/>
    <Control_Header_Record>
        <RowIdentifier>
            <xsl:value-of select="mf:PadRight('HEADER', 6)"/>
        </RowIdentifier>          
    </Control_Header_Record>
    <Detail>
        <xsl:for-each-group select="root/entry"
            group-by="concat(ID, ' ', Item_ID)">
              <ID><xsl:value-of select="mf:PadRight(ID, 30)"/></ID>
              <Item_ID><xsl:value-of select="mf:PadRight(Item_ID, 3)"/>
                <xsl:value-of select="mf:PadLeft(Amount, 27)"/>
            </Row_Indentifier>

    </Detail>
    <Trailer_Record>
        <xsl:variable name="total_feed_line">
            <xsl:value-of select="$count_invoice_line + $header_line + $trailer_line"/>
        </xsl:variable>          
        <RowIdentifier><xsl:value-of select="mf:PadRight('TRAILER',8)"/></RowIdentifier>
        <Total_Feed_Line><xsl:value-of select="mf:PadRight($total_feed_line,2)"/></Total_Feed_Line>
        <Hash_Total_Value><xsl:value-of select="mf:PadRight($remainder-sum,15)"/></Hash_Total_Value>
    </Trailer_Record>
</xsl:template>

此代码的输出是

Header1
T-1149                        FM1                      30.00
T-1142                        FM1                      10.00
T-1142                        FM2                     -50.00
TRAILER 6 15

由于输入文件中的T-1149有两个条目,所以它被计为2,这就是为什么它得到6的原因。我只需要输出中的总行数。我尝试将分组结果放入变量中,并调用该变量进行计数:

<Detail>
<xsl:variable="row">
        <xsl:for-each-group select="root/entry"
            group-by="concat(ID, ' ', Item_ID)">
              <ID><xsl:value-of select="mf:PadRight(ID, 30)"/></ID>
              <Item_ID><xsl:value-of select="mf:PadRight(Item_ID, 3)"/>
                <xsl:value-of select="mf:PadLeft(Amount, 27)"/>
            </Row_Indentifier>
     </xsl:variable>
    </Detail>


  <xsl:value-of select="count($rows)"/>

但是我收到了一个编译错误,说没有后续兄弟指令的变量(行)无效,然后未声明变量$ rows。我正在使用氧气进行测试,不确定XSLT2.0是否比3.0更简单。但是我需要在这里Count of consolidated lines and Hash value - getting the remainder in XSLT加上我的其他代码,这是有关获取哈希总值的问题

谢谢。

xslt-2.0 xslt-grouping xslt-3.0
1个回答
0
投票

您会遇到第一个错误,因为带有xsl:variable的变量声明是在Details文字结果元素的内部完成的,但是您尝试使用该变量不是该变量声明的同级,即也位于Details的内部元素,但在它之外。

因此,这是您可以进行的必要且简单的修复。

除了您的代码不清楚(有一个杂散的</Row_Indentifier>),还是您想要的结果,如果您的目的是将entry元素分组,那么我希望xsl:for-each-group内的一些内容可以为每个组创建“组”包装器元素,或通过累积amout或其他数据合并属于组的“ entry”元素。

因此,您需要详细说明要为变量内容使用的结果结构,要计算的元素或项目以及要计算的结果。

© www.soinside.com 2019 - 2024. All rights reserved.