在对数据进行分组后,我需要获取输出中的行数。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加上我的其他代码,这是有关获取哈希总值的问题
谢谢。
您会遇到第一个错误,因为带有xsl:variable
的变量声明是在Details
文字结果元素的内部完成的,但是您尝试使用该变量不是该变量声明的同级,即也位于Details
的内部元素,但在它之外。
因此,这是您可以进行的必要且简单的修复。
除了您的代码不清楚(有一个杂散的</Row_Indentifier>
),还是您想要的结果,如果您的目的是将entry
元素分组,那么我希望xsl:for-each-group
内的一些内容可以为每个组创建“组”包装器元素,或通过累积amout或其他数据合并属于组的“ entry”元素。
因此,您需要详细说明要为变量内容使用的结果结构,要计算的元素或项目以及要计算的结果。