如何计算xslt中仅大于零的记录/节点数

时间:2016-01-06 07:20:28

标签: xml xslt xpath xslt-2.0

我的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)"/>

2 个答案:

答案 0 :(得分:1)

我使用了一个在线xpath求值程序来计算它,我只使用了部分计数,你可以将它应用于其他人,这会找到值大于零的FSA_Dep_Contributions计数

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

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

答案 1 :(得分:1)

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

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

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

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

示例:

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

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