我的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)"/>
答案 0 :(得分:1)
我使用了一个在线xpath求值程序来计算它,我只使用了部分计数,你可以将它应用于其他人,这会找到值大于零的FSA_Dep_Contributions计数
count(/Report_Data/Report_Entry/PayrollResults[last()]/FSA_Dep_Contributions[number(.) > 0 ])
如果您使用的是xslt,则必须将xslt >
更改为>
答案 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中无需将>
转义为>
。