如何仅统计xslt中records/nodes的个数,其值大于零

How to count the number of records/nodes in the xslt only whose value is greater than zero

我的xml如下:

<Report_Entry>
    <FileDateTime>2016-01-05T22:45:55.692-08:00</ FileDateTime>
    < CurrentYear>2016</ CurrentYear>
    < MemNum>133034</ MemNum>
    < SSN>000000</ SSN>
    < First_Name>Br</ First_Name>
    < Last_Name>G</ Last_Name>
    < Employee_Status_Date>2013-10-04-07:00</ Employee_Status_Date>
    < PayrollResults>
        < DepoDt>2016-01-08-08:00</ DepoDt>
        < FSA_Dep_Contributions>48.08</ FSA_Dep_Contributions>
        < FSA_Limitd_Contributions>0</ FSA_Limitd_Contributions>
        < FSA_Med_Contributions>0</ FSA_Med_Contributions>
    </ PayrollResults>
</ Report_Entry>
< Report_Entry>
    < FileDateTime>2016-01-05T22:45:55.692-08:00</ FileDateTime>
    < CurrentYear>2016</ CurrentYear>
    < MemNum>205767</ MemNum>
    < SSN>777777</ SSN>
    < First_Name>R</ First_Name>
    < Last_Name>Ks</ Last_Name>
    < PayrollResults>
        < DepoDt>2016-01-08-08:00</ DepoDt>
        < FSA_Dep_Contributions>0</ FSA_Dep_Contributions>
        < FSA_Limitd_Contributions>0</ FSA_Limitd_Contributions>
        < FSA_Med_Contributions>28.85</ FSA_Med_Contributions>
    </ PayrollResults>
</ Report_Entry>

我的 xslt 正在生成一个文本文件并计算输出文件中的行数。仅当上述 xml 中的任何贡献大于零时,才会生成输出行中的文件。我使用了下面的代码,但它输出 3 而它应该只输出 2。请让我知道我在我的代码中做了什么。

我正在使用这个:

<xsl:variable name="recordCount">
  <xsl:value-of select=" 
    count( Report_Data/ Report_Entry/ PayrollResults[last()]/ FSA_Dep_Contributions != 0) +
    count( Report_Data/ Report_Entry/ PayrollResults[last()]/ FSA_Limitd_Contributions != 0) +
    count( Report_Data/ Report_Entry/ PayrollResults[last()]/ FSA_Med_Contributions != 0)"/> 
</xsl:variable>
<xsl:value-of select="substring(concat($recordCount)"/>

我使用在线 xpath 评估器来计算,我只使用了部分计数,您可以将相同的应用到其他人,这会发现 FSA_Dep_Contributions 的计数值大于零

 count(/Report_Data/Report_Entry/PayrollResults[last()]/FSA_Dep_Contributions[number(.) > 0 ])

如果您使用 xslt ,则必须将 xslt > 更改为 &gt;

您的原始表达式不起作用的原因是每个表达式都返回一个布尔值。布尔值的 count() 始终为 1。

您可以将 FSA_Med_Contributions != 0 更改为 FSA_Med_Contributions[. != 0]

您可能还可以使用 starts-with(local-name(),'FSA') 将所有 count() 调用压缩为 1。

此外,尽可能使用 select 属性而不是 xsl:value-of。这消除了处理器创建新树的需要。

示例:

<xsl:variable name="recordCount" 
  select="count(Report_Data/Report_Entry/PayrollResults[last()]/*[starts-with(local-name(),'FSA') and . > 0])"/>

注意:在 XSLT 中无需将 > 转义为 &gt;