如何仅统计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 >
更改为 >
您的原始表达式不起作用的原因是每个表达式都返回一个布尔值。布尔值的 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 中无需将 >
转义为 >
。
我的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 >
更改为 >
您的原始表达式不起作用的原因是每个表达式都返回一个布尔值。布尔值的 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 中无需将 >
转义为 >
。